Firewall Iptables para frente

Firewall Iptables para frente

Atualmente estou trabalhando em um roteador Linux e não consigo fazer o firewall da maneira que gostaria.

O roteador possui três interfaces - WAN, que é uma sub-rede privada de banda larga móvel 172.18.15.0/24que é salva e possui 172.18.15.2uma sub-rede privada do dispositivo 10.0.0.0/24na qual não confio. WAN serve para acessá-lo via OpenVPN e é o gateway padrão do roteador.

Os IPs do roteador são 172.18.15.1e 10.0.0.1. No iptables eu tenho uma regra DNAT para encaminhar 80o tráfego da porta 10.0.0.1para 172.18.15.2a bruxa MASQUERADE no caminho de volta.

Esta parte funciona bem.

O que me preocupa é que quando alguém da sub-rede privada escolhe 10.0.0.1como gateway padrão ou cria uma rota para 172.18.15.0/24via 10.0.0.1, ele também expõe 172.18.15.2. Gostaria de interromper esse comportamento para que a única forma de acessar 172.18.15.2a web seja através do endereço 10.0.0.1.

Se eu cancelar o encaminhamento, cancelo também o DNAT, o que é um problema.

Uma maneira que encontrei é instalar o Apache e criar proxy reverso. No entanto, não tenho certeza se é o caminho certo e correto.

Obrigado pelas sugestões!

EDITAR:

172.18.15.2é um dispositivo simples. Pode ter apenas endereço próprio e endereço de gateway, neste caso 172.18.15.1. Ele está respondendo porque eu configurei/etc/sysctl.conf net.ipv4.ip_forwarf=1

Aqui está o dump de iptables-save -c
enp1s0 é interface para 10.0.0.0/24
enp2s0 é interface para 172.18.15.0/24
wwx582c80139263 é interface para gateway de banda larga móvel

# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*filter
:INPUT ACCEPT [840:388180]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [643:92809]
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -j DROP
COMMIT
# Completed on Mon Apr 16 08:27:45 2018
# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*nat
:PREROUTING ACCEPT [10:648]
:INPUT ACCEPT [10:648]
:OUTPUT ACCEPT [11:770]
:POSTROUTING ACCEPT [11:770]
[0:0] -A PREROUTING -i enp1s0 -p tcp -m tcp --dport 80 -j DNAT --to- 
destination 172.18.15.2:80
[0:0] -A POSTROUTING -s 172.18.15.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
COMMIT
# Completed on Mon Apr 16 08:27:45 2018

Responder1

Usar um proxy reverso (que deve inserir um X-Forwarded-Forcabeçalho para fins de registro) e remover o encaminhamento de rede seria uma solução limpa. A solução abaixo deve ser claramente compreendida para evitar efeitos inesperados com futuras alterações nas regras do iptables.

Dito isto...

O problema

  • Os nós da LAN 10.0.0.0/24não devem usar o roteador como roteador, pelo menos não para alcançar 172.18.15.0/24. Alguns o fazem de qualquer maneira.
  • O roteador fornece serviços localizados em 172.18.15.0/24( 172.18.15.2:80) para 10.0.0.0/24nós, usando DNAT e encaminhamento.
  • uma vez que os pacotes chegam à cadeia filter/FORWARD, não há como distinguir se eles foram inicialmente destinados 10.0.0.1e depois DNATados ou se foram enviados diretamente para 172.18.15.2(o que deveria ser proibido).

A solução

Então a classificação tem que ser feita antes do NAT acontecer: na tabela mangle, como pode ser visto nesteFluxo de pacotes no Netfilter e na rede geralesquemático. Esta regra única é suficiente para lidar com isso:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j DROP

Mas normalmente, para um melhor gerenciamento, deve haver uma separação de funções: mangle para alterar (não descartar) ou marcar aqui, e a tabela de filtros (o padrão) para filtrar e descartar. Isso é possível usando uma marca na etapa do mangle e combinando essa marca para descartar na etapa do filtro. Então isso é equivalente:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j MARK --set-mark 1
iptables -A FORWARD -m mark --mark 1 -j DROP

(e para ser bem completo: iptables -A INPUT -m mark --mark 1 -j DROPimpedir o acesso a 172.18.15.1)

Qualquer um dos métodos é equivalente. Claro que se for realmente apenas o dispositivo 172.18.15.2 que precisa ser protegido, basta substituir -d 172.18.15.0/24por -d 172.18.15.2.

ATUALIZAÇÃO: um método mais fácil baseado em conntrack (que já está em uso por causa do NAT) pode ser usado: consultandoconexãopara saber se o pacote foi realmente DNATado e descartá-lo se não. Então isso simplifica as coisas, porque essa é apenas uma regra e simplesmente na cadeia filter/FORWARD. Então, como terceiro método, em vez das regras acima:

iptables -A FORWARD -s 10.0.0.0/24 -d 172.18.15.0/24 -m conntrack ! --ctstate DNAT -j DROP

Além disso, a linha a seguir é inútil e pode ser removida. PREROUTING mudou o destino com DNAT, então o fluxo nunca chega a INPUT, mas passa pela cadeia FORWARD:

[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

informação relacionada