Você está na página 1de 30

Linux do zero

Roteamento
Roteamento
● Roteamento é o ato de mover pacotes IPs entre interfaces de rede (buffers);
● Um pacote IP é uma mensagem (pacote) contendo informações objetivas para sua distribuição:
○ IP de destino: apenas o IP de destino é relevante para o ato de roteamento;
○ IP de origem: contém o IP do remetente, não é usado no roteamento, a menos que haja PBR;
○ Protocolo: contém o código do protocolo que descreve o conteúdo (payload) do pacote IP, só é
relevante quando o pacote chega ao destino, para determinar qual software irá processar o
payload;
● Todo pacote IP é criado por um software no host emissor (IP de origem);
○ Todos os softwares criando e recebendo pacotes moram na "loopback";
○ Os softwares podem escolher qualquer IP local como ip de origem, independente de em qual
interface ele foi adicionado, afinal, todos os IPs configurados nas interfaces de rede pertencem ao
host local, que significa loopback, interfaces de rede sem associações físicas ou sem buffer de
saida remoto são consideradas interfaces loopbacks naturais, exemplo: interface lo, interfaces
dummy;
○ Pacotes criados por aplicações que abrem sockets (tomadas) com as camadas de baixo (tcp, udp,
sctp, icmp, ospf, …);
○ Pacotes criados pelo kernel: softwares rodando em kernel-mode (módulos do kernel), pacotes de
resposta das camadas geridas pelo kernel (tcp-reset, tcp-fin, icmp time-to-live-expired,
icmp-timestamp, ipv6-neighbor-discovery, etc…);

Nuva Soluções em TIC - http://www.nuva.com.br Página 4


Roteamento
● Criação de pacotes IP:

Linux - User Space Software


ping, telnet, ssh, wget, curl, ...
Sockets
netstat -tulpn
Loopback
lo, dummy, ...
tabela: local
Routing ip route show table local
ip rule show
Linux - Kernel Space tabela: main
ip route show table main
Interfaces
ip addr show

Hardware

Nuva Soluções em TIC - http://www.nuva.com.br Página 5


Roteamento Software
ping, telnet, ssh, wget, curl, ...

APPs Sockets
tcp/udp/sctp ports, icmp, ...

Kernel Sockets
Loopback lo icmp time-to-live, icmp
redirects, arp, ipv6-nd, ...

Routing

Interfaces Interfaces
eth0 eth1
Rede local Rede local
da eth0 da eth1
Nuva Soluções em TIC - http://www.nuva.com.br Página 6
Roteamento
● forward: quando um pacote entra em uma interface de rede para sair em outra interface de rede;
● Input: quando um pacote entra em uma interface com destino a um IP do próprio Linux (loopback);
● output: quando um pacote é criado no Linux para ser entregue no próprio Linux (input) ou entregue
por uma interface de rede a algum host remoto;

Loopback lo

Routing

Interfaces Interfaces
eth0 eth1

Nuva Soluções em TIC - http://www.nuva.com.br Página 7


Roteamento
● As etapas podem ser integradas com firewall (netfilter: iptables/nftables);

Interface Softwares
PREROUTING
de entrada
Loopback

INPUT

tabela
Routing local
Routing
outras
tabelas
OUTPUT

Interface
FORWARD POSTROUTING
de saída

Nuva Soluções em TIC - http://www.nuva.com.br Página 8


Roteamento
● Processo de roteamento (diagrama isolado):

Interface tabela
Routing local
Softwares
de entrada

outras
tabelas
tabela
Routing
local

outras
tabelas

Interface
de saída

Nuva Soluções em TIC - http://www.nuva.com.br Página 9


Roteamento
● Processo de roteamento: a cada pacote IP recebido, o kernel irá seguir os seguinte passos:
○ As regras em ip -4 rule show / ip -6 rule show serão analisadas na ordem
(prioridade, argumento prio), cada regra orienta um teste e uma ação, normalmente a ação
informa em qual tabela de rotas o IP de destino será pesquisado (argumento lookup);
■ Se o destino não for encontrado na tabela, a próxima regra será processada;
■ Se o destino for encontrado na tabela referida na regra, não haverá consulta nas
próximas regras e suas tabelas;
○ Ao procurar pelo IP de destino em uma tabela, todas as rotas serão testadas, ou seja, as
rotas que combinarem com o IP de destino serão anotadas até que todas as rotas sejam
testadas, nos casos em que mais de uma rota for encontrada na tabela, os seguintes
procedimentos serão adotados para o desempate:
■ A rota cujo prefixo possuir o maior número de bits vence;
■ Em caso de empate, a rota com menor métrica vence;
■ Obs.: a mesma rota com métricas iguais e gateways diferentes não serão admitidas
na tabela de rotas, em vez disso o software que adicionou a rota deverá informar
uma única rota com vários gateways (rota balanceada);
○ Ao encontrar uma rota, o registro do IP de destino e a rota selecionada é incluida no cache
de rotas: ip route show cached

