Как туннелировать TCP-трафик через ssh из док-контейнера? - PullRequest
0 голосов
/ 04 сентября 2018

Вот моя ситуация: У меня есть приложение, работающее локально дома в контейнере докера, основанное на lambci / lambda: build-nodejs8.10. Приложение отправляет запросы https на удаленный сервер по двум URL-адресам. Однако удаленный сервер принимает запросы только с IP-адресов, поступающих из моей офисной сети. Я могу использовать VPN для подключения к офисной сети, но он не настроен, чтобы дать мне маршрут к Интернету только для доступа к машинам в сети. Что я могу сделать, так это подключить ssh к компьютерам в офисной сети, которые имеют доступ к Интернету.

Попытки решения и предыдущего решения: Прежде чем мне нужно было отправлять запросы только на один URL, скажем, remote1.com. Я решил это путем переадресации портов через ssh, вот так:

  1. Подключение к VPN на моей локальной машине
  2. Запуск док-контейнера в интерактивном режиме с помощью оболочки bash
  3. перенаправить трафик для remote1.com на localhost:

    echo "127.0.0.1 remote1.com" >> /etc/hosts

  4. пересылать трафик на 127.0.0.1:443 на office.machine.com через ssh:

    ssh user@office.machine.com -L 443:remote1.com:443

  5. Подключитесь к док-контейнеру с нового терминала и запустите приложение.

Это очень хорошо работает только для одного удаленного URL. Попытка выполнить шаги 2-4 дважды не будет работать, поскольку порт уже перенаправлен.

Я пытался запустить sshuttle на док-контейнере. Установка работает нормально (через клонирование git repo):

git clone https://github.com/sshuttle/sshuttle.git
cd sshuttle
sudo ./setup.py install

но его запуск приводит к следующей ошибке:

iptables v1.4.18: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
firewall manager: undoing changes.
firewall manager: undoing IPv4 changes.
iptables v1.4.18: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
firewall manager: Error trying to undo IPv4 firewall.
firewall manager: ---> Traceback (most recent call last):
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/firewall.py", line 270, in main
firewall manager: --->     method.restore_firewall(port_v4, socket.AF_INET, udp, user)
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/methods/nat.py", line 99, in restore_firewall
firewall manager: --->     if ipt_chain_exists(family, table, chain):
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/linux.py", line 33, in ipt_chain_exists
firewall manager: --->     raise Fatal('%r returned %d' % (argv, rv))
firewall manager: ---> Fatal: ['iptables', '-t', 'nat', '-nL'] returned 3
firewall manager: undoing /etc/hosts changes.
firewall manager: Error trying to undo /etc/hosts changes.
firewall manager: ---> Traceback (most recent call last):
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/firewall.py", line 282, in main
firewall manager: --->     restore_etc_hosts(port_v6 or port_v4)
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/firewall.py", line 51, in restore_etc_hosts
firewall manager: --->     rewrite_etc_hosts({}, port)
firewall manager: --->   File "/usr/local/lib/python2.7/site-packages/sshuttle-0.78.5.dev10+g561b648-py2.7.egg/sshuttle/firewall.py", line 30, in rewrite_etc_hosts
firewall manager: --->     os.link(HOSTSFILE, BAKFILE)
firewall manager: ---> OSError: [Errno 18] Invalid cross-device link
fatal: ['iptables', '-t', 'nat', '-nL'] returned 3
c : fatal: cleanup: ['/usr/bin/python', '/usr/local/bin/sshuttle', '-v', '-v', '--method', 'auto', '--firewall'] returned 99
 s:   Ready: 1 r=[4] w=[] x=[]

Что я могу и не могу сделать:

Can:

  • Установка программного обеспечения и изменение конфигурации на моем локальном ПК (Win / Ubuntu)
  • Установить программное обеспечение на образе docker (хотя не все пакеты доступны по умолчанию)

Не могу:

  • Изменение конфигурации или установка программного обеспечения на удаленном или офисном сервере

Есть ли способ запустить весь (или весь HTTPS-запрос к двум конкретным URL-адресам) TCP-трафик из приложения, запущенного в док-контейнере, через офисный компьютер через ssh?

1 Ответ

0 голосов
/ 22 марта 2019

Может быть прокси-цепочки могут вам помочь.

Сначала измените команду ssh, чтобы открыть прокси socks на порту 9050:

ssh user@office.machine.com -D 9050

Затем настройте свой образ докера для запуска узла следующим образом:

proxychains node --node_parameters

Это приведет к тому, что все запросы, сделанные из приложения узла, будут проходить через прокси-сервер socks, расположенный по адресу localhost: 9050.

...