Mostrando postagens com marcador Network. Mostrar todas as postagens
Mostrando postagens com marcador Network. Mostrar todas as postagens

sexta-feira, 20 de fevereiro de 2009

Um roteador, dois provedores e alguma redundância

De tempos em tempos surge em alguma lista ou forum de discussão a questão de como ter redundância entre dois provedores de forma automática no meu escritório? E essa foi exatamente a questão que foi feita no forum do blog Cisco Certified. É claro que existem soluções proprietárias (o Radware Linkproof, por exemplo) ou open-source para a solução deste problema, mas a solução que vou explicar aqui é toda baseada em um único roteador Cisco recebendo dois links de provedores diferentes (leia-se: com endereçamento válido diferente).

O cenário que iremos tratar neste post é o seguinte:

Neste cenário, o roteador Router está conectado ao ISP 1 e ao ISP 2 através de links ponto-a-ponto e o endereçamento válido que o cliente deverá usar é o mesmo do link. Na rede interna do cliente não existe nenhum servidor (pelo menos para este exemplo). Só existem conexões do escritório (redes 192.168.0.0/24 e 172.16.0.0/24) para a Internet. Neste exemplo também estou considerando que a rede 192.168.0.0/24 irá utilizar o ISP 2 e a rede 172.16.0.0/24 o ISP 1 (devido à política interna, uma rede tem prioridade sobre a outra, etc). Estas redes podem ou não estar diretamente conectadas no roteador Router.

É claro que colocar uma rota default apontando para um ou outro provedor (ISP) não será a nossa solução e, para este caso, quando não podemos utilizar um protocolo de roteamento dinâmico, vamos utilizar duas features da Cisco: o Cisco IP SLA (que já foi tratado neste post) e o Policy-Based Routing (que também já foi tratado neste outro post).

O primeiro passo é configurar uma monitoração com o IP SLA e começar a fazer o tracking desta monitoração. Para isso utilizaremos o Object Tracking.

ip sla monitor 1
type echo protocol ipicmpecho 10.1.1.2
frequency 5
ip sla monitor schedule 1 start-time now life forever

ip sla monitor 2
type echo protocol ipicmpecho 10.1.2.2
frequency 5
ip sla monitor schedule 2 start-time now life forever

track 123 rtr 1 reachability
track 124 rtr 2 reachability

Para verificar que o tracking está funcionando, utilize o comando show track.

Router#show track
Track 123
Response Time Reporter 1 reachability
Reachability is Up
1 change, last change 00:00:05
Latest operation return code: OK
Latest RTT (millisecs) 168
Track 124
Response Time Reporter 2 reachability
Reachability is Up
1 change, last change 00:00:04
Latest operation return code: OK
Latest RTT (millisecs) 124


Como estamos preocupados com o tempo de convergência da rede na ocasião de uma falha, configurei o intervalo de testes do IP SLA para 5 segundos. Agora iremos utilizar o tracking que configuramos no passo anterior em um route-map que verificará se o default gateway está respondendo ou não, para então utilizar somente aquele que estiver respondendo.

access-list 11 permit host 172.16.0.1
access-list 12 permit host 192.168.0.1

route-map in-out-link-1 permit 10
match ip address 11
set ip next-hop verify-availability 10.1.1.2 10 track 123
set ip next-hop verify-availability 10.1.2.2 20 track 124

route-map in-out-link-1 permit 20
match ip address 12
set ip next-hop verify-availability 10.1.2.2 10 track 124
set ip next-hop verify-availability 10.1.1.2 20 track 123


Como podemos observar (pelo menos em nosso teste) o host 172.16.0.1 utilizará o ISP 1 (next-hop 10.1.1.2) preferencialmente e o host 192.168.0.1 utilizará o outro ISP. Agora podemos verificar como está o nosso route-map.

Router#show route-map in-out-link-1
route-map in-out-link-1, permit, sequence 10
Match clauses:
ip address (access-lists): 11
Set clauses:
ip next-hop verify-availability 10.1.1.2 10 track 123 [up]
ip next-hop verify-availability 10.1.2.2 20 track 124 [up]
Policy routing matches: 0 packets, 0 bytes
route-map in-out-link-1, permit, sequence 20
Match clauses:
ip address (access-lists): 12
Set clauses:
ip next-hop verify-availability 10.1.2.2 10 track 124 [up]
ip next-hop verify-availability 10.1.1.2 20 track 123 [up]
Policy routing matches: 0 packets, 0 bytes

O último passo é configurar o NAT nas interfaces utilizando um route-map para identificar qual é a interface que está sendo utilizada como saída. Dessa forma, quando um determinado pacote for utilizar o link do ISP 1 para acessar a Internet, o NAT irá traduzir para o endereço da interface correspondente (dado que estamos utilizando interface overload na configuração do NAT).

interface fa0/0
ip nat inside
! devemos aplicar o route-map in-out-link-1 na interface conectada na rede
! interna para fazer com que o roteador não utilize a tabela de rotas padrão.
ip policy route-map in-out-link-1

int atm1/0.1
ip nat outside

interface atm2/0.1
ip nat outside

route-map nat-1 permit 10
match interface ATM1/0.1
!
route-map nat-2 permit 10
match interface ATM2/0.1
!
ip nat inside source route-map nat-1 interface atm 1/0.1
ip nat inside source route-map nat-2 interface atm 2/0.1


Neste momento, podemos fazer a primeira verificação. Como exemplo, estou utilizando um roteador com endereço IP 192.168.0.1 e 172.16.0.1 para fazer os testes.

Host#ping 1.1.1.1 source lo0

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1.1.1.1, timeout is 2 seconds:
Packet sent with a source address of 172.16.0.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 32/295/760 ms

Host#ping 1.1.1.1 source lo1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 1.1.1.1, timeout is 2 seconds:
Packet sent with a source address of 192.168.0.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 96/187/304 ms

Este host está conectado na interface fastethernet0/0 do roteador Router. Podemos verificar também que a tabela de NAT está mostrando as traduções para os dois links separadamente.

Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 10.1.1.1:116 172.16.0.1:116 1.1.1.1:116 1.1.1.1:116
icmp 10.1.2.1:117 192.168.0.1:117 1.1.1.1:117 1.1.1.1:117