Nuva Soluções em TIC - http://www.nuva.com.br Página 10


Roteamento baseado
em políticas: PBR
Roteamento - PBR
● Regras de roteamento:

# Listar regras de roteamento:


# - Roteamento IPv4:
ip -4 rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default

# - Roteamento IPv6:
ip -6 rule show
0: from all lookup local
32766: from all lookup main

Prioridade, Teste de condição Ação quando


ordem de teste condição for satisfeita

Nuva Soluções em TIC - http://www.nuva.com.br Página 12


Roteamento - BNG - PBR e CGNAT
● PBR: Policy Based Routing, roteamento baseado em política, envolve a criação de uma tabela de
rotas diferenciadas, que será consultada apenas para pacotes IP com condições específicas, vamos
analisar os seguinte caso comum:
○ No servidor BNG (Broadband Gateway) de um provedor de Internet, clientes que obterem IPs CGNAT
(100.64.0.0/10) devem passar pelo CGNAT, os demais clientes devem seguir o fluxo normal das rotas
aprendidas e naturais, a princípio temos uma solução simples:
■ Criar uma tabela chamada cgnat contendo apenas uma rota: gateway padrão, apontando para o IP
do servidor CGNAT;
■ Criar uma regra no ip rule orientando que todo IP 100.64.0.0/10 deve consultar a tabela cgnat;
■ Diagrama:
CGNAT

CGN-Prefix 45.255.129.128/25
198.18.0.1/30 45.255.128.6/30
BNG

100.64.0.2 BGP
198.18.0.2/30
100.64.0.3 Clientes 45.255.128.5/30
100.64.0.4 PPPoE/IPOE
45.255.130.14 10.111.0.2/30 10.111.0.1/30

Nuva Soluções em TIC - http://www.nuva.com.br Página 13


Roteamento - BNG - PBR e CGNAT
# Registrar Tabela:
egrep -q cgnat /etc/iproute2/rt_tables || echo "100 cgnat" >> /etc/iproute2/rt_tables

# Limpar tabela e colocar gateway::


ip -4 route flush table cgnat
ip -4 route add 0.0.0.0/0 via 198.18.0.1 table cgnat

# Criar regra de desvio:


ip -4 rule delete prio 32101 2>/dev/null
ip -4 rule add prio 32101 from 100.64.0.0/10 lookup cgnat

# Exibir regras:
ip -4 rule show
0: from all lookup local
32101: from 100.64.0.0/10 lookup cgnat
32766: from all lookup main
32767: from all lookup default

Nuva Soluções em TIC - http://www.nuva.com.br Página 14


Roteamento - CGN - PBR e CGNAT
# CGNAT Simples:
iptables -t nat -A POSTROUTING -s 100.64.0.0/16 -j NETMAP --to 45.255.129.128/25

Nuva Soluções em TIC - http://www.nuva.com.br Página 15


Roteamento - BNG - PBR e CGNAT
● Cuidado, o RP_FILTER (reverse path filter) consulta o roteamento para impedir que o pacote flua por
uma interface contrária ao roteamento natural (tabela main), por isso o PBR requer desativação do
RP_FILTER:

# Desativando RP-FILTER:
# - padrão:
echo net.ipv4.conf.default.rp_filter=0 > /etc/sysctl.d/90-disable-rp-filter.conf

# - todas as interfaces:
echo net.ipv4.conf.all.rp_filter=0 >> /etc/sysctl.d/90-disable-rp-filter.conf

# - interfaces conhecidas:
echo net.ipv4.conf.eth0.rp_filter=0 >> /etc/sysctl.d/90-disable-rp-filter.conf
echo net.ipv4.conf.eth1.rp_filter=0 >> /etc/sysctl.d/90-disable-rp-filter.conf
echo net.ipv4.conf.eth2.rp_filter=0 >> /etc/sysctl.d/90-disable-rp-filter.conf

# Aplicar e conferir:
sysctl -p /etc/sysctl.d/90-disable-rp-filter.conf
sysctl -a | egrep rp_filter

Nuva Soluções em TIC - http://www.nuva.com.br Página 16


