Gerenciamento de Acesso a Contêineres Docker via iptables

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_server acesse o db_server na porta 3306.
  • Restringir o acesso ao app_server apenas para o IP 10.0.0.100.
  • Deixar o web_frontend acessí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

Tags: iptables Docker segurança de rede contêineres redes Linux

Publicado em 7-19 16:18