Skip to main content

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.

205.2-Esquema_roteamento


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.

FlagDescrição
UA rota está UP.
GUsa Gateway.
HInforma ser um Host.
RRota estabelecida dinamicamente.
DRota instalada dinamicamente.
MRota modificada dinamicamente.
AInstalado pelo addrconf.
CEntrada 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 host 192.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âmetrosDescricao
-nNão faz resolução DNS.
-c $countFecha a captura depois de N pacotes.
-i $interfaceFaz a captura na interface escolhida.
-w arquivo.pcapSalva as capturas num arquivo.
src $IPBusca pelo IP de origem.
dst $IPBusca pelo IP de destino.
port $PortaBusca pela porta.
net $IP/$MASKBusca pela rede.
host $IP ou $NAMEBucas por IP ou pelo nome do host.
AND, OR ou AND NOT (AND !port...)Operador E e OU.
-vVerbose, quanto mais v mais verbose ainda, tipo -vvv.
-qGera 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.