wandersoninf
(usa Debian)
Enviado em 14/08/2007 - 22:22h
18/06/03 16:01 - Policy Routing com FreeBSD
Diego Linke
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!!! :-)