доступ к ssh туннелю хоста из контейнера docker



Используя ubuntu tusty, есть служба, работающая на удаленной машине, к которой я могу получить доступ через переадресацию портов через ssh-туннель из localhost:9999.



У меня работает контейнер docker. Мне нужно получить доступ к этой удаленной службе через туннель хоста, из контейнера.



Я попытался туннелировать от контейнера к хосту с помощью -L 9000:host-ip:9999, а затем получить доступ к сервису через 127.0.0.1:9000 из контейнера не удается подключиться. Чтобы проверить, включено ли отображение порта, я пытался

nc -luv -p 9999 # at host
nc -luv -p 9000 # at container



Следуя этому, Параг. 2 но не было никакой воспринятой коммуникации, даже при выполнении

nc -luv host-ip -p 9000
в контейнере



Я также попытался сопоставить порты через docker run -p 9999:9000, но это сообщает, что привязка не удалась, потому что порт хоста уже используется (из туннеля хоста на удаленную машину, предположительно).



Итак, мои вопросы



1-Как я достигну соединения? Нужно ли мне настроить ssh-туннель к хосту, или это может быть достигнуто с помощью докер порт картографирование в одиночку?



2-Как быстро проверить, что соединение установлено? Предпочтительно через Баш.



Спасибо.

883   2  

2 ответов:

Я думаю, что вы можете сделать это, добавив --net=host к вашему запуску docker. Но Смотрите также этот вопрос: перенаправить порт хоста в контейнер docker

Использование сети хостов в качестве сети для ваших контейнеров через --net=host или в docker-compose через network_mode: host является одним из вариантов, но это имеет, возможно, нежелательный побочный эффект, что (а) вы теперь открываете порты ваших контейнеров в вашей хост-системе и (б) вы больше не можете подключиться к тем контейнерам, которые не сопоставлены с вашей хост-сетью.

На мой взгляд, быстрое и более чистое решение в вашем случае-это сделать ваш ssh – туннель доступным для вашей хост-системы, или, точнее говоря, для вашего компьютера. ваш мост docker0 - вместо того, чтобы выставлять ваши контейнеры docker в вашей среде хоста (как предложено в принятом ответе).

Чтобы это сработало, извлеките ip, который использует ваш мост docker0 через:

ifconfig

Вы увидите примерно следующее:

docker0   Link encap:Ethernet  HWaddr 03:41:4a:26:b7:31  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

Теперь вам нужно сказать ssh привязаться к этому ip , чтобы слушать трафик, направленный к порту 9000 через

ssh -L 172.17.0.1:9000:host-ip:9999

Без установки bind_address, :9000 будет ли доступен только к интерфейсу loopback вашего хоста, а не непосредственно к вашим контейнерам docker.

Наконец, в вашем контейнерном приложении используйте тот же самый docker0 ip для соединения с сервером: 172.17.0.1:9000. Например, если у вас есть ...DOT.NET ядро "приложения, которое должно подключиться к удаленной БД, расположенной по адресу :9000, ваша "ConnectionString" будет содержать "server=172.17.0.1,9000;.

Теперь трафик, направляемый через ваш docker0 мост, также достигнет вашего ssh-туннеля:)

Примечание сбоку: вы также можете привязать свой туннель к 0.0.0.0, который заставит ssh слушать все интерфейсы.

Comments

    Ничего не найдено.