Доступ к веб-интерфейсу пользователя, запущенному в док-контейнере на удаленном хосте

864
FGreg

У меня есть экземпляр Amazon EC2 под управлением CentOS 7 с установленным докером. Я использую Docker-контейнеры в пользовательской Docker-сети.

Я пытаюсь получить доступ к веб-интерфейсу из одного из этих контейнеров Docker. Следующая команда работает, когда я пытаюсь сделать это на моем Mac:

xhost + $my_ip docker run -d --rm --name firefox --network myNetwork -e DISPLAY=$my_ip:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox 

Однако, если я просто попробую простое решение и сделаю

ssh -Y remote-host docker run -d --rm --name firefox --network myNetwork -e DISPLAY=$my_ip:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox 

Это не работает; скорее всего потому remote-hostчто не имеет доступа к $my_ip.

Эта статья дала мне дальнейшие https://dzone.com/articles/docker-x11-client-via-ssh объяснения, что когда вы используете пересылку X11 с ssh, ssh фактически запускает «прокси» на удаленной машине, которая прослушивает интерфейс обратной связи удаленного компьютера.

Так что я могу запустить Firefox из контейнера на удаленном хосте, используя этот dockerfile:

FROM centos RUN yum install -y firefox dbus && \ dbus-uuidgen > /var/lib/dbus/machine-id  ENTRYPOINT [ "/usr/bin/firefox" ] 

и эта команда запуска docker после запуска ssh -Y remote-host:

docker run --network host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" firefox 

Ура! Но не совсем. Если я не изменюсь от --network hostк --network myNetworkней больше не работает. Потому что, как указано выше, ssh прослушивает интерфейс обратной связи хост-машины, к которой контейнер докеров больше не имеет доступа.

Таким образом, похоже, что единственный способ заставить это работать - это найти какой-то способ сказать ssh привязку к интерфейсу, отличному от loopback, при настройке пересылки X11. Это возможно?

0
Интересно, если бы я установил для GatewayPorts значение yes на стороне сервера sshd_config, сработало бы это? FGreg 7 лет назад 0

1 ответ на вопрос

1
FGreg

Я нашел другой способ достичь своей конечной цели - получить доступ к веб-интерфейсу одного из контейнеров Docker. Я закончил настройкой SOCKS v5 прокси через SSH. Это действительно предназначено только для целей разработки и отладки и не должно использоваться в производственной ситуации. Я не несу ответственности за последствия безопасности запуска sshd от имени пользователя root в контейнере Docker. Убедитесь, что вы понимаете последствия этого.

Шаги, которые я предпринял, перечислены ниже. В этом примере рассмотрим, centosec2является ли мой сервер EC2 под управлением CentOS, myappcontainerэто имя контейнера, на котором выполняется приложение, в котором размещен веб-интерфейс, к my-netкоторому я пытаюсь получить доступ, и имя оверлейной сети, в myappcontainerкоторой выполняется.

Требования:

  • Браузер, который можно настроить для подключения через прокси-сервер SOCKS v5. Я предлагаю Firefox с надстройкой FoxyProxy, потому что он делает включение и отключение прокси очень простым.
  • Образ Docker, который может работать sshd. Я использовал https://hub.docker.com/r/macropin/sshd/

шаги:

  1. Порт перенаправить порт с вашего ноутбука на сервер. В этом примере 8888 будет портом, на котором работает прокси-сервер SOCKS с точки зрения вашего ноутбука, а 9696 будет перенаправленным портом на сервере.

    [user@laptop ~]$ ssh -L 8888:localhost:9696 centosec2 -N

  2. В другой оболочке откройте обычный сеанс ssh с сервером, а затем запустите sshdконтейнер. Убедитесь, что sshdконтейнер работает в той же сети, что и контейнер с веб-интерфейсом пользователя.

    [пользователь @ ноутбук ~] $ ssh centosec2 [user @ centosec2 ~] $ docker run --rm -d -p 2222: 22 --network my-net -v .ssh / id_rsa.pub: /root/.ssh/authorized_keys macropin / sshd 
  3. Как только sshdконтейнер запустится, используйте ту же оболочку, чтобы ssh войти в sshdконтейнер и запустить прокси-сервер SOCKS на порту, перенаправляемом на ваш ноутбук. -D 9696говорит ssh запустить сервер SOCKS на порту 9696.

    [user@centosec2 ~]$ ssh -D 9696 -p 2222 root@localhost -N

  4. Теперь ваш ноутбук может получить доступ к сети докеров через прокси-сервер SOCKS, работающий через порт 8888. Настройте свой браузер для подключения к Интернету через прокси-сервер SOCKS v5, работающий на нем localhost:8888. После этого вы сможете перейти к веб-интерфейсу, используя имя хоста контейнера Docker.http://myappcontainer:8080

Это много прыжков, но это был самый простой способ понять, как это сделать. Надеюсь, это поможет кому-то еще.

Похожие вопросы