Roteamento - BNG - PBR e CGNAT
● A solução anterior irá funcionar, mas haverá um problema: não será possível aos clientes na rede 100.64.0.0/10 acessar os IPs na
rede 10.111.0.0/30 (utilizadas entre o BNG e o BGP), ou esse acesso ocorrerá via CGNAT, mesmo sendo uma rota diretamente
conectada ao BNG, pois a regra de desvio foi inserida com prioridade inferior à consulta na tabela main, o que resultará em
interrupção da consulta por rotas na tabela cgnat;
● O acesso ao ip 10.111.0.2 funcionará por conta da tabela local, anterior a regra de cgnat, mas o ip 10.111.0.1 passará pelo CGNAT;
● Para resolver este problema temos:
○ Fazer o desvio posterior à prioridade de consulta da tabela main e antes da tabela default;
○ Retirar a rota padrão da tabela main e colocá-la na tabela default, visto que, se a rota padrão da tabela main resolver a
busca, não haverá consulta na regra posterior (cgnat);

CGNAT

CGN-Prefix 45.255.129.128/25
198.18.0.1/30 45.255.128.6/30
BNG

100.64.0.2 BGP
198.18.0.2/30
100.64.0.3 Clientes 45.255.128.5/30
100.64.0.4 PPPoE/IPOE
45.255.130.14 10.111.0.2/30 10.111.0.1/30

Nuva Soluções em TIC - http://www.nuva.com.br Página 17


Roteamento - BNG - PBR e CGNAT
# Coloca tabela default em prioridade superior:
# - afastas tabela default:
ip -4 rule add prio 32780 lookup default
# - remover prioridade padrão da tabela default:
ip -4 rule delete prio 32767 lookup default 2>/dev/null

# Coloca tabela cgnat após tabela main e antes da tabela default:


ip -4 rule delete from 100.64.0.0/10 lookup cgnat 2>/dev/null
ip -4 rule add prio 32770 from 100.64.0.0/10 lookup cgnat

# Mover rota padrão da tabela main para a tabela default:


MAINDF=$(ip route show default table main); RET="$?"
[ "$RET" = "0" ] && \
ip -4 route add $MAINDF table default && \
ip -4 route del $MAINDF table main

ip -4 rule show
0: from all lookup local
32766: from all lookup main
32770: from 100.64.0.0/10 lookup cgnat
32780: from all lookup default
Nuva Soluções em TIC - http://www.nuva.com.br Página 18
Roteamento - BNG - PBR e CGNAT
● Há casos que nem ainda assim estaria resolvido, caso haja demanda de uma política mais complexa,
segue alguns exemplo:
○ Consultes detalhes em: https://man7.org/linux/man-pages/man8/ip-rule.8.html

ip -4 rule add prio 21000 from 100.64.0.0/10 to 10.80.0.0/16 goto 32766


ip -4 rule add prio 22000 from all to 10.80.0.0/16 lookup mngt
ip -4 rule add prio 23000 from 100.64.0.0/10 to 45.255.128.128/25 lookup cdns

ip -4 rule add prio 24000 from 100.64.0.0/10 not to 45.255.128.0/22 lookup cgnat

ip -4 rule add prio 25000 iif eth0 lookup mngt

ip -4 rule add prio 26000 from all oif eth1 blackhole

Nuva Soluções em TIC - http://www.nuva.com.br Página 19


Roteamento - BNG - PBR e CGNAT
● Exemplo funcional de PBR e CGNAT: com rota padrão na tabela main;

# Permitir acesso dos clientes CGNAT às rotas naturais específicas:


# - Destinos privados que podem ser localizados na tabela main:
ip -4 rule add prio 21000 from 100.64.0.0/10 to 100.64.0.0/10 goto 32766
ip -4 rule add prio 21001 from 100.64.0.0/10 to 10.0.0.0/8 goto 32766
ip -4 rule add prio 21002 from 100.64.0.0/10 to 172.16.0.0/12 goto 32766
ip -4 rule add prio 21003 from 100.64.0.0/10 to 192.168.0.0/16 goto 32766

# - Exceção à regra posterior:


ip -4 rule add prio 21004 from 100.64.0.0/10 to 45.255.130.0/25 goto 21999
ip -4 rule add prio 21005 from 100.64.0.0/10 to 45.255.131.128/26 goto 21999

# - Destinos públicos na rede do provedor que podem ser localizados na tabela main:
ip -4 rule add prio 21006 from 100.64.0.0/10 to 45.255.128.0/22 goto 32766

# - Demais destinos (fora do provedor), passar pelo CGNAT:


ip -4 rule add prio 21999 from 100.64.0.0/10 lookup cgnat

Nuva Soluções em TIC - http://www.nuva.com.br Página 20


Roteamento - BNG - PBR e CGNAT
● Exemplo funcional de PBR e CGNAT: com rota padrão na tabela main;