Observe que a primeira linha de traduções mostra a tradução para o endereço 10.1.1.1 (que é o endereço do ISP 1 e a segunda linha mostra a tradução para o endereço do ISP 2: 10.1.2.1. Vamos agora simular a falha do ISP 2 e ver o que acontece com a tabela de traduções e os pings.

Router#show track
Track 123
Response Time Reporter 1 reachability
Reachability is Up
1 change, last change 00:02:45
Latest operation return code: OK
Latest RTT (millisecs) 79
Tracked by:
ROUTE-MAP 0
Track 124
Response Time Reporter 2 reachability
Reachability is Down
2 changes, last change 00:00:00
Latest operation return code: Timeout
Tracked by:
ROUTE-MAP 0

Router#show route-map in-out-link-1
route-map in-out-link-1, permit, sequence 10
Match clauses:
ip address (access-lists): 11
Set clauses:
ip next-hop verify-availability 10.1.1.2 10 track 123 [up]
ip next-hop verify-availability 10.1.2.2 20 track 124 [down]
Policy routing matches: 0 packets, 0 bytes
route-map in-out-link-1, permit, sequence 20
Match clauses:
ip address (access-lists): 12
Set clauses:
ip next-hop verify-availability 10.1.2.2 10 track 124 [down]
ip next-hop verify-availability 10.1.1.2 20 track 123 [up]
Policy routing matches: 0 packets, 0 bytes

Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 10.1.1.1:119 172.16.0.1:119 32.1.1.1:119 32.1.1.1:119
icmp 10.1.1.1:118 192.168.0.1:118 32.1.1.1:118 32.1.1.1:118

Aproximadamente cinco segundos após desligar o link para o ISP 2, podemos observar que o tracking não está mais funcionando para o endereço 10.1.2.2 - assim como o nosso route-map -, e a tabela de NAT mostra que agora estamos traduzindo todos os endereços para 10.1.1.1 (que é o endereço do ISP 1).

Lembre-se sempre que este é um exemplo e que para ser aplicado em um ambiente real devem ser feitos alguns ajustes.

Mais informações em:

segunda-feira, 6 de outubro de 2008

Configuração de portas Gigabit Ethernet

Esta noite estava vendo um outro blog sobre redes quando encontrei uma frase ao mesmo tempo trágica e engraçada (como a frase foi escrita em inglês, manterei na língua original): "Repeat after me. I will not force a switch to 1000/Full, even if some idiot insists that I should."

Essa é, com certeza, umas das discussões mais antigas que eu já vi. Alguns dizem que sim, alguns dizem que não, enfim... Apesar do assunto ser bastante comentado em diversos lugares, como por exemplo a página Techworld, muita gente custa a acreditar! :)

Por isso o meu grande amigo Thiago Siqueira fez um ótimo dever de casa há algum tempo atrás e eu gostaria de compartilhar para também ficar registrado aqui.

Acontece que no início da implementação do padrão Gigabit Ethernet (IEEE 802.3z) a especificação não era clara a respeito de utilizar auto-negociação ou configurar manualmente a interface para half ou full-duplex em portas gigabit e isso fez com que os fabricantes - talvez utilizando o mesmo código que utilizavam para portas 10/100 ou ainda por causa do comodismo em continuar configurando um novo padrão com velhos costumes - implementassem de forma diferente o padrão Gigabit Ethernet em UTP, uma herança da forma como foi definido e implementada a auto-negociação do padrão IEEE 802.3u (Ethernet 100 MBps). Com o passar do tempo, surgiu toda essa confusão.

Para o padrão IEEE 802.3 (Ethernet) o uso de auto-negociação para interfaces 1000BASE-T é MANDATÓRIO. Consulte o documento a seguir para mais informações (página 603, item A, anexo 28A, cláusula 28D.5): http://standards.ieee.org/getieee802/download/802.3-2005_section2.pdf

Muito tempo depois a possibilidade de configuração fixa para full ou half-duplex no padrão Gigabit Ethernet foi possível (e aceitável) para que garantisse a compatibilidade entre os equipamentos que seguiam o padrão (mais novos) e os equipamentos mais velhos (do início da implementação do padrão Gigabit Ethernet). Hoje todos os fabricantes implementam corretamente (ou pelo menos deveriam implementar) o padrão estabelecido pelo IEEE em 1998.

segunda-feira, 18 de fevereiro de 2008

Path MTU Discovery (PMTUD)

Se durante uma comunicação alguma estação enviar pacotes IP maiores do que a rede pode suportar, ou seja, maiores que o menor MTU (Maximum Transmission Unit) do caminho, então será necessário que haja algum mecanismo para avisar que esta estação deverá diminuir o tamanho dos pacotes para que a comunicação ocorra com sucesso.


O processo interativo de envio de pacotes em determinados tamanhos, a resposta dos roteadores intermediários (possivelmente com pacotes do tipo ICMP Packet Too Big) e a adequação do tamanho dos pacotes posteriores é chamada de Path MTU Discovery ou PMTUD. No entanto, este processo pode não ser tão simples quanto parece pois, devido a má configuração dos equipamentos de rede intermediários, podem ocorrer problemas neste mecanismo. Os principais problemas estão relacionados à má configuração dos roteadores intermediários (por exemplo, configurando um bloqueio para todos os tipos de mensagens ICMP), a utilização de endereçamento IP inválido (que impede que os roteadores enviem o ICMP Packet Too Big para origem e consequentemente o ajuste do MTU na origem) ou até mesmo bugs no software dos equipamentos envolvidos na comunicação.

Para determinar o MTU de um caminho (dentre outras coisas) podemos utilizar o software scamper, que funciona em plataforma *BSD, Linux, SunOS ou Mac OS X. O mecanismo proposto para determinar o MTU do caminho e mais detalhes sobre esta ferramenta podem ser encontrados neste artigo publicado pela USENIX em 2005. Abaixo está a saída de um comando disparado na tentativa de inferir o MTU do caminho:
host:~/$ sudo ./scamper -c "trace -M" -i 201.6.0.2
traceroute from 192.168.x.y to 201.6.0.2
1 201.6.197.110 0.983 ms [mtu: 1500]
2 201.6.192.1 13.632 ms [mtu: 1500]
3 201.6.0.2 13.320 ms [mtu: 1500]
Outra dica interessante sobre o MTU é o artigo de Ivan Pepelnjak, The Never-Ending Story of IP Fragmentation, cuja leitura é extremamente recomendada.

