Назад | Перейти на главную страницу

Перенаправленный порт в Docker

У меня проблемы с переадресацией портов, 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