Como configurar o iptables tanto para o mascaramento de IP quanto para o firewall ao mesmo tempo?

0

Eu tenho um host que atua como um gateway para rotear uma rede doméstica para a Internet. O IP Masquerading foi ativado há meses e o sistema funcionou bem.

Como faço para configurá-lo para funcionar também como um firewall? Quaisquer condições que eu coloquei no tráfego na corrente FORWARD simplesmente não funcionam.

Por exemplo

-A FORWARD -i eth1 -p tcp -j ACCEPT

Apenas ignora todo o tráfego TCP do roteamento, em vez de apenas restringi-lo ao tráfego originado da eth1. Também ...

 -A FORWARD -s 192.168.2.0/24 -p tcp -j ACCEPT

... não permite apenas o tráfego TCP da sub-rede 192.168.2.0, no momento em que aplico a regra, todo o tráfego TCP pára de rotear.

Eu não consegui encontrar nenhuma documentação clara sobre o massacre de pacotes com mascarada, ou sobre como abandonar o mascarado e usar o SNAT.

  • eth0 é a interface externa, na mesma sub-rede que o roteador DSL
  • eth1 é interface interna, com todos os meus hosts funcionando bem no DHCP

Como eu configuro o iptables para fazer o mascaramento de IP e o firewall?

# Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015
*nat
:PREROUTING ACCEPT [10859:2328892]
:INPUT ACCEPT [1002:126271]
:OUTPUT ACCEPT [1256:91484]
:POSTROUTING ACCEPT [638:43890]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Oct 29 12:48:19 2015
# Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015
*filter
:INPUT ACCEPT [5:803]
:FORWARD ACCEPT [127:18532]
:OUTPUT ACCEPT [5:431]
-A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "HTTP Serve eth1"
-A INPUT -i eth1 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "SSH Serve eth1"
-A INPUT -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT -m comment --comment "ssh on eth1"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j DROP -m comment --comment "drop dns from eth0"
-A INPUT -p icmp -j ACCEPT
-A INPUT -i eth0 -j DROP
-A INPUT -i eth1 -j REJECT
-P INPUT DROP
-A FORWARD -p tcp -j ACCEPT -m comment --comment "all tcp from internal"
-A FORWARD -p udp -j ACCEPT -m comment --comment "all udp from internal"
-A FORWARD -p icmp -j ACCEPT
-P FORWARD DROP
-A OUTPUT -o eth1 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-P OUTPUT DROP
COMMIT
# Completed on Thu Oct 29 12:48:19 2015
    
por TemperedGlass 31.10.2015 / 16:13

1 resposta

1

iptables, e networking em geral, é mais complicado do que você está dando crédito.

Então, digamos que você faça isso apenas, com a esperança de ativar todo o tráfego de saída da eth1 interna, como em sua primeira linha:

-A FORWARD -i eth1 -p tcp -j ACCEPT
-P FORWARD DROP

Quando isso acontece, todas as conexões e tráfego são bidirecionais . O FORWARD está processando todo o tráfego que não está direcionando o roteador (INPUT) ou proveniente do roteador (OUTPUT). Portanto, o FORWARD obtém a conexão de iniciação de tráfego tcp de saída (que sua regra permite) e todas as respostas tentando reconhecer essa conexão e repassar o tráfego (o que, já que você está descartando tudo que não corresponde, exigiria uma nova regra permitir).

Isto é onde o iptables fica muito complicado, muito rapidamente, porque configurar uma regra para cada pacote potencial em ambas as direções é uma loucura. Ele começa a ficar mais simples se a primeira regra for sempre permitir o tráfego em conexões estabelecidas usando -m state - state ESTABLISHED, quando você começar a usar na sua outra questão resolvendo o seu problema NAT . Isso permitirá que você apenas escreva regras para as conexões que deseja permitir iniciar. Também pode ser útil classificar as conexões de entrada e saída em suas próprias regras (a menos que você esteja preocupado apenas com a saída), como abaixo:

#setup
-N outbound
-N inbound
#design
-A FORWARD -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o eth1 -j inbound
-A FORWARD -i eth1 -o eth0 -j outbound
-P FORWARD DROP
#allow outgoing web access
-A outbound -p tcp -m tcp --dport 80,443 -j ACCEPT
#and nothing else
-A outbound DROP
#etc....
    
por 01.11.2015 / 21:52