Dead Packets

16/01/2015

Troubleshooting One Arm NAT

Filed under: fortinet,troubleshooting — drak @ 3:24 PM

Esse post é dedicado aos colegas “retardados” que me trouxeram o caso.

Situação: Servidores da rede interna devem chegar a uma rede remota usando um NAT específico, isso seria trivial se o tráfego para a rede remota não fosse roteado pela mesma interface que chega o tráfego de origem, ou seja, o pacote deve entrar e sair pela mesma interface (caminho não ótimo, já que o servidor da rede local poderia enviar o pacote diretamente para o gateway usado pelo firewall para a rede remota, porém nesse caso isso não é possível já que não ocorreria o NAT nesse fluxo).

Topologia para facilitar a visualização:

topo-one-arm-nat

Agora vamos ao que interessa, primeiro criamos uma regra liberando o tráfego da port2 para a port2, com os IPs de origem e destino adequados, após criar a regra e definir o NAT com IP Pool testamos com ping e não temos resposta, logo vamos ao debug sniffer:

FG01 # diag sniffer packet any 'host 192.168.10.63'
interfaces=[any]
filters=[host 192.168.10.63]
3.423153 192.168.10.63 -> 172.16.0.160: icmp: echo request
3.423189 192.168.10.63 -> 172.16.0.160: icmp: echo request
3.423266 192.168.10.7 -> 192.168.10.63: icmp: type-#5
4.427205 192.168.10.63 -> 172.16.0.160: icmp: echo request
4.427239 192.168.10.63 -> 172.16.0.160: icmp: echo request
4.427309 192.168.10.7 -> 192.168.10.63: icmp: type-#5
...
9.984483 192.168.10.63.54077 -> 172.16.0.160.443: syn 2201610154 
9.984565 192.168.10.63.54077 -> 172.16.0.160.443: syn 2201610154 
9.984623 192.168.10.7 -> 192.168.10.63: icmp: type-#5

Na captura acima fiz dois testes, o primeiro com ping (icmp echo request) e o segundo com um telnet na porta 443 (https).

Note o pacote “estranho” icmp type 5, como alguns de vocês podem imaginar deve estar ocorrendo um ICMP redirect pois o FW está enviando o pacote para um gw na mesma rede que o host de origem.

Confirmando o que significa icmp type 5 a partir da fonte: RFC792

The gateway sends a redirect message to a host in the following
situation. A gateway, G1, receives an internet datagram from a
host on a network to which the gateway is attached. The gateway,
G1, checks its routing table and obtains the address of the next
gateway, G2, on the route to the datagram's internet destination
network, X. If G2 and the host identified by the internet source
address of the datagram are on the same network, a redirect
message is sent to the host. The redirect message advises the
host to send its traffic for network X directly to gateway G2 as
this is a shorter path to the destination. The gateway forwards
the original datagram's data to its internet destination.

Ok, a descrição acima bate com o esperado. Agora como resolver isso ?

