Portas expostas ao Docker acessíveis de fora-regras iptables ignoradas

Eu tenho um contêiner docker funcionando como:

 docker run --name some_container_1 -p 8080:80 -d some_image

O que funciona bem. O contêiner expõe sua porta 80 a 8080 e é acessível a partir do localhost.

Por alguma razão, no entanto, está ignorando completamente as regras de iptables de entrada e também é acessível de fora.

Como posso restringir o acesso ao meu contêiner Docker para permitir apenas, ou seja, IP 123.456.789.0 para acessá-lo de externo?

Obrigado.


sudo iptables-L-n-v --line-numbers

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)num   pkts bytes target     prot opt in     out     source               destination         1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           2      365 23380 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:224        7   788 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables denied: "5        7   788 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)num   pkts bytes target     prot opt in     out     source               destination         1       24  1524 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           2        0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED3       15 13320 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           4        0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           Chain OUTPUT (policy ACCEPT 204 packets, 21792 bytes)num   pkts bytes target     prot opt in     out     source               destination         Chain DOCKER (1 references)num   pkts bytes target     prot opt in     out     source               destination         1       24  1524 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:80

sudo iptables-salvar

# Generated by iptables-save v1.4.21 on Wed Apr  8 23:37:43 2015*filter:INPUT ACCEPT [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [100:16642]:DOCKER - [0:0]-A INPUT -i lo -j ACCEPT-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7-A INPUT -j DROP-A FORWARD -o docker0 -j DOCKER-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT-A FORWARD -i docker0 ! -o docker0 -j ACCEPT-A FORWARD -i docker0 -o docker0 -j ACCEPT-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPTCOMMIT# Completed on Wed Apr  8 23:37:43 2015# Generated by iptables-save v1.4.21 on Wed Apr  8 23:37:43 2015*nat:PREROUTING ACCEPT [13:2206]:INPUT ACCEPT [1:64]:OUTPUT ACCEPT [4:268]:POSTROUTING ACCEPT [4:268]:DOCKER - [0:0]-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80COMMIT# Completed on Wed Apr  8 23:37:43 2015

docker info

Containers: 1Images: 25Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 27Execution Driver: native-0.2Kernel Version: 3.16.0-4-amd64Operating System: Debian GNU/Linux 8 (jessie)CPUs: 4Total Memory: 7.746 GiBName: nuc-001ID: WCMU:MN3T:VFKR:IU42:6423:OEI6:IB5Q:WBNV:K75H:JZDS:UWU5:57WDWARNING: No memory limit supportWARNING: No swap limit support

Internamente, o Docker está usando iptables para encaminhar conexões para o host do docker na porta 8080 para a escuta do serviço na porta 80 no contêiner. A chave em sua configuração é esta linha -

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80

Inserindo (-I) uma nova linha direta, você pode bloquear as conexões de serem encaminhadas para o IP do contêiner, neste caso 172.17.0.2. Tente esta regra -

/sbin/iptables -I FORWARD '!' -s 123.456.789.0 -d 172.17.0.2 -p tcp --dport 80 -j DROP

Você pode vincular a porta à sua máquina local. Em seguida, o docker não exporá a porta para o exterior. (iptables)

docker run -p 127.0.0.1:8080:8080 some_image

Não fui eu, mas acho que quem fez isso acha que isso é mais uma questão de serverfault do que uma questão de programação. Eles provavelmente estão certos; você pode querer migrá-lo.

Você pode mostrar a saída de ‘iptables-save’? Suspeito que a maneira como o docker faz a tradução de portas seja com uma regra iptables via MASQUERADE / NAT, mas na verdade não sei

Pode o downvoter explicar?