A ordem de processamento das regras no iptables é de cima para baixo? Dado o seguinte exemplo:
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- anywhere anywhere
DNAT tcp -- anywhere anywhere tcp dpt:5000 to:172.19.0.2:5000
A segunda regra (DNAT) nunca deve ser processada, pois a primeira regra (RETURN) corresponderá a cada pacote e, como essa regra tem um destino, que é uma ação de finalização (RETURN), as regras subseqüentes serão ignoradas, levando-o a pular para a próxima regra da cadeia anterior.
Mas isso está funcionando. Eu sou capaz de se conectar ao host na porta 5000, que então DNATs para o recipiente 172.19.0.2:5000. Como? Pelo que entendi, isso não deve funcionar, já que a regra DNAT nunca deve ser invocada, pois todos os pacotes corresponderão à primeira regra.
Aqui está a% completa da saídaiptables-save -c
:
# Generated by iptables-save v1.6.1 on Tue Sep 4 07:46:28 2018
*mangle
:PREROUTING ACCEPT [223887:255226234]
:INPUT ACCEPT [222119:254095862]
:FORWARD ACCEPT [1246:1112414]
:OUTPUT ACCEPT [146355:28000095]
:POSTROUTING ACCEPT [149233:29175672]
COMMIT
# Completed on Tue Sep 4 07:46:28 2018
# Generated by iptables-save v1.6.1 on Tue Sep 4 07:46:28 2018
*nat
:PREROUTING ACCEPT [98:6639]
:INPUT ACCEPT [19:3259]
:OUTPUT ACCEPT [1784:495831]
:POSTROUTING ACCEPT [1784:495887]
:DOCKER - [0:0]
[3:687] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
[11:660] -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
[12:684] -A POSTROUTING -s 172.19.0.0/24 ! -o docker0 -j MASQUERADE
[0:0] -A POSTROUTING -s 172.19.0.2/32 -d 172.19.0.2/32 -p tcp -m tcp --dport 5000 -j MASQUERADE
[0:0] -A DOCKER -i docker0 -j RETURN
[0:0] -A DOCKER ! -i docker0 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.19.0.2:5000
[2:120] -A DOCKER ! -i docker0 -p tcp -m tcp --dport 5001 -j DNAT --to-destination 172.19.0.2:5001
COMMIT
# Completed on Tue Sep 4 07:46:28 2018
# Generated by iptables-save v1.6.1 on Tue Sep 4 07:46:28 2018
*filter
:INPUT ACCEPT [222119:254095862]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [146355:28000095]
:DOCKER - [0:0]
:DOCKER-ISOLATION - [0:0]
:DOCKER-USER - [0:0]
[1246:1112414] -A FORWARD -j DOCKER-USER
[1246:1112414] -A FORWARD -j DOCKER-ISOLATION
[618:1075408] -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[0:0] -A FORWARD -o docker0 -j DOCKER
[628:37006] -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
[0:0] -A FORWARD -i docker0 -o docker0 -j ACCEPT
[0:0] -A DOCKER -d 172.19.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5000 -j ACCEPT
[1246:1112414] -A DOCKER-ISOLATION -j RETURN
[1246:1112414] -A DOCKER-USER -j RETURN
COMMIT
# Completed on Tue Sep 4 07:46:28 2018
Tags networking iptables nat tcp