[FUGSPBR] SOLUÇÃO - Source Routing com FreeBSD

Patrick Tracanelli eksffa em freebsdbrasil.com.br
Qua Jun 18 21:01:20 BRT 2003


>
> "Dual Homeing source routing com FreeBSD"
> http://www.gamk.com.br/index.php?type=1&file=sourcert.txt
>
> Gostaria de agradecer ao Patrick pelas idéias de ipfw fwd. Valeu 
> Patrick!!!
> Seguinte Patrick a suas idéias quase funcionam, porém o problema é a 
> reescrita do pacote, portanto o natd invertido é necessário em 
> qualquer situação inclusive um pacote saindo da própria maquina. A sua 
> idéia funcionaria se tivermos um apache rodando em LISTEN em uma porta 
> do ISP secundário, mas não um telenet IP 25 por exemplo na console.
> Depois se quiser entre em contato em PVT que eu te explico... :D
>
> Abraços


Hehe o historico das listas (de BSD) nunca mentem, certo? :Pp. Sem 
problemas, já entendi o que você fez. Mas dá pra simplificar isso ;-) 
Com certeza. Precisamos abusar desse seu ambiente dual homed pra testar 
só o NAT inverso, com unregistered, e -reverse (pensou nisso?). Pena que 
o ambiente de teste é IPFW1, não da pra abusar dos operadores OR pra 
simplificar ainda mais.

Agora olha só, a questão de next-hop em rede registrada, como eu disse 
que funciona dual homed por qualquer politica de roteamento (policy 
routing).

Ambiente, 1 link Wireless (wi0) rede e o segundo link, um ppp (tun0).

Adicionadas as regras "set 1 fwd 200.210.70.1 log logamount 800 ip from 
200.210.70.182 to any out xmit tun0" E "set 2 fwd 200.210.42.1 log 
logamount 800 ip from 200.210.42.5 to any out xmit wi0" depois de um 
"ipfw -f f"
Depois de um ipfw -f f com

(eksffa em redfield-claire)~# route flush
default              200.210.42.1       done
route: write to routing socket: No such process
got only -1 for rlen
(eksffa em redfield-claire)~# route add default 200.210.42.109
add net default: gateway 200.210.42.109

(uma rota default completamente invalida, essa maquina nem esta no ar).

(eksffa em redfield-claire)~# ipfw -S sh
00100    3     175 set 1 fwd 200.210.70.1 log logamount 800 ip from 
200.210.70.182 to any out xmit tun0
00200    0       0 set 2 fwd 200.210.42.1 log logamount 800 ip from 
200.210.42.5 to any out xmit wi0

Então como forcar alguma coisa sair pelo link wireless, pra fazer um 
teste? Sei la, nmap por exemplo.

(eksffa em redfield-claire)~# nmap -S 200.210.42.5 -e wi0 -P0 200.210.70.5
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
^Ccaught SIGINT signal, cleaning up

(eksffa em redfield-claire)~# tail -4 /var/log/security
Jun 18 20:07:18 redfield-claire kernel: ipfw: 200 Forward to 
200.210.42.1 TCP 200.210.42.5:33402 200.210.70.5:183 out via wi0
Jun 18 20:07:18 redfield-claire kernel: ipfw: 200 Forward to 
200.210.42.1 TCP 200.210.42.5:33402 200.210.70.5:327 out via wi0
Jun 18 20:07:18 redfield-claire kernel: ipfw: 200 Forward to 
200.210.42.1 TCP 200.210.42.5:33402 200.210.70.5:1389 out via wi0
Jun 18 20:07:18 redfield-claire kernel: ipfw: 200 Forward to 
200.210.42.1 TCP 200.210.42.5:33402 200.210.70.5:344 out via wi0

Logou, conclui-se que rolou. Testar uma politica, usufruindo do 
processamento sequencial das regras.

(eksffa em redfield-claire)~# ipfw add 90 fwd 200.210.42.1 log logamount 10 
ip from me to { smtp.uol.com.br or mx1.freebsd.org } smtp,qmtp out xmit wi0

00090 fwd 200.210.42.1 log logamount 10 ip from me to { 200.221.4.40 or 
dst-ip 216.136.204.125 } dst-port 25,209 out xmit wi0


(eksffa em redfield-claire)~# telnet mx1.freebsd.org 25
Trying 216.136.204.125...
Connected to mx1.freebsd.org.
Escape character is '^]'.
220 mx1.FreeBSD.org ESMTP Postfix (Postfix Rules!)
quit
221 Bye
Connection closed by foreign host.

(eksffa em redfield-claire)~# tail -1 /var/log/security
Jun 18 20:15:12 redfield-claire kernel: ipfw: 90 Forward to 200.210.42.1 
TCP 200.210.42.5:49187 216.136.204.125:25 out via wi0

Resposta:

(eksffa em redfield-claire)~#  tcpdump -i wi0 src mx1.freebsd.org
tcpdump: listening on wi0
20:20:21.787982 mx1.freebsd.org.smtp > 
redfield-claire.wireless.freebsdbrasil.com.br.49190: S 
350957724:350957724(0) ack 3739244552 win 57344 <mss 1460,nop,wscale 
0,nop,nop,timestamp 1562961220 417557> (DF)
20:20:22.001920 mx1.freebsd.org.smtp > 
redfield-claire.wireless.freebsdbrasil.com.br.49190: P 1:53(52) ack 1 
win 57920 <nop,nop,timestamp 1562961242 417580> (DF)

Portanto a resposta voltou pela wireless, por onde saiu.

Fora (sem match) da regra:

(eksffa em redfield-claire)~# telnet mail.asernet.com.br qmtp
Trying 200.205.142.130...
Connected to socorrobsd1.asernet.com.br.
Escape character is '^]'.

(eksffa em redfield-claire)~# tail -1 /var/log/security
Jun 18 20:23:22 redfield-claire kernel: ipfw: 100 Forward to 
200.210.70.1 TCP 200.210.70.182:49194 200.205.142.130:209 out via wi0

Note que pela porta 209 saiu pela regra "100", portanto pelo gateway da 
tun0. Portanto é baba criar politicas por servico/destino para origens 
distintas. Pergunta, com um natd -reverse na interface interna (nat pela 
unregistered) e com as regras de fwd "antes" da de divert, como origem 
(from, tipo: divert natd ip from <me ou IP equivalente> to <politica> 
<...>) sendo o IP real, depois do pacote ja ter sido processado pelo 
natd (ou seja, quando a origem nao for mais um IP unregistered, e sim o 
real), rola a politica definida pela regra?

Pra isso rola de continuar os testes (pena q eu perdi a sessao ontem 
hehe). Pensa comigo, você ta usando nat tradicional, mas forcando o 
divert na interface interna. Se fosse -reverse as regras pra gente 
tratar o pacote na hora de sair, não poderiam ser simplificadas ainda 
mais?? Com divert na interna, ele da match na regra na interna, mas só 
vai processar quando for pra externa, certo? Poupa a volta.

Cansei.
Bom feriado :}
[]s

-- 
Atenciosamente,

Patrick Tracanelli

FreeBSD Brasil LTDA.
The FreeBSD pt_BR Documentation Project
http://www.freebsdbrasil.com.br
patrick em freebsdbrasil.com.br
"Long live Hanin Elias, Kim Deal!"

_______________________________________________________________
Sair da Lista: http://www2.fugspbr.org/mailman/listinfo/fugspbr
Historico: http://www4.fugspbr.org/lista/html/FUG-BR/



Mais detalhes sobre a lista de discussão freebsd