Um conjunto de regras seguras, iptables para o roteador doméstico do Ubuntu

2

Estou usando uma máquina servidor Ubuntu 14.04 como meu principal roteador doméstico e firewall. Tem DNS, DHCP e usa o iptables para garantir tudo. Iptables também age como nat.

Na eth0 eu tenho minha conexão de internet de entrada, e na eth1 eu tenho minha LAN para servir DNS e DHCP. Todos os clientes (conectados a eth1) devem ser capazes de fazer qualquer coisa de saída normalmente. E na lan eu tenho algumas máquinas que eu quero conectar do lado de fora usando PREROUTING.

No entanto, ultimamente descobri que meu conjunto de regras foi definido com ACCEPT no filtro * de INPUT sem qualquer DROP definido no final. Portanto, agora defini DROP na entrada. Depois de descobrir isso, fiquei um pouco preocupado e quero verificar novamente todo o conjunto de regras se eu perdi algo mais.

Este conjunto de iptables é suficiente para garantir tudo? Como eu compreendi ao ler um pouco, PREROUTING e FORWARD podem ser configurados para ACCEPT, já que ele irá acertar INPUT se nada coincidir, e eu virei get DROPped pela regra padrão. Está correto?

*filter
:INPUT DROP
-A INPUT -i eth1 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 53 --sport 53 -m state --state NEW -j    ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

:FORWARD ACCEPT
-A FORWARD -i eth0 -j ACCEPT

:OUTPUT ACCEPT
COMMIT

*nat
:PREROUTING ACCEPT
-A PREROUTING -i eth0 -p tcp -m tcp -s x.x.x.x --dport 8466 -j DNAT --to-destination 192.168.0.149:8465
-A PREROUTING -i eth0 -p tcp -m tcp -s x.x.x.x --dport 5667 -j DNAT --to-destination 192.168.0.111:5666
-A PREROUTING -i eth0 -p tcp -m tcp -s x.x.x.x --dport 5666 -j DNAT --to-destination 192.168.0.201:5666
-A PREROUTING -i eth0 -p tcp -m tcp -s x.x.x.x --dport 2548 -j DNAT --to-destination 192.168.0.201:548
-A PREROUTING -i eth0 -p tcp -m multiport --dports 32400,32469 -j DNAT --to-destination 192.168.0.201

:INPUT ACCEPT

:OUTPUT ACCEPT

:POSTROUTING ACCEPT
-A POSTROUTING -o eth0 -j MASQUERADE

COMMIT
    
por hrdy 11.06.2015 / 16:33

2 respostas

0

Sim, isso está correto.

Uma coisa estranha: você tem seu servidor DNS aberto para o exterior ??? Isso abre sua LAN para ataques DDoS de DNS. Você não quer deixar seu servidor DNS aberto no dentro ? ( -i eth1 ). Se você deixá-lo aberto para o mundo exterior, existem maneiras de mitigar o impacto dos ataques DNS DDos, você está ciente deles?

Só para ter certeza de que você está falando o que você diz:

  1. Você está executando um servidor ssh e um servidor http (somente na porta 80? Por que não a porta 443?) em seu gateway.

  2. Você deseja que um endereço IP individual tenha acesso às portas 8466, 5667, 5666 e 2548.

  3. Em vez disso, você permite que todos os IPs se conectem às portas 32400 e 32469.

(apenas no caso de você se perguntar: nenhum jogador, aqui).

Por que você derrubou os pacotes icmp ? Eles executam funções úteis.

Ao contrário da opinião pública, não é necessário adicionar regras para descartar pacotes malformados e descartar pacotes para endereços IP privados e não roteáveis. Em outras palavras, este é um conjunto de regras suficiente: você pode querer ler aqui o que os profissionais dizem sobre os conjuntos de regras iptables, especialmente a primeira resposta.

    
por 11.06.2015 / 17:25
0

Eu tenho que contradizer a resposta anterior. Esta configuração não é segura. Basicamente fazendo

:FORWARD ACCEPT -A FORWARD -i eth0 -j ACCEPT