domingo, 17 de fevereiro de 2008

NANOG 42

Continuando as conferências ao redor do mundo, começou hoje e vai até o próximo dia 20 a NANOG 42 em San Jose, CA.

A NANOG (conferência do North American Network Operators' Group ou grupo de operação de redes da américa do norte) acontece tradicionalmente três vezes ao ano e - principalmente para os brazucas que vivem e trabalham no Brasil - pode ser acompanhada via web streaming.

Para mais informações, pode-se consultar a agenda do evento ou a página oficial da NANOG.

quinta-feira, 13 de dezembro de 2007

ICMP Type and Codes

URL interessante para consulta de tipos de pacotes ICMP. Muito útil para análise de problemas de rede http://www.iana.org/assignments/icmp-parameters

quinta-feira, 29 de novembro de 2007

ARP e ARP Flux

O protocolo ARP (Address Resolution Protocol) é utilizado para mapear endereços IP-para-ethernet e é tão utilizado que é quase impossível encontrar redes que utilizem um outro mecanismo para mapear endereços IP-para-ethernet (por exemplo, o mapeamento estático).


Quando uma estação deseja enviar um pacote para outra estação ou gateway de uma rede, é necessário, além de conhecer o endereço IP de destino, saber qual é o endereço ethernet (MAC address) de destino. Neste momento o protocolo ARP é acionado para encontrar a partir de um endereço IP o endereço ethernet correspondente.

Se o host-192-168-0-9 deseja enviar um datagrama IP para o host-192-168-0-100 então é necessário primeiro conhecer o endereço ethernet (mac address), que no exemplo abaixo é "00:0e:35:50:xx:xx":

host-192-168-0-9:~ $ tcpdump -ni en1 arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on en1, link-type EN10MB (Ethernet), capture size 96 bytes
00:28:34.090647 arp who-has 192.168.0.100 tell 192.168.0.9
00:28:34.094124 arp reply 192.168.0.100 is-at 00:0e:35:50:xx:xx

Até aqui tudo normal. 

Quando um host com linux instalado possui duas ou mais interfaces de rede conectadas a um mesmo segmento de rede, podem ocorrer problemas com o mapeamento entre os endereços de camada 2 (ethernet) e camada 3 (IP). Isso ocorre pois o host responderá uma requisição ARP pelas duas interfaces de rede. Este comportamento pode gerar confusão na tabela de ARP do host que disparou a requisição ARP. Este comportamento é chamado de ARP Flux. É importante ressaltar também que este comportamento somente irá ocorrer quando duas ou mais interfaces estiverem conectadas à um mesmo segmento de rede (mesmo domínio de broadcast).

Um exemplo de ARP Flux:

[root@real-client]# arping -I eth0 -c 3 10.10.20.67
ARPING 10.10.20.67 from 10.10.20.33 eth0
Unicast reply from 10.10.20.67 [00:80:C8:7E:71:D4]  11.298ms
Unicast reply from 10.10.20.67 [00:80:C8:E8:1E:FC]  12.077ms
Unicast reply from 10.10.20.67 [00:80:C8:E8:1E:FC]  1.542ms
Unicast reply from 10.10.20.67 [00:80:C8:E8:1E:FC]  1.547ms
Sent 3 probes (1 broadcast(s))
Received 4 response(s)

Note que para um mesmo endereço IP há duas respostas com dois endereços ethernet distintos. Como não é possível saber qual das respostas será processada primeiro pelo host que disparou a requisição é possível que o endereço errado seja incluído na tabela ARP e a comunicação entre os dois hosts não aconteça.

Há basicamente quatro maneiras diferentes de resolver este problema. No kernel 2.4 pode-se utilizar a opção arp_filter do sysctl. Nos kernels 2.2 é necessário utilizar a opção hidden do systcl. Estas duas opções controlam a forma como são tratadas as requisições ARP por interface. 

As outras soluções envolvem a utilização do a ferramenta ip arp e a opção noarp route flag. A ferramenta ip arp e a filtragem do protocolo ARP está documentada aqui.

Como utilizar a opção arp_filter?

Basicamente a utilização da opção arp_filter (/proc/sys/net/ipv4/conf/$DEV/arp_filter) faz com que um host utilize a tabela de roteamento para encontrar por qual interface o mesmo deve encaminhar a resposta de uma requisição ARP, ao invés da opção padrão de encaminhar a resposta por TODAS as interfaces.

De modo geral, a utilização da opção arp_filter resolve o problema de ARP Flux e pode gerar problemas somente em cenários mais complexos onde é necessário controlar de forma mais detalhada as requisições e respostas do protocolo ARP.

Para alterar esta opção podemos utilizar "o bom e velho" echo, por exemplo, para a interface eth0:

user@host-192-168-0-9:~ $ echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_filter

Para mais informações sobre o protocolo ARP e o problema do ARP Flux, consultar este material (em inglês).

sexta-feira, 17 de agosto de 2007

Rancid e Fortinet

Para aqueles que como eu necessitam fazer backup da configuração de equipamentos da Fortinet, Daniel Epstein (thanks Daniel!!!) publicou na lista oficial do Rancid um patch para ser aplicado no Rancid para que o mesmo possa fazer backups dos Fortigate Firewalls rodando FortiOS 2.8 e 3.0.

Basicamente é utilizado os scripts do Netscreen (nlogin) para criar novos scripts para o Fortinet (fnlogin). Também precisei instalar a versão de desenvolvimento do Rancid (versão rancid-2.3.2a6) que foi testada no Debian pelo próprio Daniel e por mim no FreeBSD (instalando o Rancid via ports rancid-devel e depois aplicando o patch).

O Rancid, para aqueles que ainda não conhecem esta ferramenta, é um software para fazer backup e controle de configuração de equipamentos de rede que funciona com equipamentos dos principais fabricantes, dentre eles Cisco, Juniper, Extreme, Alteon, Force10, etc. Para saber mais, basta conferir o tutorial detalhado de como instalar e configurar o Rancid.

terça-feira, 7 de agosto de 2007

NAT Traversal

NAT ou Network Address Translation é, de uma forma muito simples, a tradução do endereço IP. Esta tradução pode ocorrer por muitos motivos, mas principalmente para que estações utilizando endereçamento privado (RFC 1918) acessem à Internet. Dessa forma, se a estação 10.10.10.1 necessita acessar um servidor na Internet, então será necessário traduzir o endereço 10.10.10.1 para um endereço publicamente conhecido. Como os principais protocolos de transporte (no caso, TCP e UDP) utilizam o conceito de multiplexação através de portas de origem e destino, então podemos utilizar somente um endereço IP público para traduzir vários endereços privados (NAT masquerade ou NAT Hide), utilizando portas diferentes e armazenando todas estas informações em uma tabela de conexões.

Entretanto, o protocolo ESP (utilizado no IPSEC) não utiliza o mesmo conceito de portas utilizado nos protocolos TCP e UDP e, portanto, não é possível fazer a tradução de endereço e utilizar a informação de portas de origem e destino como forma de multiplexação das conexões. Para que uma conexão VPN funcione quando existe um equipamento fazendo NAT (Hide ou muitos-para-um) entre os pontos que estão estabelecendo a VPN é necessário que haja um mecanismo para garantir que os pacotes serão traduzidos adequadamente, desde a origem até o destino final. Este mecanismo é chamado de NAT Traversal.

De uma forma bem simples, o NAT Traversal primeiramente verifica se os dois equipamentos que estão estabelecendo a conexão possuem suporte para NAT Traversal, em seguida os dois equipamentos devem detectar se existe ou não a tradução de endereços. Por fim, deve-se negociar os parâmetros do protocolo (portas utilizadas para encapsulamento, utilização de cookies, etc) e em seguida iniciar a transmissão de dados utilizando pacotes encapsulados. Todo este processo esta descrito no RFC 3947 - Negotiation of NAT-Traversal in the IKE.

Este recurso pode ser utilizado com conexões VPN do tipo gateway-to-gateway ou client-to-gateway e deve ser verificado na documentação do equipamento se o mesmo suporta NAT Traversal ou UDP Encapsulation (expressão também utilizada por alguns fabricantes).

sexta-feira, 20 de julho de 2007

CEF load-sharing

Existem basicamente duas formas de fazer o balanceamento de tráfego utilizando o CEF (Cisco Express Forwarding): per-packet ou per-destination. Enquanto o balanceamento per-packet é utilizado para balancear igualmente dois links, a principal vantagem de balancear utilizando a configuração per-destination é que o tráfego de aplicações sensíveis a jitter (por exemplo Voz sobre IP) não corre o risco de ter alguns de seus pacotes com maior delay do que outros, o que pode acontecer quando o delay de um caminho é maior do que o delay do outro caminho. A solução que promete resolver alguns destes problemas é utilizar o balanceamento per-port, ou seja, é possível distribuir mais igualmente o tráfego entre os caminhos redundantes sem perda de qualidade para aplicações como VoIP.

Em sua configuração padrão, o Cisco IOS com CEF habilitado trabalha com balanceamento por destino (per-destination) para dois caminhos que tenham a mesma métrica. Para habilitar o balanceamento por pacote, temos que entrar com o comando "ip load-sharing per-packet" nas interfaces de destino do caminho redundante; por exemplo, se a rede 10.10.10.0/24 pode ser alcançada pelas interfaces FastEthernet0/0 e Serial0/0, então devemos entrar com o comando nas interfaces:

Cisco(config)# int fa0/0
Cisco(config-if)# ip load-sharing per-packet
Cisco(config-if)# int ser0/0
Cisco(config-if)# ip load-sharing per-packet
Para verificar o resultado destas alterações, podemos utilizar o comando abaixo ou ainda o "show ip cef 10.10.10.1 internal". Para mais detalhes, consultar a documentação oficial da Cisco para troubleshooting de caminhos redundantes utilizando o CEF.
Cisco#show ip cef 10.10.10.1 detail
10.10.10.0/24 version 7920, per-packet sharing
0 packets, 0 bytes
via 10.2.2.2, FastEthernet0/0, 0 dependencies
traffic share 1, current path
next hop 10.2.2.2, FastEthernet0/0
valid adjacency
via 10.1.1.1, Serial0/0, 0 dependencies
traffic share 1
next hop 10.1.1.1, Serial0/0
valid adjacency
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
A partir da versão 12.4(11)T do IOS, a Cisco incluiu o suporte a Per-port CEF load-sharing, ou seja, a função hash para balanceamento de carga utilizando CEF pode utilizar as informações de número de porta TCP ou UDP (camada 4) para determinar o rota.

Para habilitar o balanceamento per-port, deve-se utilizar o comando:
Cisco(config)# ip cef load-sharing algorithm include-ports source destination
E para verificar o caminho escolhido:
Cisco# show ip cef exact-route 10.0.0.10 src-port 35 192.168.0.2 dest-port 80
Para saber mais detalhes sobre esta nova feature basta consultar a documentação da versão 12.4 T aqui.

quarta-feira, 4 de julho de 2007

Cisco, DSL, PPPoE e o MTU

Depois de configurar um roteador Cisco para autenticar-se em um provedor utilizando PPPoE (mais tarde colocarei como fazer isso aqui também) muita gente pode não conseguir navegar "na Internet". A possível, e mais provável, causa desse problema é a limitação do tamanho máximo do MRU (maximum-receive-unit) definido no RFC2516 como 1492 bytes. Como o MTU (maximum transmission unit) dos segmentos ethernet é geralmente configurado para 1500 bytes, um pacote padrão ethernet não irá trafegar no enlace PPPoE, ou seja, entre o CPE (customer premises equipement) e o aggregator (equipamento do provedor que faz a terminação da conexão PPPoE, também conhecido como BRAS - Broadband Remote Access Server). Para mais detalhes da arquitetura do xDSL/PPPoE consultar este documento.

Dessa forma, mesmo que suas requisições consigam atravessar da sua rede interna para a Internet passando pelo seu enlace PPPoE (MTU menor que 1492 bytes) é muito provável que as respostas às suas requisições voltem em pacotes maiores que este tamanho e o equipamento aggregator da sua operadora irá descartar as respostas, montar e enviar pacotes ICMP informando a origem (neste caso o servidor) que os pacotes excederam o tamanho máximo permitido no segmento. Se o administrador do Firewall (antes do servidor) ou o administrador do próprio servidor configurou um bloqueio para todas as mensagens ICMP com destino o servidor, então a conexão não irá funcionar, pois o servidor não saberá que deve ajustar o tamanho dos pacotes para que os mesmos não sejam descartados no seu caminho de volta.

Para contornar este problema nos roteadores Cisco, existe um comando que pode ser utilizado para ajustar o campo MSS (maximum segment size) do cabeçalho TCP, permitindo que o servidor seja informado do tamanho máximo (MTU) das mensagens aceitas para determinado segmento. Para isso, devemos utilizar o comando "ip tcp adjust-mss 1492" na interface interna da rede.

Router(config)# interface fast 0
Router(config-if)# ip address 192.168.0.1 255.255.255.0
Router(config-if)# ip tcp adjust-mss 1452

Fica a lição de como contornar o problema e, principalmente, de como é importante entender cada tipo de mensagem do protocolo ICMP. Para mais detalhes sobre este problema, consulte este documento da Cisco. Mais detalhes também podem ser encontrados no RFC4638 (Accommodating a Maximum Transit Unit/Maximum Receive Unit (MTU/MRU) Greater Than 1492 in the Point-to-Point Protocol over Ethernet (PPPoE)) que mostra uma tentativa de padronizar um mecanismo para diminuir o impacto desta limitação nas novas redes banda larga.

quinta-feira, 28 de junho de 2007

Dica de site: Internet Health Report

Para quem ainda não conhece existe um site na Internet que fornece uma matriz na qual é possível visualizar como está a comunicação (perdas de pacote e tempo de resposta) entre os principais ISPs mundiais.

http://internethealthreport.com/

segunda-feira, 26 de fevereiro de 2007

Simulando roteadores Cisco com Dynagen

Apesar de ser somente uma pequena nota sobre um um software de simulação, o post sobre Dynamips é o mais visitado deste blog. Por isso, achei interessante explicar com maiores detalhes o funcionamento do Dynamips e do Dynagen. Para tornar tudo ainda mais fácil, os exemplos que mostrarei abaixo serão todos baseados no dynamips/dynagen para Windows, mas os mesmos funcionam igualmente no Linux (ou até melhor... quem sabe? Mais adiante discutiremos sobre isso também).

Dynamips é um software de código-aberto escrito por Christophe Fillot para simular um roteador 7200 em um PC comum utilizando um processador MIPS. Com este software é possível simular um IOS diretamente no PC - por este motivo o Dynamips necessita de uma imagem do Cisco IOS para funcionar. Atualmente o Dynamips suporta as plataformas 2600, 3600 e 7200 de roteadores Cisco e ainda vários tipos de módulos para estas plataformas.

Para utilizar o Dynamips, por exemplo, para simular uma rede de 4 roteadores interconectados entre si, era necessário mapear em cada instância do Dynamips as interfaces de interconexão utilizando portas UDP. Para facilitar este trabalho de mapeamento Greg Anuzelli desenvolveu um front-end para o Dynamips chamado Dynagen. Com o Dynagen o mapeamento das interconexões é automático: basta definir em um arquivo de configuração qual interface de um roteador conecta-se a outro roteador. Para saber mais detalhes sobre o Dynagen, consulte este tutorial escrito pelo próprio Greg Anuzelli.

Alguns centros especializados em treinamento para as certificações Cisco já disponibilizam laboratórios pré-configurados - ou seja, um arquivo de configuração do Dynagen - para treinamentos e exercícios em um laboratório virtual. Por exemplo, o arquivo do laboratório virtual do Internetwork Expert pode ser pego aqui e do IE Mentor aqui. Estes dois exemplos anteriores foram especialmente desenvolvidos para provas do CCIE.

Desta vez iremos instalar o laboratório do Internetwork Expert. A primeira medida é ter o Dynagen instalado na máquina. Para isso, você deve fazer o download e instalar o Dynagen e a biblioteca libpcap - como estamos no Windows, iremos baixá-la com o nome de Winpcap. Em seguida será necessário pegar a imagem do IOS e descompactá-la com o PKUNZIP ou Winrar (no windows) ou o unzip do Linux. Neste exemplo, iremos utilizar a imagem c3640-is-mz.123-14.T7.bin e descompactá-la no Linux.

$ unzip c3640-is-mz.123-14.T7.bin && mv image.bin c3640-is-mz.123-14.T7.extracted.bin
Coloque a imagem no diretório C:\Program Files\Dynamips\images. Em seguida, você deve rodar o Dynamips com esta imagem (com qualquer configuração de módulos) para descobrir qual é o valor do idle-pc para esta imagem. Para isso, utilizei o comando "C:\Program Files\Dynamips>dynamips.exe -P 3600 images\c3640-is-mz.123-14.T7.extracted.bin" e aguardei o término do processo de boot da imagem. Note que a CPU do seu PC estará constantemente em 100% pois não carregamos o valor do idle-pc no boot da imagem. Para descobrirmos este valor é necessário entrar com a seqüência de break e em seguida pressionar a tecla "i" durante a execução do simulador. No windows a seqüência de break é "Ctrl+ç"e em seguida "i". Pode ser também a combinação "Ctrl+]" e depois "i".
Router>
Please wait while gathering statistics...
Done. Suggested idling PC:
0x605c057c (count=54)
0x605f1cf0 (count=22)
0x605f1d10 (count=46)
0x605f1ed8 (count=32)
0x605f1f3c (count=27)
0x605f2010 (count=69)
0x606a23fc (count=42)
0x606a2478 (count=21)
0x605f2814 (count=23)
0x605f2850 (count=27)
Restart the emulator with "--idle-pc=0x605c057c" (for example)
Agora podemos testar a imagem com algum dos valores que foram descobertos e verificar que a CPU não está mais constantemente em 100%. Esse procedimento é necessário quando precisamos rodar vários roteadores em um mesmo PC e não queremos esperar vários dias para sair do modo exec e entrar no modo de configuração de um dos roteadores...

Agora ajustamos o arquivo com as configurações do laboratório para refletir o nome da imagem e o valor do idle-pc da imagem que acabamos de testar. Temos que editar o arquivo ie.routing.and.switching.topology.4.00.net e atualizar todas as entradas do nome da imagem e idle-pc.

image = C:\Program Files\Dynamips\images\c3640-is-mz.123-14.T7.extracted.bin
idlepc = 0x605c057c

É importante também ter uma forma de conectar na console de cada um dos equipamentos que serão simulados. Para isso a sugestão para este laboratório é criar uma interface de loopback (para saber como fazer no Windows clique aqui) e atribuir o IP 169.254.0.1/16. Temos que descobrir o endereço de hardware desta interface de loopback com o comando "dynamips -e" - algo como {4065B11C-2A6C-4FD2-8204-A12A9A8328A4} - e atualizar este endereço no arquivo de configuração do laboratório para o último roteador - TermServ - que será nosso servidor de console para todos os outros equipamentos.

Para finalizar, iniciamos duas instâncias do dynamips para suportar todo o laboratório:

C:\Program Files\Dynamips>dynamips.exe -H 7200
C:\Program Files\Dynamips>dynamips.exe -H 7201
E depois iniciamos o Dynagen carregando o arquivo de configuração do latoratório.

C:\Program Files\Dynamips>dynagen.exe sample_labs\internetworkexpert\ie.routing.
and.switching.topology.4.00.net

Reading configuration file...


Network successfully started

Dynagen management console for Dynamips

=> list
Name Type State Server Console
TermServ 3640 stopped localhost:7201 2000
R1 3640 stopped localhost:7200 2001
R2 3640 stopped localhost:7200 2002
R3 3640 stopped localhost:7200 2003
R4 3640 stopped localhost:7200 2004
R5 3640 stopped localhost:7200 2005
R6 3640 stopped localhost:7200 2006
SW1 3640 stopped localhost:7200 2007
SW2 3640 stopped localhost:7201 2008
SW3 3640 stopped localhost:7201 2009
SW4 3640 stopped localhost:7201 2010
BB1 3640 stopped localhost:7201 2011
BB2 3640 stopped localhost:7201 2012
BB3 3640 stopped localhost:7201 2013
FRSW FRSW n/a localhost:7201 n/a
=> start TermServ
100-C3600 'TermServ' started
=>

Agora você poderá iniciar cada um dos equipamentos e conectar nos mesmos para testar as mais diferentes configurações. Depois de iniciar o roteador TermServ, pode-se utilizar o telnet para conectar no TermServ e depois na console de cada um dos equipamentos do laboratório.

C:\telnet 169.254.0.2

TermServ>
Agora temos um laboratório virtual de roteadores para testar e simular os mais diferentes ambientes.

O Dynagen pode trabalhar com instâncias do Dynamips rodando em máquinas diferentes, permitindo simular redes de roteadores ainda maiores distribuindo a carga entre máquinas distintas. Se esta for a sua idéia, então é aconselhável a utilização do Linux, já que o Windows não trabalha muito bem com processos que ocupam mais de 2 GB de memória RAM e sabe-se que tem problemas de desempenho depois de uma certa quantidade de roteadores. Mais informações sobre o Dynamips podem ser encontradas no Forum 7200emu.hacki.at ou ainda no blog do Christophe Fillot, autor do Dynamips.

UPDATE (16-fev-2008): Veja também o post sobre o GNS3.

sexta-feira, 23 de fevereiro de 2007

Performance em conexões tcp

Um problema que muitos administradores de rede encontram é quando há reclamações de performance em conectividade. Escrevi um programinha para realizar testes de conexões em modo paralelo e sequencial, um programa em C muito simples, pode ser baixado neste link
Basta compilar com suporte a pthread com o comando abaixo:

gcc multiconnect.c -o multiconnect -lpthread


Syntax: ./multiconnect hostname port [connections]
Se não for passado o número de conexões, o default é 100.

Ele mede a performance em microsegundos já converte para segundos.

segunda-feira, 12 de fevereiro de 2007

Rancid: Ferramenta para Controle de Configuração de Equipamentos de Redes

Disclaimer: É claro que todos nós fazemos backups regulares dos equipamentos que administramos. Também temos uma ferramenta prática e amigável para controlar as alterações de configuração e, até por isso, eu acho que este post não será tão útil...

Rancid - Really Awesome New Cisco confIg Differ - é um programa que pode ser utilizado para realizar backups e controle de versões de configuração de forma simples e rápida e não somente de equipamentos Cisco (como pode parecer pelo nome). Atualmente o Rancid faz backups de equipamentos Cisco, Extreme, Juniper, Nortel Alteon, etc. e pode rodar em FreeBSD, Linux ou MacOS X.

Esta ferramenta é muito utilizada e já foi comentada em pelo menos duas reuniões da NANOG - uma apresentação e um tutorial. Sabe-se que o Rancid é utilizado como ferramente de backup nas empresas: AOL, Global Crossing, MFN, NTT America, Certainty Solutions Inc.

Em linhas gerais o Rancid realiza os seguintes procedimentos:
- Efetua login nos equipamentos listados no arquivo router.db;
- Roda alguns comandos em busca de informações específicas por tipo de equipamento;
- Formata as saídas dos comandos;
- Envia as diferenças para um e-mail;
- Salva as diferenças em uma base para controle de versões (CVS).

O primeiro passo para ter funcionando o Rancid é fazer um instalação: 1) através do código-fonte ou 2) através do ports do FreeBSD. No caso deste exemplo, estamos utilizando a opção 2 (ports do FreeBSD). Existem também algumas depedências que devem ser instaladas para o correto funcionamento, tais como: gcc, make ;-), cvs, perl, expect e diffutils. Eu ainda precisei instalar para este exemplo o cvsweb e viewcvs (todos disponíveis no ports):

