Tarea: cierre todas las conexiones entrantes, excepto las direcciones IP específicas.
Hay un entorno de prueba que consta de Linux y tres ventanas con direcciones IP estáticas. En Linux, Docker se instala con
zabbix , redmine images. Y en dos máquinas con Windows, los agentes de zabbix están instalados y configurados, en el tercero debe organizar la capacidad de ver zabbix. Es necesario restringir a otros usuarios del servidor zabbix, pero no limitarlo de redmine.
Todos los comandos se ejecutan como root.
La documentación oficial dice la regla iptables DOCKER-USER. Solo es necesario cambiar esta regla. Primero, miramos qué son las reglas, nos enfocamos solo en algunas reglas.
Se puede ver que la regla con el DOCKER-USER objetivo es la primera en la regla ADELANTE. Por lo tanto, solo debes cambiarlo.
iptables -L FORWARD -n -v Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 421K 169M DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0 419K 167M DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
Desde la tabla de reglas DOCKER, puede ver qué puertos están abiertos y las direcciones IP internas de los contenedores.
iptables -L DOCKER -n -v Chain DOCKER (4 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- !docker_redmine docker_redmine 0.0.0.0/0 172.16.237.2 tcp dpt:3000 0 0 ACCEPT udp -- !br-c56432fe07cc br-c56432fe07cc 0.0.0.0/0 172.16.238.2 udp dpt:162 0 0 ACCEPT tcp -- !br-c56432fe07cc br-c56432fe07cc 0.0.0.0/0 172.16.238.3 tcp dpt:10051 0 0 ACCEPT tcp -- !br-c56432fe07cc br-c56432fe07cc 0.0.0.0/0 172.16.238.4 tcp dpt:443 5 248 ACCEPT tcp -- !br-c56432fe07cc br-c56432fe07cc 0.0.0.0/0 172.16.238.4 tcp dpt:80
No hay reglas especiales en la regla DOCKER-USER; toda la conexión pasa por sí misma.
iptables -L DOCKER-USER -n -v Chain DOCKER-USER (1 references) pkts bytes target prot opt in out source destination 4180 1634K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
En primer lugar, trataremos con la red zabbix, es decir, estableceremos un nombre de red constante. Para que cuando vuelva a crear docker-compose, el nombre de la red no cambie. Desde el estado actual de la red, zabbix tiene una red llamada br-c56432fe07cc, que no es muy buena. En el archivo * .yaml, agregue una línea responsable del nombre de red zbx_net_frontend: "com.docker.network.bridge.name:" docker_zabbix ".
Parte de la configuración:
networks: zbx_net_frontend: driver: bridge driver_opts: com.docker.network.enable_ipv6: "false" com.docker.network.bridge.name: "docker_zabbix"
Después de recrear la red. Debe reemplazarse con su * .yaml.
docker-compose -f docker-compose_v3_ubuntu_mysql_latest.yaml down docker-compose -f docker-compose_v3_ubuntu_mysql_latest.yaml up -d
Nos fijamos en la regla DOCKER.
iptables -L DOCKER -n -v Chain DOCKER (4 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- !docker_redmine docker_redmine 0.0.0.0/0 172.16.237.2 tcp dpt:3000 0 0 ACCEPT udp -- !docker_zabbix docker_zabbix 0.0.0.0/0 172.16.238.2 udp dpt:162 0 0 ACCEPT tcp -- !docker_zabbix docker_zabbix 0.0.0.0/0 172.16.238.3 tcp dpt:10051 0 0 ACCEPT tcp -- !docker_zabbix docker_zabbix 0.0.0.0/0 172.16.238.4 tcp dpt:443 5 252 ACCEPT tcp -- !docker_zabbix docker_zabbix 0.0.0.0/0 172.16.238.4 tcp dpt:80
Queda por agregar la regla a la tabla DOCKER-USER. En primer lugar, presentamos la regla DROP para todas las conexiones a la red docker_zabbix desde la interfaz externa (tengo
eth0 ).
iptables -I DOCKER-USER -i eth0 -o docker_zabbix -j DROP
Ahora se niegan todas las conexiones a la red docker_zabbix. Habilitemos la conexión para una dirección IP, más precisamente, el paquete puede continuar más adelante HACIA ADELANTE.
iptables -I DOCKER-USER -i eth0 -s 192.168.43.55 -j RETURN
La red docker_zabbix no se especificó explícitamente aquí. Verificamos la disponibilidad de zabbix desde el host 192.168.43.55 usando powershell.
tnc 192.168.43.136 -port 8081 ComputerName : 192.168.43.136 RemoteAddress : 192.168.43.136 RemotePort : 8081 InterfaceAlias : vEthernet (Swich_in) SourceAddress : 192.168.43.55 TcpTestSucceeded : True
El puerto 8081 está abierto para zabbix docker. Para asegurarse de que zabbix pertenece al puerto 8081.
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c047f18a4445 zabbix/zabbix-web-nginx-mysql:ubuntu-4.2-latest "docker-entrypoint.sh" About an hour ago Up About an hour (healthy) 0.0.0.0:8081->80/tcp, 127.0.0.1:8443->443/tcp zabbix_zabbix-web-nginx-mysql_1
Pero tenga en cuenta que las reglas deben especificar el puerto 80, no el 8081. Si especifica el puerto 8081, no se abrirá el acceso a zabbix. Para el segundo host, el comando.
iptables -I DOCKER-USER -i eth0 -p tcp --dport 80 -s 192.168.43.10 -j RETURN
Para el tercer host, abra solo el puerto 10051, se utiliza un agente activo en este host.
iptables -I DOCKER-USER -i eth0 -p tcp --dport 10051 -s 192.168.43.13 -j RETURN
Otro problema, no podemos salir de los contenedores al mundo exterior. Los scripts de notificación no funcionan y no pueden verificar la disponibilidad de los sitios. Había un comando más para resolver las conexiones ya existentes.
iptables -I DOCKER-USER -i eth0 -o docker_zabbix -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
No olvide que después de reiniciar el servidor, las reglas creadas se borran.