# Exibir regras:
ip -4 rule show
0: from all lookup local
21000: from 100.64.0.0/10 to 100.64.0.0/10 goto 32766
21001: from 100.64.0.0/10 to 10.0.0.0/8 goto 32766
21002: from 100.64.0.0/10 to 172.16.0.0/12 goto 32766
21003: from 100.64.0.0/10 to 192.168.0.0/16 goto 32766
21004: from 100.64.0.0/10 to 45.255.130.0/25 goto 21999
21004: from 100.64.0.0/10 to 45.255.131.128/26 goto 21999
21006: from 100.64.0.0/10 to 45.255.128.0/22 goto 32766
21999: from 100.64.0.0/10 lookup cgnat
32766: from all lookup main
32767: from all lookup default

Nuva Soluções em TIC - http://www.nuva.com.br Página 21


Roteamento - BNG - Script Boot
# Criar scripts e registrar durante o boot:
mkdir -p /etc/pbr
touch /etc/pbr/start.sh
touch /etc/pbr/restore.sh
touch /etc/init.d/pbr
chmod +x /etc/pbr/*.sh
chmod +x /etc/init.d/pbr
rc-update add pbr

/etc/init.d/pbr
#!/sbin/openrc-run

description="PBR"
extra_started_commands="reload"

start() { ebegin "Starting $description"; /etc/pbr/start.sh; eend $?; }


stop() { ebegin "Stopping $description"; /etc/pbr/restore.sh; eend $?; }
restart() { /etc/pbr/restore.sh; /etc/pbr/start.sh; }
status() { ip rule show 2>/dev/null 1>/dev/null; }
reload() { /etc/pbr/restore.sh; /etc/pbr/start.sh; }

Nuva Soluções em TIC - http://www.nuva.com.br Página 22


Roteamento - BNG - Script Boot
/etc/pbr/start.sh
#!/bin/sh

# Permitir acesso dos clientes CGNAT às rotas naturais específicas:


# - Destinos privados que podem ser localizados na tabela main:
ip -4 rule add prio 21000 from 100.64.0.0/10 to 100.64.0.0/10 goto 32766
ip -4 rule add prio 21001 from 100.64.0.0/10 to 10.0.0.0/8 goto 32766
ip -4 rule add prio 21002 from 100.64.0.0/10 to 172.16.0.0/12 goto 32766
ip -4 rule add prio 21003 from 100.64.0.0/10 to 192.168.0.0/16 goto 32766

# - Exceção à regra posterior:


ip -4 rule add prio 21004 from 100.64.0.0/10 to 45.255.130.0/25 goto 21999
ip -4 rule add prio 21005 from 100.64.0.0/10 to 45.255.131.128/26 goto 21999

# - Destinos públicos na rede do provedor que podem ser localizados na tabela main:
ip -4 rule add prio 21006 from 100.64.0.0/10 to 45.255.128.0/22 goto 32766

# - Demais destinos (fora do provedor), passar pelo CGNAT:


ip -4 rule add prio 21999 from 100.64.0.0/10 lookup cgnat

Nuva Soluções em TIC - http://www.nuva.com.br Página 23


Roteamento - BNG - Script Boot
/etc/pbr/restore.sh
#!/bin/sh

# Listar regras e remover regras não-padrão:


PRIOLIST=$(ip -4 rule show | \
egrep -v '^0:' | \
egrep -v '^32766:.*main' | \
egrep -v '^32767:.*default' | \
cut -f1 -d:)
for PRIO in $PRIOLIST; do ip -4 rule del prio $PRIO; done

# Garantir existência da tabela local


ip -4 rule show | egrep -q '^32766:.*main' || ip -4 rule add prio 32766 lookup main

# Garantir existência da tabela main


ip -4 rule show | egrep -q '^32767:.*default' || ip -4 rule add prio 32767 lookup default

Nuva Soluções em TIC - http://www.nuva.com.br Página 24


Roteamento - BNG - Configuração FRR
vtysh -c "show run"
interface eth0
description Clientes
ip address 100.64.0.1/16
ip address 45.255.130.1/25 label Public-Gateway

interface eth1
description CGNAT-Uplink
ip address 198.18.0.2/30

interface eth2
description BGP-Uplink
ip address 10.111.0.2/30

router ospf
redistribute connected
redistribute static
network 10.111.0.0/30 area 0.0.0.0
network 198.18.0.0/30 area 0.0.0.0

Nuva Soluções em TIC - http://www.nuva.com.br Página 25


Roteamento - CGNAT - Script Boot
# CGNAT Simples:
iptables -t nat -A POSTROUTING -s 100.64.0.0/16 -j NETMAP --to 45.255.129.128/25

# Salvar regras atuais no padrão do Alpine (serviço: iptables)


# -> Regras salvas em: /etc/iptables/rules-save
/etc/init.d/iptables save

# Ativar serviço de firewall:


rc-update add iptables

# Teste
service iptables stop
service iptables start
service iptables restart

# Conferir:
iptables -t nat -L POSTROUTING

Nuva Soluções em TIC - http://www.nuva.com.br Página 26


Dúvidas?

Você também pode gostar