Pesquisando no CLI Guide (http://docs.fortinet.com/d/fortigate-fortios-5.2-cli-reference) alguma coisa relacionada a ‘redirect’ achei o seguinte na página 484:

“Under some conditions, it is undesirable to have enable traffic routed back on the same interface. In that case, set allow-traffic-redirect to disable.”

Ou seja, exatamente a situação enfrentada, tráfego entra e sai pela mesma interface, vamos habilitar o comando:

config system global
    set allow-traffic-redirect disable
end

Testamos:

FG01 # diag sniffer packet any 'port 443'
interfaces=[any]
filters=[port 443]
6.316107 192.168.10.63.47071 -> 172.16.0.160.443: syn 3467548287 
6.316225 192.168.10.51.47071 -> 172.16.0.160.443: syn 3467548287 
6.317751 172.16.0.160.443 -> 192.168.10.51.47071: syn 2754869133 ack 3467548288 
6.317767 172.16.0.160.443 -> 192.168.10.63.47071: syn 2754869133 ack 3467548288 
6.317994 192.168.10.63.47071 -> 172.16.0.160.443: ack 2754869134 
6.318009 192.168.10.51.47071 -> 172.16.0.160.443: ack 2754869134 
6.318276 192.168.10.63.47071 -> 172.16.0.160.443: fin 3467548288 ack 2754869134 
6.318308 192.168.10.51.47071 -> 172.16.0.160.443: fin 3467548288 ack 2754869134 
6.319294 172.16.0.160.443 -> 192.168.10.51.47071: fin 2754869134 ack 3467548289 
6.319306 172.16.0.160.443 -> 192.168.10.63.47071: fin 2754869134 ack 3467548289 
6.319517 192.168.10.63.47071 -> 172.16.0.160.443: ack 2754869135 
6.319526 192.168.10.51.47071 -> 172.16.0.160.443: ack 2754869135 

E observando o comportamento no diag debug flow:

2014-12-09 13:16:31 id=20085 trace_id=101 func=print_pkt_detail line=4373 msg="vd-root received a packet(proto=6, 192.168.10.63:58746->172.16.0.160:443) from port2. flag [S], seq 29096599, ack 0, win 14600"
2014-12-09 13:16:31 id=20085 trace_id=101 func=init_ip_session_common line=4522 msg="allocate a new session-0000027b"
2014-12-09 13:16:31 id=20085 trace_id=101 func=vf_ip4_route_input line=1596 msg="find a route: flags=01000000 gw-192.168.10.211 via port2"
2014-12-09 13:16:31 id=20085 trace_id=101 func=fw_forward_handler line=670 msg="Allowed by Policy-2: SNAT"
2014-12-09 13:16:31 id=20085 trace_id=101 func=__ip_session_run_tuple line=2520 msg="SNAT 192.168.10.63->192.168.10.51:58746"
2014-12-09 13:16:31 id=20085 trace_id=102 func=print_pkt_detail line=4373 msg="vd-root received a packet(proto=6, 192.168.10.63:58746->172.16.0.160:443) from port2. flag [.], seq 29096600, ack 612563040, win 7300"
2014-12-09 13:16:31 id=20085 trace_id=102 func=resolve_ip_tuple_fast line=4432 msg="Find an existing session, id-0000027b, original direction"
2014-12-09 13:16:31 id=20085 trace_id=102 func=__ip_session_run_tuple line=2520 msg="SNAT 192.168.10.63->192.168.10.51:58746"
2014-12-09 13:16:31 id=20085 trace_id=103 func=print_pkt_detail line=4373 msg="vd-root received a packet(proto=6, 192.168.10.63:58746->172.16.0.160:443) from port2. flag [F.], seq 29096600, ack 612563040, win 7300"
2014-12-09 13:16:31 id=20085 trace_id=103 func=resolve_ip_tuple_fast line=4432 msg="Find an existing session, id-0000027b, original direction"
2014-12-09 13:16:31 id=20085 trace_id=103 func=__ip_session_run_tuple line=2520 msg="SNAT 192.168.10.63->192.168.10.51:58746"
2014-12-09 13:16:31 id=20085 trace_id=104 func=print_pkt_detail line=4373 msg="vd-root received a packet(proto=6, 192.168.10.63:58746->172.16.0.160:443) from port2. flag [.], seq 29096601, ack 612563041, win 7300"
2014-12-09 13:16:31 id=20085 trace_id=104 func=resolve_ip_tuple_fast line=4432 msg="Find an existing session, id-0000027b, original direction"
2014-12-09 13:16:31 id=20085 trace_id=104 func=__ip_session_run_tuple line=2520 msg="SNAT 192.168.10.63->192.168.10.51:58746"

Removi o comando ‘allow-traffic-redirect’ no debug flow abaixo, para comparar como seria o output dessa análise quando o problema ocorre:

2014-12-09 13:19:51 id=20085 trace_id=105 func=print_pkt_detail line=4373 msg="vd-root received a packet(proto=6, 192.168.10.63:44447->172.16.0.160:443) from port2. flag [S], seq 3913655818, ack 0, win 14600"
2014-12-09 13:19:51 id=20085 trace_id=105 func=init_ip_session_common line=4522 msg="allocate a new session-000002d0"
2014-12-09 13:19:51 id=20085 trace_id=105 func=vf_ip4_route_input line=1596 msg="find a route: flags=01000000 gw-192.168.10.211 via port2"
2014-12-09 13:19:54 id=20085 trace_id=106 func=print_pkt_detail line=4373 msg="vd-root received a packet(proto=6, 192.168.10.63:44447->172.16.0.160:443) from port2. flag [S], seq 3913655818, ack 0, win 14600"
2014-12-09 13:19:54 id=20085 trace_id=106 func=init_ip_session_common line=4522 msg="allocate a new session-000002d3"
2014-12-09 13:19:54 id=20085 trace_id=106 func=vf_ip4_route_input line=1596 msg="find a route: flags=01000000 gw-192.168.10.211 via port2"

Lembrando apenas que esse tipo de topologia não é usual e obviamente não é a melhor prática, porém as vezes não temos como mudar a topologia do ambiente e temos que fazer funcionar de “qualquer jeito”. Caso resolvido!

Referências
FortiOS 5.2.0 CLI Reference
RFC 792 – ICMP

Anúncios

Deixe um comentário »

Nenhum comentário ainda.

RSS feed for comments on this post. TrackBack URI

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Crie um website ou blog gratuito no WordPress.com.

%d blogueiros gostam disto: