Usar um proxy reverso (que deve inserir um cabeçalho X-Forwarded-For
para fins de registro) e remover o encaminhamento de rede seria uma solução limpa. A solução abaixo, deve ser claramente entendida para evitar efeitos inesperados com outras mudanças de regras do iptables.
Isso disse ...
O problema
-
Os nós de
- LAN
10.0.0.0/24
não usam o Roteador como um roteador, pelo menos para não alcançar172.18.15.0/24
. Alguns fazem assim mesmo. - 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. - quando os pacotes chegam à cadeia de filtro / FORWARD, não há como distinguir se eles foram inicialmente destinados a
10.0.0.1
e depois a DNAT ou se foram enviados diretamente para172.18.15.2
(o que deve ser proibido).
A solução
Portanto, a classificação deve ser feita antes que o NAT aconteça: na tabela mangle, como pode ser visto neste Fluxo de pacotes no Netfilter e General Networking esquemá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, geralmente, 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 soltar. Isso é possível usando uma marca na etapa mangle e combinando essa marca para soltar na etapa de 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 realmente completo: iptables -A INPUT -m mark --mark 1 -j DROP
para impedir o acesso a 172.18.15.1
)
Qualquer método é 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 no conntrack (que já está em uso por causa do NAT) pode ser usado: consultando conntrack saber se o pacote foi realmente DNATed e largá-lo se não. Então isso simplifica as coisas, porque isso é apenas uma regra, e simplesmente na cadeia filter / FORWARD. Então, como um 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 alterou o destino com DNAT, portanto, 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