Você está permitindo que todo o tráfego externo seja encaminhado para o interior. Então você não precisa das entradas PREROUTING.

Portanto, se eu for um invasor na mesma sub-rede que seu IP público (alguém usando o mesmo ISP na mesma região). Se eu conectar uma máquina diretamente no ISP, para obter um de seus IPs públicos, posso criar uma rota como

ip route add 192.168.0.0/24 via <your_public_ip>

(posso obter o seu IP público apenas procurando na internet por outras pessoas na minha sub-rede)

Então, posso fazer curl http://192.168.0.201:548 e seu firewall terá prazer em encaminhar essa solicitação para sua máquina em sua rede local. Na verdade, eu seria capaz de analisar sua rede fazendo:

nmap -sn -T4 192.168.0.0/24

E gostaria de obter uma lista de todos os IPs em funcionamento na sua rede.

Então, para cada um que eu poderia fazer:

nmap -sS -T4 192.168.0.201

E eu pegaria a lista de portas abertas. Eu verifiquei isso criando duas VMs e simulando um roteador e uma máquina cliente na qual eu estava executando um servidor Nginx. Eu era capaz de acessar a partir do lado "WAN" do servidor Nginx no lado "LAN", embora não houvesse regra PREROUTING permitindo isso. Também consegui varrer o lado "LAN" e, assim, apenas 1 VM estava funcionando: -)

O que você precisa fazer é:

:FORWARD DROP -A FORWARD -i eth1 -o eth1 -j ACCEPT -A FORWARD -i eth1 -o eth0 -j ACCEPT -A FORWARD -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED,DNAT -j ACCEPT

As regras acima eliminarão todo o encaminhamento por padrão. Observe que, se você precisar de encaminhamento entre outras interfaces, precisará adicionar as entradas. Então as outras regras fazem:

  1. aceitar o encaminhamento do lado da LAN para o lado da LAN (esse é opcional, mas você pode ter alguma configuração que exija isso. Por exemplo, minha interface LAN é uma ponte de rede feita de várias interfaces, assim como eu preciso disso regra)
  2. aceitar encaminhamento de LAN para WAN
  3. aceitar o encaminhamento da WAN para a LAN somente se os pacotes forem aceitos no PREROUTING e enviados para o destino DNAT, ou se forem de uma conexão estabelecida ou relacionada a ele (pense nos pacotes ICMP relacionados à conexão)

No entanto, a outra resposta está correta: você está expondo o DNS à Internet e isso é incomum. Além disso, expor a porta 22 e a porta 80 talvez não seja a melhor ideia. Olhe on-line, há muitas maneiras de melhorar sua configuração aqui, como limitar a taxa e usar um IPS (até mesmo simples como o fail2ban) e, especialmente, endurecer o SSH e alternar para HTTPS.

Descartar pacotes de um espaço IP privado provavelmente não é necessário, mas descartar pacotes inválidos ainda é uma coisa boa. De qualquer forma, assim que você usa o conntrack, ele está "marcando" os pacotes do invlid, então por que não usar esse recurso e evitar rotear os pacotes que serão descartados posteriormente pelo seu aplicativo. Apenas mate-os.

Observação final : quando você não sabe como testar seu próprio firewall, deve usar uma distribuição de firewall (por exemplo, ipfire, OPNsense, etc.) ou pelo menos um software em seu Linux caixa que pode fazer isso out-of-the-box (por exemplo, shorewall). Você tem as vantagens de que seria mais fácil obter uma configuração segura, no entanto, é claro que tem a desvantagem de não aprender o iptables. Se é para aprender iptables, então use primeiro uma configuração de firewall real para o roteador em seu "roteador de produção". Jogue com o iptables na máquina ou em uma configuração da VM, faça outras perguntas aqui, por exemplo, sobre como testar e verificar seu firewall. Depois de provar isso, coloque-o em "prod". :-) É assim que eu procedi, então eu apenas declaro isso como um conselho construtivo.

    
por 04.10.2018 / 00:45