FreeBSD Policy Routing com FreeBSD Depois de algumas horas "apanhando" do FreeBSD, de leituras constantes nos man pages e inclusive no código do natd e do ipfw, cheguei a solução do tão sonhado policy routing no FreeBSD com NAT. OBJETIVO O objetivo é muito simples. Nós temos links de duas* operadoras, que chamaremos no artigo de ISP1 e ISP2, e precisamos selecionar que link desse cada IP da rede interna irá sair. Ex: 192.168.0.1 -> ISP1 192.168.0.2 -> ISP1 192.168.0.3 -> ISP2 192.168.0.4 -> ISP1 192.168.0.5 -> ISP2 * Com esta solução descrita abaixo, poderiamos ter quantos links for necessário. PRÉ-REQUESITOS Basicamente precisaremos do ipfw e do natd apenas, portanto as seguintes opções no kernel: options IPFIREWALL options IPFIREWALL_FORWARD options IPDIVERT Precisaremos também do IP Forwarding. No /etc/rc.conf: gateway_enable="YES" NOSSA REDE xl0 (Rede Interna): IP: 192.168.0.1 REDE: 192.168.0.0 / 255.255.255.0 xl1 (ISP1): IP: 100.100.100.100 Gateway: 100.100.100.1 xl2 (ISP2): IP: 200.200.200.200 Gateway: 200.200.200.1 REGRAS DO IPFW E NATD Primeiramente teremos que definir qual ISP1 terá seu gateway na default gateway do FreeBSD. No nosso caso iremos optar pelo ISP1: route add default 100.100.100.1 Teremos que rodar dois natd. Um na xl1 e outro na xl2: natd -s -n xl1 -p 8668 natd -s -n xl2 -p 8669 Agora as regras do IPFW: 00010 divert 8669 ip from any to 200.200.200.200 in recv xl2 00020 divert 8669 ip from 192.168.0.8 to any out xmit xl1 00030 fwd 200.200.200.1 ip from 200.200.200.200 to any 00040 divert 8668 ip from any to 100.100.100.100 in recv xl1 00050 divert 8668 ip from 192.168.0.5 to any out xmit xl1 00060 allow ip from any to any 65535 deny ip from any to any O "segredo" estão nas regras 20 e 30. Percebam que na regra 20 nós jogamos para o NATD da porta 8669 que esta rodando na interface xl2 um pacote que esta saindo pela xl1, e logo após na regra abaixo (30) nós estamos dando um forward de todos os pacotes com origem do IP da xl2 para a next-hop (gateway) do ISP2. Isso acontece porque sempre que o FreeBSD recebe um pacote, o IP forwading joga na tabela de roteamento que diz que o pacote tem que sair pela default gateway (xl1). Chegando lá tudo que nós temos que fazer é colocar uma regra de nat só que "invertendo" o natd que iremos jogar. Com isso o pacote é reescrito com a origem da interface xl2. Logo após tudo que nós temos que fazer é força-lo a sair pela interface certa e com o devido gateway setado (regra 30). Neste exemplo o IP 192.168.0.8 irá sair pelo ISP2 e o IP 192.168.0.5 pelo ISP1. Agora sinta-se a vontade para fazer a política que quiser, seja ela por source-address, porta, protocolo... Done!!! :-) Diego Linke - GAMK