cd /usr/ports/net-mgmt/rancid && make install clean
cd /usr/ports/devel/cvsweb && make install clean
cd /usr/ports/devel/viewcvs && make install clean

O primeiro arquivo que deve ser configurado é o rancid.conf - no exemplo, este arquivo está no diretório /usr/local/etc/rancid. Neste arquivo iremos incluir um grupo de equipamentos, configurar o diretório de trabalho do Rancid (onde armazenaremos as informações de backup) e o diretório raíz do CVS e opcionalmente um e-mail para enviar as diferenças de configuração. As opções que utilizaremos são:

BASEDIR=/usr/local/var/rancid; export BASEDIR
CVSROOT=$BASEDIR/CVS; export CVSROOT
LIST_OF_GROUPS="backbone"

Podemos utilizar diversos grupos e, para isso, basta copiar a mesma configuração que iremos fazer para o grupo backbone para os demais.

É extremamente aconselhável que o Rancid rode a partir de um usuário sem privilégios e dedicado para o rancid. Neste exemplo criamos um usuário rancid que será responsável por rodar o Rancid e armazenar as informações de login no arquivo $HOME/.cloginrc.

O arquivo .cloginrc é o arquivo que armazena as informações de controle de acesso para os equipamentos. Este arquivo deve ser criado no diretório home do usuário que irá rodar o Rancid, sempre lembrando que somente o usuário rancid terá permissão para ler e escrever neste arquivo. A sintaxe do arquivo é a seguinte:

