Regras personalizadas de iptables para docker usando o zabbix como exemplo

Tarefa: Feche todas as conexões de entrada, exceto os endereços IP específicos.

Há um ambiente de teste composto por linux e três janelas com endereços IP estáticos. No linux, o docker é instalado com o zabbix , redmine images. E em duas máquinas Windows, os agentes do zabbix estão instalados e configurados; no terceiro, você precisa organizar a capacidade de visualizar o zabbix. É necessário restringir outros usuários do servidor zabbix, mas não limitar o redmine.

Todos os comandos são executados como raiz.

A documentação oficial diz a regra iptables DOCKER-USER. Só é necessário alterar esta regra. Primeiro, examinamos o que são regras, focamos apenas em algumas regras.

Pode-se observar que a regra com o destino DOCKER-USER é a primeira na regra FORWARD. Portanto, você só deve alterá-lo.

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 

Na tabela de regras DOCKER, é possível ver quais portas estão abertas e os endereços IP internos dos contêineres.

 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 

Não há regras especiais na regra DOCKER-USER; a conexão inteira passa por si mesma.

 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 

Antes de tudo, trataremos da rede zabbix, a saber, estabeleceremos um nome de rede constante. Para que, quando você recrie a janela de encaixe, o nome da rede não seja alterado. No estado atual da rede, o zabbix tem uma rede chamada br-c56432fe07cc, que não é muito boa. No arquivo * .yaml, adicione uma linha responsável pelo nome da rede zbx_net_frontend: "com.docker.network.bridge.name:" docker_zabbix ".

Parte da configuração:

 networks: zbx_net_frontend: driver: bridge driver_opts: com.docker.network.enable_ipv6: "false" com.docker.network.bridge.name: "docker_zabbix" 

Depois de recriarmos a rede. Deve ser substituído pelo seu * .yaml.

 docker-compose -f docker-compose_v3_ubuntu_mysql_latest.yaml down docker-compose -f docker-compose_v3_ubuntu_mysql_latest.yaml up -d 

Nós olhamos para a regra 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 

Resta adicionar a regra à tabela DOCKER-USER. Primeiro, apresentamos a regra DROP para todas as conexões com a rede docker_zabbix a partir da interface externa (eu tenho eth0 ).

 iptables -I DOCKER-USER -i eth0 -o docker_zabbix -j DROP 

Agora todas as conexões são negadas à rede docker_zabbix. Vamos ativar a conexão para um endereço IP, mais precisamente, o pacote pode continuar mais adiante no FORWARD.

 iptables -I DOCKER-USER -i eth0 -s 192.168.43.55 -j RETURN 

A rede docker_zabbix não foi especificada explicitamente aqui. Verificamos a disponibilidade do zabbix no host 192.168.43.55 usando o 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 

A porta 8081 está aberta para o zabbix docker. Para garantir que o zabbix pertença à porta 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 

Mas lembre-se de que as regras devem especificar a porta 80, não a 8081. Se você especificar a porta 8081, o acesso ao zabbix não será aberto. Para o segundo host, o comando

 iptables -I DOCKER-USER -i eth0 -p tcp --dport 80 -s 192.168.43.10 -j RETURN 

Para o terceiro host, abra apenas a porta 10051, um agente ativo é usado nesse host.

 iptables -I DOCKER-USER -i eth0 -p tcp --dport 10051 -s 192.168.43.13 -j RETURN 

Outro problema, não podemos sair de contêineres para o mundo exterior. Os scripts de notificação não funcionam e não podem verificar a disponibilidade dos sites. Havia mais um comando para resolver conexões já existentes.

 iptables -I DOCKER-USER -i eth0 -o docker_zabbix -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 

Não esqueça que após a reinicialização do servidor, as regras criadas serão apagadas.

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


All Articles