= Docker, restricción IP {{tag>docker}} 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: - ":2222:22" * usar ''iptables'' con la cadena ''DOCKER-USER'' * usar ''ufw-docker'' * requiere fijar las direcciones IPs de los contenedores * requiere añadir un servicio en ''systemctl'' para volver a activar la regla tras reinicio * usar ''iptables'' en combinación con ''ipset'' == iptables + ipset * IPSET: [[linux:tcpip:ipset|]] * añadir regla IPTABLES con IPSET (sftp_allowed): 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 sudo iptables -L DOCKER-USER -n --line-numbers sudo iptables -D DOCKER-USER * modificación de IPs:[[linux:tcpip:ipset|]] * persistencia: [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.targetsudo systemctl daemon-reload sudo systemctl enable --now docker-sftp-filter.service # primera vez sudo systemctl restart docker-sftp-filter.service # modificación servicio * despersistir: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 == 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 * [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 === diagnósticos nc -zv 2221 sftp -vvv -P 2221 clienteA@ sudo ss -tlnp | grep -E '2221'