$ more /home/rancid/.cloginrc
add password cisco_router
add password cisco_switch

add password extreme_switch
add autoenable extreme_switch 1
add user extreme_switch

Para mais informações sobre a sintaxe deste arquivo, consulte a documentação oficial do cloginrc.

É importante criar a árvore de diretórios para os backups e para o CVS. Para isso devemos executar o script rancid-cvs que está no diretório /usr/local/bin/rancid-cvs. Em nosso exemplo, este script irá criar uma árvore de diretórios para o grupo backbone dentro do diretório $BASEDIR e $CVSROOT (definido no arquivo rancid.conf).

$ cd /usr/local/var/rancid
$ /usr/local/bin/rancid-cvs

Em seguida, é necessário fornecer informações para que o Rancid inicie o backup dos equipamentos e é importante informar quais equipamentos e de que fabricante estes equipamentos são no arquivo router.db. A sintaxe deste arquivo é muito simples e pode ser consultada aqui. O modelo que iremos utilizar é:

$ cd /usr/local/var/rancid/backbone/
$ more router.db
cisco_router:cisco:up
cisco_switch:cat5:up
extreme_switch:extreme:up

É importante notar que os switches Cisco que roda IOS devem ser cadastrados como tipo "cisco". Para que o Rancid conecte corretamente nos equipamentos é necessário que o nome cisco_switch, extreme_switch, etc resolva para um endereço IP; que pode ser por DNS ou através do arquivo /etc/hosts.

