Acessar a UI da Web em execução no contêiner de janela de encaixe em execução no host remoto


0

Eu tenho uma instância do Amazon EC2 executando o CentOS 7 com o docker instalado. Estou executando contêineres de docker em uma rede de docker personalizada.

Estou tentando acessar uma interface da web de um desses contêineres de janela de encaixe. O comando a seguir funciona quando tento fazer isso no meu 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

No entanto, se eu apenas tentar a solução simples e fizer

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

Não funciona; provavelmente porque remote-hostnão tem acesso $my_ip.

Este artigo me trouxe mais https://dzone.com/articles/docker-x11-client-via-ssh ao explicar que, quando você usa o encaminhamento X11 com ssh, o ssh está realmente iniciando um 'proxy' na máquina remota que escuta a interface de loopback da máquina remota.

Para que eu possa executar o Firefox de dentro de um contêiner em um host remoto usando este dockerfile:

FROM centos
RUN yum install -y firefox dbus && \
    dbus-uuidgen > /var/lib/dbus/machine-id

ENTRYPOINT [ "/usr/bin/firefox" ]

e este comando docker run após a execução ssh -Y remote-host:

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

Yay! Mas não exatamente. Se eu mudar de --network hostpara --network myNetworkele não funcionará mais. Porque, como mencionado acima, o ssh está escutando na interface de loopback da máquina host, à qual o contêiner do docker não tem mais acesso.

Portanto, parece que a única maneira de fazer isso funcionar é se eu descobrir uma maneira de dizer ao ssh para se ligar a uma interface diferente de loopback ao configurar o encaminhamento do X11. Isso é possível?


Gostaria de definir GatewayPortsse sim no lado do servidor, sshd_configse isso funcionaria?
precisa saber é

Respostas:


1

Eu descobri outra maneira de realizar meu objetivo final de acessar a interface da web da web de um dos contêineres do docker. Acabei configurando um proxy SOCKS v5 sobre SSH. Isso realmente é destinado apenas para fins de desenvolvimento e depuração e não deve ser usado em uma situação de produção. Não sou responsável pelas implicações de segurança da execução do sshd como root em um contêiner de docker. Certifique-se de entender as consequências de fazer isso.

Os passos que segui estão listados abaixo. Para este exemplo, considere centosec2é meu servidor EC2 executando o CentOS, myappcontainero nome do contêiner executando o aplicativo que hospeda a interface da Web que estou tentando acessar e my-neté o nome da rede de sobreposição myappcontainerem execução.

Requisitos:

  • Navegador que pode ser configurado para conectar-se através de um proxy SOCKS v5. Sugiro o Firefox com o complemento FoxyProxy, pois facilita e desativa o proxy.
  • Imagem do Docker que pode ser executada sshd. Eu usei https://hub.docker.com/r/macropin/sshd/

Passos:

  1. Porta encaminha uma porta do seu laptop para o servidor. Neste exemplo, 8888 será a porta executando o proxy SOCKS da perspectiva do seu laptop e 9696 será a porta encaminhada no servidor.

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

  2. Em outro shell, abra uma sessão ssh regular no servidor e inicie o sshdcontêiner. Verifique se o sshdcontêiner está sendo executado na mesma rede que o contêiner que está executando a interface da web.

    [usuário @ laptop ~] $ 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. Depois que o sshdcontêiner iniciar, use o mesmo shell para ssh no sshdcontêiner e inicie um proxy SOCKS na porta que está sendo encaminhada para o seu laptop. -D 9696diz ao ssh para iniciar um servidor SOCKS na porta 9696.

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

  4. Agora, seu laptop pode acessar a rede do docker através do proxy SOCKS em execução na porta 8888. Configure o navegador de sua escolha para conectar-se à Internet através de um proxy SOCKS v5 em execução localhost:8888. Em seguida, você poderá navegar para a interface da web usando o nome do host do contêiner do dockerhttp://myappcontainer:8080

É um monte de coisas complicadas, mas foi a maneira mais fácil de descobrir como fazer isso. Espero que isso ajude outra pessoa.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.