Introdução ao iptables e Docker
Em ambientes Linux, o Docker manipula regras do iptables para garantir isolamento de rede. De acordo com a documentação oficial, modificações diretas nas regras inseridas pelo Docker não são recomendadas, mas para implementar políticas de segurança customizadas, é possível utilizar a cadeia DOCKER-USER. Esta cadeia é avaliada antes das regras automáticas do Docker, permitindo controle granular sobre o tráfego destinado aos contêineres.
Configuração Básica do iptables para Docker
Ao inspecionar as regras atuais do iptables, a cadeia DOCKER-USER geralmente contém uma regra padrão de RETURN. Para restringir o acesso, é necessário adicionar regras específicas nessa cadeia.
# Visualizar regras da cadeia DOCKER-USER
iptables -L DOCKER-USER -n -v
Exemplo: Bloqueio Total e Liberação Seletiva
Inicialmente, bloqueia-se todo o tráfego externo via interface ens33 e, em seguida, permite apenas endereços IP específicos em determinadas portas.
# Bloquear todo acesso externo via interface ens33
iptables -I DOCKER-USER -i ens33 -j REJECT
# Criar um contêiner Nginx mapeando porta 8080
docker run -d --name web_server -p 8080:80 nginx:alpine
# Permitir que o IP 10.0.0.50 acesse a porta 8080
iptables -I DOCKER-USER 1 -i ens33 -s 10.0.0.50 -p tcp --dport 8080 -j ACCEPT
Após a configuração, o acesso de 10.0.0.50 será permitido, enquanto outros IPs serão rejeitados.
Regras Avançadas para Controle de Intervalos
Para permitir acesso a múltiplos IPs e portas, utilize os módulos iprange e multiport:
# Permitir intervalo de IPs (10.0.0.1-10.0.0.10) em portas 80-90 e 8080-9090
iptables -I DOCKER-USER -i ens33 -m iprange --src-range 10.0.0.1-10.0.0.10 -m multiport -p tcp --dport 80:90,8080:9090 -j ACCEPT
Caso Prático 1: Restrição por Serviço
Considere um ambiente com três contêineres: db_server (MySQL), app_server (Tomcat) e web_frontend (Nginx). O objetivo é:
- Permitir que apenas
app_serveracesse odb_serverna porta 3306. - Restringir o acesso ao
app_serverapenas para o IP 10.0.0.100. - Deixar o
web_frontendacessível publicamente.
Configuração de Redes Docker com IPs Fixos
Ao usar docker-compose, defina IPs estáticos na rede app_net:
# trecho do docker-compose.yml
version: '3'
services:
db_server:
image: mysql:8.0
networks:
app_net:
ipv4_address: 172.20.0.2
app_server:
image: tomcat:9.0
networks:
app_net:
ipv4_address: 172.20.0.3
web_frontend:
image: nginx:latest
ports:
- "80:80"
networks:
- app_net
networks:
app_net:
ipam:
config:
- subnet: 172.20.0.0/24
Definição das Regras de iptables
# Regra 1: Apenas app_server (172.20.0.3) pode acessar db_server (172.20.0.2) na porta 3306
iptables -I DOCKER-USER ! -s 172.20.0.3 -d 172.20.0.2 -p tcp --dport 3306 -j REJECT
# Regra 2: Apenas IP externo 10.0.0.100 pode acessar app_server (172.20.0.3) na porta 8080
iptables -I DOCKER-USER ! -s 10.0.0.100 -d 172.20.0.3 -p tcp --dport 8080 -j REJECT
Validação
Teste a conectividade entre contêineres e a partir de hosts externos para confirmar que as restrições estão ativas.
Caso Prático 2: Controle de Portas a Nível de Servidor
Em servidores onde contêineres são expostos, pode-se limitar portas específicas usando DOCKER-USER, enquanto regras do INPUT protegem serviços nativos como SSH.
Exemplo: Restringir Portas do Servidor
# Permitir apenas SSH (porta 22) na cadeia INPUT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
# No DOCKER-USER, bloquear todo tráfego via interface eth0
iptables -I DOCKER-USER -i eth0 -j REJECT
# Liberar portas de contêineres específicas (80, 443, 3306)
iptables -I DOCKER-USER -i eth0 -m multiport -p tcp --dport 80,443,3306 -j ACCEPT
Verificação de Comportamento
Note que a cadeia DOCKER-USER afeta apenas as portas mapeadas dentro dos contêineres, não as portas do host. Para controlar portas do host, use a cadeia INPUT.
# Exemplo: Contêiner com porta mapeada 9090:80 não será restrito por DOCKER-USER
docker run -d -p 9090:80 nginx:alpine
# Para restringir acesso à porta 9090, adicione regra na cadeia INPUT