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.