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/24
que é salva e possui 172.18.15.2
uma sub-rede privada do dispositivo 10.0.0.0/24
na 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.1
e 10.0.0.1
. No iptables eu tenho uma regra DNAT para encaminhar 80
o tráfego da porta 10.0.0.1
para 172.18.15.2
a 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.1
como gateway padrão ou cria uma rota para 172.18.15.0/24
via 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.2
a 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-For
cabeç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/24
não devem usar o roteador como roteador, pelo menos não para alcançar172.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
) para10.0.0.0/24
nó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.1
e depois DNATados ou se foram enviados diretamente para172.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 DROP
impedir 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/24
por -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