Para testar as configurações basta rodar o script rancid-run. Se os arquivos de log (em /usr/local/var/backbone/log) e os arquivos de configuração (em /usr/local/var/backbone/configs) estiverem OK, então basta incluir uma entrada na crontab do usuário rancid para rodar o script periodicamente. Como exemplo, estamos rodando todos os dias às 3:00 horas da manhã:

$ crontab -l
0 3 * * * /usr/local/bin/rancid-run

Se o apache estiver funcionando corretamente, então será possível acessar as configurações através de um página web (utilizando o cvsweb). Basta incluir o caminho para o diretório $CVSROOT (definido no rancid.conf) no arquivo de configuração do cvsweb (/usr/local/etc/cvsweb/cvsweb.conf) conforme o exemplo abaixo e acessar a URL: http://servidorancid/cgi-bin/cvsweb.cgi.

[ snip! ]
@CVSrepositories = (
'local' => ['My CVS Repository', '/usr/local/var/rancid/CVS'],
[ snip!]

Pode-se obter mais informações sobre o Rancid na página oficial dos desenvolvedores.

quinta-feira, 8 de fevereiro de 2007

Testando o tempo de resposta de páginas web

Frequentemente nos deparamos com um problema de lentidão onde é preciso saber onde esta o problema. Resolução de DNS? Tempo de resposta da rede? Tempo de resposta da aplicação?

Uma excelente ferramenta para realizar testes e descobrir onde está o problema é o curl. Ele consegue nos retornar o tempo gasto em cada uma dos seguintes processos: Tempo de resolução de nomes; tempo de conexão tcp (handshake); tempo total de resposta da página (soma dos demais tempo e aplicação).

Abaixo segue um exemplo de utilização do mesmo:

curl -w "NameLookup: %{time_namelookup}\\nTimeConnect: %{time_connect}\\nTimeTotal %{time_total}\\n" -s http://www.google.com.br -o /dev/null


Este comando deve retornar essa resposta:

NameLookup: 0.002
TimeConnect: 0.152
TimeTotal 0.309

Se preciso, pode-se gerar uma lista com os tempos de resposta para ser colocado em uma planilha ou gráfico:
while true;
do
curl -w %{time_namelookup}-%{time_connect}-%{time_total}\\n -s http://www.teste-site.com.br -o /dev/null >> teste_site.txt;
sleep 1;
done

sábado, 20 de janeiro de 2007

Whois centralizado

O time da Cymru (http://www.cymru.com/) está disponibilizando gratuitamente no link abaixo uma ferramenta de whois centralizado que vai facilitar em muito as identificações de AS numbers de origem. As informações são atualizadas de 4 em 4 horas o que confere grande credibilidade as informações divulgadas e o mais interessante é que ele permite mostrar também as informações das entidades que um determinado AS faz peering.

https://asn.cymru.com/cgi-bin/whois.cgi

Maiores informações de como utilizar as ferramentas podem ser encontradas em:

http://www.cymru.com/BGP/asnlookup.html

Gerenciando a alocação de endereços IP

Para quem procura uma ferramenta free para o gerenciamento e alocação de blocos IP, recomendo o NorthStar. Ele é bem simples de utilizar e é escrito em PERL, o que indica que pode ser portado sem maiores problemas para a grande maioria das plataformas.

Para quem se interessar existe um demo online para avaliação da ferramenta (mas infelizmente nem sempre está no ar :P ). Por isso, instalem!

terça-feira, 2 de janeiro de 2007

Traceroute for Dummies

Disclaimer: Os exemplos deste post não refletem a realidade.

A ferramenta traceroute é utilizada para determinar o caminho (ou rota) por onde os pacotes IP trafegam de uma origem A até um destino B na rede. No entanto, a forma como esta ferramenta é utilizada e como são determinadas as rotas na Internet pode confundir o usuário desatento.

O traceroute funciona enviando pacotes com o campo Time To Live (TTL) configurado para 1. O primeiro roteador (primeiro hop) envia então um pacote (ICMP) indicando que o pacote não pode ser roteado (devido ter expirado o TTL) para a origem. Após receber a indicação de erro, um outro pacote é enviado com o TTL configurado para 2 e o segundo roteador (segundo hop) neste momento enviará uma indicação de erro para a origem. Esse processo continua até que se alcance o destino ou um limite pré-determinado. Para mais informações sobre o funcionamento do traceroute consultar o RFC1393.

Uma das desvantagens deste mecanismo é que existem alguns roteadores (ou firewalls de camada 3) que não enviam pacotes ICMP TTL Expiried e, portanto, o traceroute ficará incompleto nestes casos. No entanto, o mecanismo do traceroute continuará funcionando ou mesmo o acesso da origem até o destino independentemente do resultado do traceroute.

Vejamos então o exemplo abaixo:

traceroute to registro.br (200.160.2.3), 30 hops max, 38 byte packets
1 10.13.0.1 (10.13.0.1) 13.016 ms 14.776 ms 20.168
ms
2 c9060002.virtua.com.br (201.6.0.2) 26.941 ms 12.479 ms 47.129 ms
3 c9060005.virtua.com.br (201.6.0.5) 15.636 ms 15.005 ms 13.898 ms
4 embratel-G6-0-gacc05.spo.embratel.net.br (200.178.78.1) 25.453 ms 12.044 ms 12.600 ms
5 ebt-C1-core03.spo.embratel.net.br (200.230.242.18) 166.976 ms 152.516 ms 59.465 ms
MPLS Label=440 CoS=0 TTL=1 S=1
6 200.244.40.185 (200.244.40.185) 25.348 ms 32.426 ms 45.846 ms
MPLS Label=26 CoS=0 TTL=1 S=1
7 ebt-G6-0-gacc02.pae.embratel.net.br (200.230.221.130) 34.828 ms 26.831 ms 40.176 ms
8 brasiltelecom-P4-1-gacc02.pae.embratel.net.br (200.248.240.26) 51.079 ms 40.072 ms 35.036 ms
9 BrT-G7-1-1-pae-core01.brasiltelecom.net.br (201.10.225.29) 173.797 ms 70.255 ms 48.286 ms
MPLS Label=836 CoS=0 TTL=1 S=1
10 BrT-G3-0-bsace-core01.brasiltelecom.net.br (201.10.192.33) 50.676 ms 61.465 ms 49.934 ms
MPLS Label=898 CoS=0 TTL=1 S=1

11 BrT-P2-11-spopa-core01.brasiltelecom.net.br (201.10.192.169) 61.742 ms 54.972 ms 72.244 ms
MPLS Label=35 CoS=0 TTL=1 S=1
12 BrT-G0-1-2-spopa302.brasiltelecom.net.br (201.10.241.150) 47.699 ms 86.113 ms 79.095 ms
13 BRT-RegistroBR.brasiltelecom.net.br (200.169.193.2) 55.980 ms 52.105 ms 71.012 ms
14 registro.br (200.160.2.3) 58.213 ms 49.184 ms 70.845 ms

Este traceroute, feito de um acesso net/virtua para um IP do registro.br, mostra por onde os pacotes devem passar para sair do meu computador até os servidores do Registro.br: net/virtua, embratel, brasiltelecom e finalmente, registro.br. Observe o caminho de ida traçado em verde e o caminho de volta (do registro.br para o meu computador) destacado em vermelho. Este caminho destacado em vermelho é a interconexão entre NET e Registro.br através do PTT-Metro.

Desta figura podemos rapidamente chegar a duas conclusões importantes:

1) O tempo total apresentado nos pacotes de A (net/virtua) até B (registro.br) é o tempo de ida (destacado em verde) adicionado ao tempo de volta (em vermelho).

2) Sabendo que o tempo total é o tempo de ida + volta, então também devemos admitir que, dada a política de roteamento adotada por cada provedor presente na rede, o pacote de resposta para cada um dos hops pode retornar por caminhos diferentes do caminho de ida e, portanto, o tempo apresentado por cada hop pode sofrer influência de outros caminhos que não aquele que podemos visualizar na saída do traceroute (caminho de ida).

Por exemplo, se observarmos atentamente as conexões da figura acima veremos que a embratel possui uma conexão com a globalcrossing (gblx) que, por sua vez, possui uma conexão com a net/virtua. Em um determinado momento os pacotes da embratel até a net/virtua podem (devido a política de roteamento adotada pela embratel) trafegar pela gblx e, portanto, o tempo da net/virtua até a embratel será a soma do tempo de ida (net/virtua até embratel) e do tempo de volta (embratel até net/virtua, passando pela gblx). A observação de um tempo de resposta elevado no hop embratel poderá portanto indicar um problema na net/virtua, embratel ou gblx.

A ferramenta traceroute pode ser facilmente utilizada nos principais sistemas operacionais disponíveis (unix/linux ou windows). No unix/linux o traceroute utiliza geralmente pacotes UDP (utilizar opção "-I" para pacotes ICMP) e no windows o tracert utiliza pacotes ICMP. Além disso, podemos utilizar front-ends disponíveis na web para obter o resultado da ferramenta traceroute - dentre outras ferramentas - para analisar problemas de rede verificando o caminho de diversos provedores e lugares do mundo para um destino específico. Para mais informações acessar o website traceroute.org mantido por Thomas Kernen (thanks Thomas!).