Meu ISP roteia uma rede /29 (8 endereços IP). O primeiro e o último são, obviamente, o endereço de rede e de transmissão e o segundo é atribuído ao modem pelo ISP. O modem tem uma porta LAN Ethernet com a rede /29 que posso usar. Infelizmente não consigo acessar ou substituir o modem, apenas o ISP tem acesso a ele. Ele precisa ser tratado como caixa preta para essa discussão. Meu ponto final é a conexão LAN do modem que fornece a rede /29.
Claro, posso atribuir os 5 endereços IP restantes a diferentes máquinas e conectá-los ao modem através da porta Ethernet. Isto é o que estou fazendo agora.
No entanto, eu gostaria de ter um filtro de pacotes (Firewall) no meio. Normalmente, um firewall precisa de duas interfaces com duas sub-redes. Eu poderia tecnicamente dividir o /29 em duas redes /30 e colocar o firewall entre elas.
Outra opção seria atribuir todos os cinco IPs estáticos ao firewall e fazer NAT e encaminhamento de porta.
Uma terceira opção seria fazer todo o tráfego L2 passar pelo meu firewall, configurá-lo como uma ponte e usar filtragem L2 básica.
Nenhuma dessas opções me parece atraente.
Existe uma boa maneira de colocar um firewall na frente da minha rede IP sem exigir filtragem NAT ou L2?
Idealmente, todo o /29 estaria na interface "interna" do firewall, o próprio firewall seria conectado usando um /31 (ou /30) completamente separado e o ISP rotearia o /29 principal através do firewall. Vale a pena tentar ligar para o seu ISP e perguntar se eles podem fazer esse tipo de configuração "ponto a ponto".
Se isso não for possível, finja usando proxy ARP no firewall. Desde que responda a consultas ARP ao roteador, ele receberá tráfego para esses endereços IP, mesmo que eles não estejam realmente configurados no firewall.
Isso funciona com um firewall baseado em Linux (e a ideia geral deve funcionar com, por exemplo, OpenBSD), mas não há garantias sobre dispositivos:
Configure a interface "interna" do firewall com um endereço do /29 como de costume.
Configure a interface "externa" do firewall com o mesmo endereço, mas torne-a /32.
No Linux, você pode usar o estilo de endereçamento "ponto a ponto", especificando o endereço do modem como "peer".
Se isso não for possível, use um /32 regular e adicione separadamente uma rota "local" para o endereço do modem.
Adicione a rota padrão como de costume.
Habilite o proxy-ARP na interface "externa". No Linux, você pode usar a implementação no kernel (ativada por meio do
sysctl
), ou um daemon de espaço de usuário ("parpd").Como a implementação no kernel me confunde muito, usar
parpd
era mais simples (e também porque no meu caso eu precisava configurar exceções para o proxy de toda a sub-rede, o que o parpd pode fazer, mas o kernel não), então aqui está um /etc/ parpd.conf:Você também pode habilitar o proxy ARP para a interface "interna", para que seus hosts de LAN configurados estaticamente possam simplesmente continuar tendo o endereço do roteador ISP como seu "gateway padrão" sem a necessidade de alterá-lo imediatamente em todos os lugares:
A implementação do ARP do proxy no kernel no Linux pode ser encontrada
sysctl net.ipv4.conf.ext0.proxy_arp[_pvlan]
emip neigh add .. proxy
. (Depois de várias tentativas, ainda não sei exatamente se o último exige que o sysctl seja ativado ou se eles são ortogonais.)Observe que "proxy" neste caso não significa retransmitir as solicitações (embora isso também seja possível); em vez disso, o próprio firewall responderá em nome dos endereços proxy.
Isso é tudo, agora é só tratar o firewall como um roteador padrão e escrever suas regras de iptables.
A vantagem deste mecanismo (em comparação com, por exemplo, NAT ou ebtables brouting 1 ) é que, além da interface "externa" parecer um pouco estranha, seu firewall continua a funcionar como um roteador de camada 3 completamente padrão - proxy-ARP não altera o pacotes IP de qualquer forma, e quase alcança o mesmo resultado como se o ISP tivesse simplesmente roteado o /29 através do seu firewall.
(O mesmo método também funciona com IPv6 usando proxy-NDP, mas esperamos que você não precise disso e possa apenas fazer com que o ISP o roteie corretamente, por exemplo, via DHCPv6-PD?)
Observe que, mesmo em seu plano inicial de dividir o /29 em dois /30, o proxy-ARP continuaria sendo necessário porque o roteador do ISP não teria conhecimento da divisão – ele continuaria emitindo consultas ARP para todo o /29.
Se a resposta for que você pode ligar para o ISP e pedir que eles ajustem o roteamento para que dois /30s possam ser usados... (nesse caso, eles atribuiriam um ponto a ponto /30 dedicado para o link modem-firewall).
1 A ponte de software Linux suporta um recurso onde certos pacotes podem ser elevados para processamento L3 (roteamento/iptables), enquanto outros pacotes continuam a ser encaminhados pela ponte L2. Isso é usado por alguns dispositivos de firewall, como Untangle. É horrível e espero nunca mais vê-lo usado em uma rede.
O firewall também faria NAT conforme necessário, o que significa que apenas a sub-rede "externa" é seu /29, e a sub-rede "interna" é um intervalo de endereços privado, que pode ser tão grande quanto você quiser (por exemplo
10.0.0.0/8
, ).E isso pode ser NAT "estático", então você pode ter 5 IPs internos e mapeá-los um a um em seus 5 IPs externos. Ou qualquer outra coisa que você gosta.
Portanto, não há realmente nenhuma desvantagem em usar o NAT na sua situação. O NAT não está restrito ao "mapear toda a sub-rede interna para um único endereço IP", que é feito por padrão em roteadores domésticos.
Quer dizer, ou você fica em L2, então você precisa de filtragem L2, ou você vai para L3, então você precisa de roteamento e, portanto, NAT. Então vai ser um ou outro.
Desperdiçar endereços IP externos para máquinas internas com firewall não é um bom uso de recursos caros, como endereços IP, apenas porque você "não gosta de NAT" (ou qualquer que seja o motivo).