205.2 Configurações Avançadas de Redes
Este tópico mostra algumas configurações avançadas de Redes.
Preparo do ambiente
Vou começar preparando um ambiente de testes que possui um router (Servidor Linux) e duas máquinas clientes. O router vai ter 3 interfaces de Rede, uma para a Internet, uma outra na rede 192.168.151.0/24 e outra na rede 192.168.161.0/24.
Cada host cliente vai residir numa das redes e ambos não podem se comunicar diretamente, para isso eles vão precisar passar pelo gw (gateway) que é o servidor que possui uma interface em cada rede.
Depois vou habilitar o roteamento de pacotes no gw para que ele possa fazer o forward de pacotes de uma rede para a outra e por fim vou habilitar o MASQUERADE para que as máquinas nessas redes possam sair para a Internet.
A imagem abaixo descreve o layout da Rede, documentando também os endereços de cada equipamento.
Como vou fazer tudo num ambiente com Vagrant, vou deixar o link para o Vagrantfile contendo toda a configuração, o ambiente já sobe pronto para uso.
Mesmo com todo o processo automatizado vou descrever o processo realizado:
## Na máquina GW (Gateway)!
# Primeiro habilite o forward de pacotes:
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
# Recarregue as regras:
sysctl -p /etc/sysctl.conf
# Ative a regra de mascaramento para liberar IP para a rede Interna:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Traceroute
Usado para verificar o caminho que um pacote está fazendo até o destino.
linux@gw:~$ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 _gateway (192.168.121.1) 0.344 ms 0.183 ms 0.314 ms
2 192.168.1.1 (192.168.1.1) 0.913 ms 1.103 ms 1.156 ms
3 186-230-221-117.ded.intelignet.com.br (186.230.221.117) 7.930 ms 8.228 ms 8.088 ms
4 10.192.254.14 (10.192.254.14) 8.911 ms 7.690 ms 7.461 ms
5 10.223.238.238 (10.223.238.238) 8.381 ms 10.223.238.236 (10.223.238.236) 12.105 ms 10.223.238.238 (10.223.238.238) 8.181 ms
6 209.85.149.4 (209.85.149.4) 8.746 ms 72.14.217.185 (72.14.217.185) 8.544 ms 209.85.149.4 (209.85.149.4) 8.065 ms
7 * * *
8 dns.google (8.8.8.8) 8.997 ms 8.360 ms 8.245 ms
Quando aparece alguns asterisco significa que o router não está aceitando a resolução.
PING
O ping é um comando que usa o protocolo icmp para enviar mensagens icmp do tipo ECHO_REQUEST e esperar uma resposta, essa resposta é um icmp do tipo ECHO_RESPONSE (em alguns lugares pode ver como ECHO_REPLY, ambos significam a mesma coisa).
Com isso é possível saber se um determinado dispositivo é alcançável e com isso determina-se se esse dispositivo está ativo ou não na rede.
Vereifique se a máquina net1 consegue se comunicar com a máquina net2:
# Pingue net2 a partir de net1:
linux@net1:~$ ping 192.168.200.10
ping: connect: Network is unreachable
# Pingue net1 a partir de net2:
linux@net2:~$ ping 192.168.100.10
ping: connect: Network is unreachable
Perceba que nenhuma das máquina pode alcançar a outra, mas isso não quer dizer que elas não estão ativas nesse caso, sabemos que estão, o problema aqui é que ambas as máquinas não conhecem rota para acessar o outro endereçamento.
Vamos ver as rotas que estão em ambas as máquinas, para isso veja a próxima sessão ROUTE.
As vezes ao pingar um destino vamos receber uma mensagem de
DUP
em alguns pacotes, como o exemplo abaixo:PING 192.168.1.255 (192.168.1.255): 56 data bytes
64 bytes from 192.168.1.19: icmp_seq=0 ttl=255 time=9.3 ms
64 bytes from 192.168.1.250: icmp_seq=0 ttl=255 time=78.8 ms (DUP!)
64 bytes from 192.168.1.250: icmp_seq=1 ttl=255 time=9.2 ms
64 bytes from 192.168.1.19: icmp_seq=1 ttl=255 time=43.5 ms (DUP!)
64 bytes from 192.168.1.250: icmp_seq=2 ttl=255 time=33.0 ms
64 bytes from 192.168.1.19: icmp_seq=2 ttl=255 time=86.8 ms (DUP!)
64 bytes from 192.168.1.250: icmp_seq=3 ttl=255 time=57.1 ms
64 bytes from 192.168.1.19: icmp_seq=3 ttl=255 time=91.5 ms (DUP!)Isso está relacionado a pacotes duplicados e danificados. O ping vai relatar pacotes duplicados e danificados quando os encontrar. Pacotes duplicados nunca devem ocorrer e parecem ser causados por retransmissões inadequadas no nível do enlace. Duplicatas podem ocorrer em muitas situações e raramente (ou nunca) são um bom sinal, embora a presença de baixos níveis de duplicatas nem sempre seja motivo de alarme.
Pacotes danificados são obviamente uma causa séria de alarme e geralmente indicam hardware quebrado em algum lugar no caminho do pacote de ping (na rede ou nos hosts).
ROUTE
O comando route é usado para exibir as rotas que estão na tabela de roteamento do Linux, esse é um comando defasado e não é mais fornecido junto com as distribuições como Ubuntu e Debian (para instalar esse comando, faça a instalação do pacote net-tools
).
Veja as rotas que estão em ambas as máquinas clientes:
linux@net1:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
linux@net2:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
# Usando o novo comando 'IP':
linux@net1:~$ ip route show
192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.10
linux@net2:~$ ip route show
192.168.200.0/24 dev eth1 proto kernel scope link src 192.168.200.10
Perceba que ambos os clientes só possuem rota para a sua respectiva rede e para que que possam se comunicar é necessário que cada um conheça a rede do outro (basicamente precisam saber como chegar até essa rede).
Antes de continuar com o desenrolar para conectar um cliente ao outro, vamos ver a saída desse mesmo comando no gw, isso vai ser útil para que possa explicar os tipos de flags gerados pelo comando route
.
linux@gw:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.121.1 0.0.0.0 UG 100 0 0 eth0
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.121.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.121.1 0.0.0.0 255.255.255.255 UH 100 0 0 eth0
192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
O parâmetro
-n
é para que o Linux não resolva os endereços IP no dns, dessa forma, irá mostrar apenas o IP.
Flag | Descrição |
---|---|
U | A rota está UP. |
G | Usa Gateway. |
H | Informa ser um Host. |
R | Rota estabelecida dinamicamente. |
D | Rota instalada dinamicamente. |
M | Rota modificada dinamicamente. |
A | Instalado pelo addrconf . |
C | Entrada de cache. |
! | Rota rejeitada. |
Gateway é um computador que fica entre diferentes redes, permitindo (ou não) que pacotes sejam trafegados de uma rede para a outra. O gateway converte informações, dados ou outras comunicações de um protocolo ou formato para outro.
Outro detalhe é que quanto menor o valor em
metric
mais prioritária a rota é, ou seja, entre duas rotas para o mesmo destino, uma com metric sendo 100 e outra sendo 50, por padrão o sistema vai preferir a rota com o valor de metric sendo 50.
Agora vamos criar as rotas, vamos começar com o cliente1 (está na rede1)
linux@net1:~$ sudo route add -net 192.168.200.0/24 gw 192.168.100.2
Basicamente informamos que para chegar na rede
192.168.200.0/24
ele deve passar pelo host192.168.100.1
que é um gateway.
Agora crie as rotas para o cliente2 (está na rede2):
linux@net2:~$ sudo route add -net 192.168.100.0/24 gw 192.168.200.2
Agora liste novamente as rotas:
linux@net1:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.200.0 192.168.100.2 255.255.255.0 UG 0 0 0 eth1
linux@net1:~$ ip route show
192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.10
192.168.200.0/24 via 192.168.100.2 dev eth1
linux@net2:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.0 192.168.200.2 255.255.255.0 UG 0 0 0 eth1
192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
linux@net2:~$ ip route show
192.168.100.0/24 via 192.168.200.2 dev eth1
192.168.200.0/24 dev eth1 proto kernel scope link src 192.168.200.10
Agora teste o ping entre as máquinas clientes:
linux@net1:~$ ping -c3 192.168.200.10
PING 192.168.200.10 (192.168.200.10) 56(84) bytes of data.
64 bytes from 192.168.200.10: icmp_seq=1 ttl=63 time=1.19 ms
64 bytes from 192.168.200.10: icmp_seq=2 ttl=63 time=1.30 ms
64 bytes from 192.168.200.10: icmp_seq=3 ttl=63 time=1.80 ms
--- 192.168.200.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 1.186/1.429/1.804/0.268 ms
linux@net2:~$ ping -c3 192.168.100.10
PING 192.168.100.10 (192.168.100.10) 56(84) bytes of data.
64 bytes from 192.168.100.10: icmp_seq=1 ttl=63 time=6.18 ms
64 bytes from 192.168.100.10: icmp_seq=2 ttl=63 time=2.19 ms
64 bytes from 192.168.100.10: icmp_seq=3 ttl=63 time=0.716 ms
--- 192.168.100.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.716/3.029/6.181/2.308 ms
Rota padrão
A rota padrão ou como é mais usado no dia a dia rota default (default em inglês significa padrão) é uma rota que é usada para enviar os pacotes quando não se conhece o destino, por exemplo, no nosso cenário as máquinas clientes não sabem como sair para a Internet, porque elas não possuem as rotas da Internet.
Nesse caso, para facilitar é configurado uma rota para que sempre que o host não conhecer esse destino ele envia para essa rota, normalmente essa rota aponta para o gateway da rede, mas em certos casos isso pode mudar. A rota padrão é sempre descrita como sendo 0.0.0.0/0
em IPv4 e para IPv6 pode ser descrita como send ::/0
.
Tente pingar o IP do dns do google:
linux@net1:~$ ping 8.8.8.8 -c3
ping: connect: Network is unreachable
Recebemos o mesmo erro informando que a Rede está inalcançável, adicione uma rota padrão e vamos testar novamente:
# Adicione a rota padrão apontando para o nosso GW:
linux@net1:~$ sudo ip route add default via 192.168.100.2 dev eth1
# Verifique as rotas novamente:
vagrant@net1:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.100.2 0.0.0.0 UG 0 0 0 eth1
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.200.0 192.168.100.2 255.255.255.0 UG 0 0 0 eth1
# Agora pingue novamente o IP do dns do google:
linux@net1:~$ ping 8.8.8.8 -c3
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=112 time=9.01 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=112 time=8.25 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=112 time=8.57 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 8.251/8.612/9.013/0.312 ms
NETCAT ou NC
É usado para testar conectividade na porta de um host, por exemplo, podemos ver se a porta 22 está aberta (verifica se tem algum daemon escutando na porta).
# Verifique se o cliente2 está com a porta 22 está aberta:
linux@net1:~$ nc -zv 192.168.200.10 22
Connection to 192.168.200.10 22 port [tcp/ssh] succeeded!
# Podemos determinar um range de porta:
linux@net1:~$ nc -zv 192.168.200.10 20-22
nc: connect to 192.168.200.10 port 20 (tcp) failed: Connection refused
nc: connect to 192.168.200.10 port 21 (tcp) failed: Connection refused
Connection to 192.168.200.10 22 port [tcp/ssh] succeeded!
Também podemos usar o nc
(ou netcat
ambas as nomeclaturas são referentes ao mesmo comando) para abrir portas, isso é útil para fazer testes.
# No servidor net2 abra uma porta:
linux@net2:~$ nc -l -p 1234
# Verifique se está aberta:
linux@net1:~$ nc -zv 192.168.200.10 1234
Connection to 192.168.200.10 1234 port [tcp/*] succeeded!
# Agora pare o 'nc' no net2 e teste novamente:
linux@net1:~$ nc -zv 192.168.200.10 1234
nc: connect to 192.168.200.10 port 1234 (tcp) failed: Connection refused
Isso acontece porque ao criar essa porta temporária o daemon do NC fica escutando na porta informada.
TCPDUMP
Usado para analisar o tráfego de rede a nível de pacote, é uma ferramenta usada somente via linha de comando. Para que se possa capturar o tráfego da rede a interface deve aceitar o modo promíscuo.
Veja alguns dos parâmetros mais usados.
Parâmetros | Descricao |
---|---|
-n | Não faz resolução DNS. |
-c $count | Fecha a captura depois de N pacotes. |
-i $interface | Faz a captura na interface escolhida. |
-w arquivo.pcap | Salva as capturas num arquivo. |
src $IP | Busca pelo IP de origem. |
dst $IP | Busca pelo IP de destino. |
port $Porta | Busca pela porta. |
net $IP/$MASK | Busca pela rede. |
host $IP ou $NAME | Bucas por IP ou pelo nome do host. |
AND, OR ou AND NOT (AND !port...) | Operador E e OU. |
-v | Verbose, quanto mais v mais verbose ainda, tipo -vvv . |
-q | Gera uma saída mais simplista. |
Vamos ver alguns exemplos:
# Faça a captura abaixo, mas pingue o endereço do site usando o cliente1:
linux@gw:~$ sudo tcpdump -n host www.nic.br -c 4
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
23:05:20.395044 IP 192.168.121.51 > 200.160.4.6: ICMP echo request, id 8, seq 1, length 64
23:05:20.402750 IP 200.160.4.6 > 192.168.121.51: ICMP echo reply, id 8, seq 1, length 64
23:05:21.396969 IP 192.168.121.51 > 200.160.4.6: ICMP echo request, id 8, seq 2, length 64
23:05:21.404176 IP 200.160.4.6 > 192.168.121.51: ICMP echo reply, id 8, seq 2, length 64
4 packets captured
8 packets received by filter
0 packets dropped by kernel
# A saída abaixo mostra que existe uma conexão ssh:
vagrant@gw:~$ sudo tcpdump -n -i eth1 src 192.168.100.10 -c6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:07:37.692551 IP 192.168.100.10.22 > 192.168.100.2.52460: Flags [P.], seq 97013810:97013870, ack 144828478, win 501, options [nop,nop,TS val 973067196 ecr 2822108253], length 60
23:07:37.929554 IP 192.168.100.10.22 > 192.168.100.2.52460: Flags [P.], seq 60:96, ack 37, win 501, options [nop,nop,TS val 973067433 ecr 2822108485], length 36
23:07:37.931248 IP 192.168.100.10.22 > 192.168.100.2.52460: Flags [P.], seq 96:188, ack 37, win 501, options [nop,nop,TS val 973067434 ecr 2822108491], length 92
23:07:37.931699 IP 192.168.100.10.22 > 192.168.100.2.52460: Flags [P.], seq 188:224, ack 37, win 501, options [nop,nop,TS val 973067435 ecr 2822108491], length 36
23:07:37.931702 IP 192.168.100.10 > 192.168.100.2: ICMP echo request, id 10, seq 1, length 64
23:07:37.932807 IP 192.168.100.10.22 > 192.168.100.2.52460: Flags [P.], seq 224:324, ack 37, win 501, options [nop,nop,TS val 973067436 ecr 2822108493], length 100
6 packets captured
7 packets received by filter
0 packets dropped by kernel
NETSTAT
Veja aqui.
SS
Veja aqui.
LSOF
Veja aqui.
NMAP
Veja aqui.