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.
ports: - "<IP_PUBLICA>:2222:22"
iptables con la cadena DOCKER-USERufw-dockersystemctl para volver a activar la regla tras reinicioiptables en combinación con ipsetsudo 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 sudo iptables -L DOCKER-USER -n --line-numbers sudo iptables -D DOCKER-USER <número>
[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
sudo systemctl stop docker-sftp-filter.service # ejecuta ExecStop: borra la regla y el set sudo systemctl disable docker-sftp-filter.service # que no vuelva a aplicarse al arrancar
sudo iptables -I DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 2222 --ctdir ORIGINAL ! -s 88.26.243.132 -j DROP
[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
# 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
nc -zv <IP_SERVIDOR> 2221
sftp -vvv -P 2221 clienteA@<IP_SERVIDOR>
sudo ss -tlnp | grep -E '2221'