Aquesta és una revisió antiga del document —-
Docker, restricción IP
Docker manipula iptables directamente y sus reglas se evalúan antes que las de UFW. Si publicas el puerto con -p 2222:22 (o ports: «2222:22» en compose), el puerto quedará abierto a todo Internet aunque UFW diga lo contrario. La regla de arriba no restringe nada por sí sola en ese caso.
enfoques
- no es posible limitar el acceso desde docker-compose:
ports: - "<IP_PUBLICA>:2222:22"
- usar
iptablescon la cadenaDOCKER-USER - usar
ufw-docker- requiere fijar las direcciones IPs de los contenedores
- requiere añadir un servicio en
systemctlpara volver a activar la regla tras reinicio
- usar
iptablesen combinación conipset
iptables + ipset
- instalación y configuración IPSET:
sudo apt install ipset sudo ipset create sftp_allowed hash:ip sudo ipset add sftp_allowed 88.26.243.132 sudo ipset add sftp_allowed 203.0.113.10
sudo iptables -I DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL -m set ! --match-set sftp_allowed src -j DROP # añadir sudo iptables -D DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL -m set ! --match-set sftp_allowed src -j DROP # quitar
- modificación de IPs:
sudo ipset add sftp_allowed 198.51.100.7 sudo ipset del sftp_allowed 203.0.113.10 # para quitar una sudo ipset list sftp_allowed # para ver el contenido
- persistencia:
- /etc/systemd/system/docker-sftp-filter.service
[Unit] Description=Restringir puerto 2222 a IPs autorizadas After=docker.service Requires=docker.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/sbin/ipset create -exist sftp_allowed hash:ip ExecStart=/sbin/ipset add -exist sftp_allowed 88.26.243.132 ExecStart=/sbin/ipset add -exist sftp_allowed 203.0.113.10 ExecStart=/sbin/iptables -I DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL -m set ! --match-set sftp_allowed src -j DROP ExecStop=/sbin/iptables -D DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL -m set ! --match-set sftp_allowed src -j DROP ExecStop=/sbin/ipset destroy sftp_allowed [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl enable --now docker-sftp-filter.service # primera vez sudo systemctl restart docker-sftp-filter.service # modificación servicio
iptables
1 IP
sudo iptables -I DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL ! -s 88.26.243.132 -j DROP
- /etc/systemd/system/docker-sftp-filter.service
[Unit] Description=Restringir puerto 2222 a IP autorizada After=docker.service Requires=docker.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/sbin/iptables -I DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL ! -s 88.26.243.132 -j DROP ExecStop=/sbin/iptables -D DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL ! -s 88.26.243.132 -j DROP [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl enable --now docker-sftp-filter.service
+ 1 IP
# Primero el DROP general del puerto 2222 sudo iptables -I DOCKER-USER 1 -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL -j DROP # Después, por encima, cada IP autorizada sudo iptables -I DOCKER-USER 1 -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL -s 88.26.243.132 -j RETURN sudo iptables -I DOCKER-USER 1 -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL -s 203.0.113.10 -j RETURN