
Tengo un problema donde los puertos expuestos a aplicaciones que se ejecutan en nuestro sistema en contenedores Docker permanecen abiertos al mundo a pesar de la configuración de iptables diseñada para restringir el acceso.
Me parece que el problema puede estar relacionado con el demonio acoplable que agrega reglas a iptables al inicio. También conozco las banderas --icc=true|false
, --ip-forward=true|false
pero --iptables=true|false
no estoy seguro de qué combinación de estas banderas debería aplicar. Lo he probado --icc=false
y --ip-forward=false
ninguno ha tenido el efecto deseado. Detesto usarlo --iptables=false
porque el demonio acoplable claramente agrega una serie de reglas, que tendría que configurar manualmente si aún son necesarias.
Este es el estado de las reglas antes de que se inicie el demonio acoplable:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 REJECT all -- !lo any anywhere loopback/8 reject-with icmp-port-unreachable
0 0 DROP tcp -- any any anywhere anywhere tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
0 0 DROP all -f any any anywhere anywhere
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
82 8831 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
0 0 ACCEPT tcp -- any any anywhere anywhere multiport dports ssh
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 1> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 2> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
0 0 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
24 2489 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
77 10080 ACCEPT all -- any any anywhere anywhere
Y esto es lo que ocurre con el demonio acoplable ejecutándose:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 REJECT all -- !lo any anywhere loopback/8 reject-with icmp-port-unreachable
0 0 DROP tcp -- any any anywhere anywhere tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
0 0 DROP all -f any any anywhere anywhere
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
1335 230K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
1 32 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
7 380 ACCEPT tcp -- any any anywhere anywhere multiport dports ssh
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 1> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 2> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
35 2016 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
62 3672 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
54492 21M DOCKER all -- any docker0 anywhere anywhere
51882 20M ACCEPT all -- any docker0 anywhere anywhere ctstate RELATED,ESTABLISHED
58371 9122K ACCEPT all -- docker0 !docker0 anywhere anywhere
0 0 DROP all -- docker0 docker0 anywhere anywhere
1186 121K REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2090 263K ACCEPT all -- any any anywhere anywhere
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
86 7048 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:7990
1639 395K ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:7999
791 151K ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.3 tcp dpt:http-alt
20 1898 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.4 tcp dpt:8090
49 4561 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.5 tcp dpt:18080
25 3642 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.6 tcp dpt:8095
También hay una serie de reglas POSTROUTING & MASQUERADE, que no se muestran con iptables -L
, solo cuando usas iptables-save
. Tampoco estoy seguro del significado de estos.
Sospecho que la regla de destino DOCKER en la cadena FORWARD es la fuente del problema, pero no veo cómo resolverlo porque parece que el demonio acoplable la inserta al comienzo de la cadena.
Entonces, ¿alguien puede aconsejarme qué debo hacer para asegurarme de que los puertos 7990, 8090, etc. no estén expuestos al mundo cuando ejecuto Docker?
Gracias
Ricardo
Respuesta1
La DOCKER
cadena es una cadena personalizada definida en la cadena FORWARD. Cuando un paquete llega a any
la interfaz y está vinculado a la interfaz del puente docker0, se envía a la cadena DOCKER personalizada.
paquetes bytes destino prot optar por salir origen destino 54492 21M DOCKER todos - cualquier docker0 en cualquier lugar
Ahora la cadena DOCKER tomará todos los paquetes entrantes, excepto los que provienen de docker0, y los enviará a una IP y puerto de contenedor (172.xxx), en este caso digamos 7990.
paquetes bytes destino prot optar por salir origen destino 86 7048 ACEPTAR tcp -- !docker0 docker0 en cualquier lugar 172.17.0.2 tcp dpt:7990
Si publicara el resultado de iptables -t nat -L -n
, vería la DNAT
regla que reenvía el puerto del host al contenedor, por ejemplo, los paquetes que lleguen a la interfaz del host en 49154 se reenviarán al puerto IP 172.17.0.2 y al puerto 7990 del contenedor.
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 a:172.17.0.2:7990
Puede impedir que los paquetes lleguen al contenedor limitando la IP de origen de cualquier 0.0.0.0 para permitir solo los paquetes que se originan en su red interna, por ejemplo. Para permitir conexiones al puerto de contenedor 7990 solo desde su red interna, digamos 192.168.1.0/24, puede ejecutar el siguiente comando:
/sbin/iptables -ADELANTE '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j SOLTAR
Esto evitaría el reenvío de paquetes a un contenedor de la IP:Puerto especificada, a menos que provengan de la red interna. Puede modificar la IP y el puerto de origen/destino según su configuración.
Respuesta2
Entonces, esto sería un comentario, pero no un representante de stree... serverfault para ello.
¿Has probado la solución publicada aquí?http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker
de usar esta bandera --iptables=false
como tal DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"
?