SSH зворотний тунель у контейнер Docker


4

Мені потрібно xdebug щось, що виходить з ладу на сервері в контейнері docker, і зі свого ноутбука я пробіг ssh -R 9000:localhost:9000 serverі перевірив тунель telnet localhost 9000. Поки що добре, я отримав зв’язок.

Тепер на сервері я це зробив

iptables -t nat -I PREROUTING -p tcp -d 172.17.42.1 --dport 9000 -j DNAT --to 127.0.0.1:9000 

Нарешті я вчинив проблемний екземпляр докера і побіг

docker run  --net=host -t  -i snapshot /bin/bash

Всередині контейнера telnet 172.17.42.1 9000відмовляється від з'єднання.


Я доволі незрозумілий щодо докера і досить незрозумілий про iptables на цьому рівні, тож вибачте мене, якщо це питання не має сенсу, але, можливо, оскільки ви запустили команду iptables поза контейнером, всередині не розпізнається, що робити, якщо ви запустите команду команда iptables всередині контейнера?
барлоп

і чи можете ви вирішити неполадки, щоб виділити, де проблема. У вас є 3 досить задіяні команди. Ssh -R, iptables з PREROUTING і DNAT, і docker. Без сумніву, тримайте докер. Що робити, якщо ви спробуєте nc -l -p 1234 (або будь-який синтаксис nc для того, щоб його прослухали на порту), і пропустіть iptables, зробіть docker і в контейнері зробіть telnet 127.0.0.1:1234 і подивіться, чи це працює. Якщо це не вдається, то у вас є простіша демонстрація проблеми - це допомагає. Якщо це спрацьовує, то спробуйте створити його до тих пір, поки це не вдасться, і це дасть краще уявлення про причину.
барлоп

Частина ssh -R працює, і telnet, і lsof це показує.
chx

Відповіді:


4

Я зіткнувся з цим самим випуском, за винятком того, що у мене було два контейнери, з'єднані з --link, тому --net = хост не працював для цього situtaiton.

Виконуючи порт ssh вперед до віддаленого хоста ssh -R 9000:localhost:9000 server, lsof -P -i -nможе бути показано, що порт пов'язаний з пристроєм зворотного зв’язку серверів , який виглядає приблизно так:

sshd 39172 ubuntu 9u IPv4 2941407 0t0 TCP ::1:9000 (LISTEN)

Цей інтерфейс зворотного зв'язку не доступний для мережі всередині контейнера докера. Я усунув це, додавши GatewayPorts yesдо файлу sshd_config на сервері та перезапустивши sshd.

Потім пересланий порт 9000 прив'язується до звичайного інтерфейсу і доступний зсередини докерного контейнера. (і з будь-якого іншого господаря з цього питання).


0

Коментар @barlop виявився дуже корисним. Я видалив правило iptables, потім я спробував запустити, nc -l -p 1234а потім nc -l 127.0.0.1 -p 1234і потім в контейнері я спробував, telnet localhost 1234і воно спрацювало. Тому я спробував, telnet localhost 9000і це теж спрацювало! Я думаю, що раніше не було, але, здається, це є і зараз. Отже: немає необхідності в будь-яких правилах iptables, він просто працює --net=host. Однак, lsof -i: 9000 все ще нічого не відображає, і можливо, я тестував це лише раніше.

Редагувати: netstat -anl |grep :9000у контейнері відображається відкритий порт як СПИСОК. lsof ні. Дивно.


Я трохи знайомий з netstat, який я розумію, охоплює частину функціональності lsof. якщо у вас є netstat -apn (or whatever the switches are) | grep :9000(у мене немає виходу неттостату перед собою, але, мабуть, це був би правильний показник), ви говорите, що порт 9000 не відображається відкритим, але ви можете підключитися до порту 9000? Чи знаходиться сервер / порт прослуховування всередині контейнера? поза контейнером? або обидва? А ви працюєте lsof або netstat всередині контейнера? або поза контейнером? або обидва? а ти намагаєшся телефонувати зсередини чи ззовні? btw nc може робити telnet nc server port.
барлоп

nc -l -pбув запущений поза контейнера, щоб імітувати / виключати SSH як винуватця. telnetзапускали всередину контейнера, щоб перевірити наявність з'єднання.
chx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.