Reglas personalizadas de iptables para docker usando zabbix como ejemplo

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.

Source: https://habr.com/ru/post/473222/


All Articles