Como obter o verdadeiro IP do cliente para um serviço em execução dentro da janela de encaixe

5

Meu cenário: Gostaria de ter meus serviços baseados em docker que sabem o que o IP está chamando da web (um requisito do meu aplicativo).

Eu estou rodando em um VPS em nuvem, debian jessie, com o docker 1.12.2.

Eu uso nc no modo detalhado para abrir a porta 8080 .

docker run --rm -p "8080:8080" centos bash -c "yum install -y nc && nc -vv -kl -p 8080"

Digamos que o VPS tenha o domínio example.com e da minha outra máquina, que digamos que tenha o IP dead:::::beef que eu chamo

nc example.com 8080

O servidor diz:

Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8080
Ncat: Listening on 0.0.0.0:8080
Ncat: Connection from 172.17.0.1.
Ncat: Connection from 172.17.0.1:49799.

172.17.0.1 está na rede local do servidor e não tem nada a ver com meu cliente, é claro. Na verdade:

docker0   Link encap:Ethernet  HWaddr ....
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0

Se eu iniciar o contêiner no modo de rede do host

docker run --rm --net=host -p "8080:8080" centos bash -c "yum install -y nc && nc -vv -kl -p 8080"

e chame meu servidor novamente

nc example.com 8080

Eu obtenho o resultado esperado:

Ncat: Connection from dead:::::beef.
Ncat: Connection from dead:::::beef:55650.

Minhas perguntas são:

  • Por que o docker "mascara" ips quando não está no modo de rede do host? Acredito que o processo do daemon do docker provavelmente é aquele que abre a porta, recebe a conexão e a retransmite para o processo do contêiner usando sua própria conexão de interface de rede virtual interna. O nc em execução no contêiner só vê que a chamada vem do IP do daemon do docker.
  • (Como) posso ter meu serviço docker saber sobre IPs externos chamando-o sem colocar tudo no modo host?
por Aleksandar Dimitrov 04.11.2016 / 21:29

0 respostas