У меня проблемы с переадресацией портов, LocalForward
в контейнер через SSH-туннель.
Вся сеть выглядит так:
Это мое Dockerfile
для GW Container
:
FROM ubuntu:latest
RUN apt-get update \
&& apt-get install -y ssh \
&& apt-get clean
EXPOSE 80
COPY config /root/.ssh/config
ENTRYPOINT ["ssh", "app-server", "sleep infinity & wait"]
Связанный ssh config
файл:
Host vpn-gateway
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
Hostname 10.20.30.40
User matrix
Host app-server
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
Hostname 20.30.40.50
User matrix
ProxyCommand ssh vpn-gateway nc %h %p %r
LocalForward 80 30.40.50.60:1080
Теперь я использую docker-compose
для оркестровки контейнеров со следующими docker-compose.yml
файл:
version: "3.2"
services:
gateway:
container_name: gateway
image: gateway
build: ./docker/gateway
volumes:
- ~/.ssh/id_rsa:/root/.ssh/id_rsa
- ~/.ssh/id_rsa.pub:/root/.ssh/id_rsa.pub
ports:
- 8080:80
Итак, идея в том, что если я запускаю wget с localhost: wget http://127.0.0.1:8080/api/health
Я получу ответ от API Server
машина (30.40.50.60:1080
). Проблема в том, что меня сбрасывают:
--2018-06-25 07:19:26-- http://127.0.0.1:8080/api/health
Connecting to 127.0.0.1:8080... connected.
HTTP request sent, awaiting response... Read error (Connection reset by peer) in headers.
Retrying.
--2018-06-25 07:19:27-- (try: 2) http://127.0.0.1:8080/api/health
Connecting to 127.0.0.1:8080... connected.
HTTP request sent, awaiting response... Read error (Connection reset by peer) in headers.
Retrying.
Это может быть вызвано тем, что Docker не видит ни одного приложения, использующего порт 80 на GW Container
как упоминалось здесь: https://serverfault.com/a/769583/292211
Если я exec
к GW Container
и беги wget http://127.0.0.1:80/api/health
Я получаю правильный ответ.
Есть ли способ обмануть докера, чтобы он думал, что порт 80 доступен в GW Container
чтобы я мог перенаправить порт на хост? Или можно было бы справиться с любой из этих вещей лучше? Всякая неразбериха с туннелями SSH происходит из-за ограничений безопасности третьих лиц.
Спасибо!
Я подозреваю, что проблема в том, что адрес привязки LocalForward по умолчанию - localhost.
Чтобы принять произвольные внешние соединения, вы можете попробовать:
Host app-server
LocalForward 0.0.0.0:80 30.40.50.60:1080