EdgeMAX - baseado em políticas de roteamento (endereço de origem com base)

Visão geral


Os leitores aprenderão a configurar a política de roteamento com base no endereço de origem. 

Este artigo é um exemplo de como configurar o PBR (política de roteamento) em EdgeOS a rota com base em um endereço de origem em vez de destino.

No diagrama abaixo, temos 2 conexões de Internet, ISP-1 e 2-ISP:

  1. ISP-1 na eth0 192.0.2.0/24
  2. ISP-2 na eth1 203.0.113.0/24


Do lado da LAN, usaremos as vlans:

  1. ETH2.100 192.168.0.0/24
  2. ETH2.200 172.16.0.0/24


Este exemplo queremos da vlan 100 usar ISP-1 e tráfego da vlan 200 usar ISP-2. 

Diagrama de rede

 

Roteamento com base em política

Há 3 partes para configurar PBR em EdgeOS:

  1. Defina uma nova tabela de roteamento com rotas estáticas para cada destino.
  2. Definir um firewall modificar a diretiva para selecionar uma tabela de roteamento diferente.
  3. Aplicar o firewall modificar a diretiva para uma interface.

Definir novas tabelas de roteamento

Para vlan 100, vamos definir tabela 1 com uma rota padrão para o endereço do próximo salto ISP-1 (192.0.2.1).

ubnt@RTR# set protocols static table 1 route 0.0.0.0/0 next-hop 192.0.2.1
[edit]

Para vlan 200, definiremos tabela 2 com uma rota padrão para o endereço do próximo salto ISP-2 (203.0.113.1).

ubnt@RTR# set protocols static table 2 route 0.0.0.0/0 next-hop 203.0.113.1
[edit]

Definir política de modificar

A modificar política nos permite modificar vários itens quando coincide com a regra. Então se o endereço de origem veio 192.168.0.0, então nós queremos usar a tabela de roteamento 1:

ubnt@RTR# set firewall modify SOURCE_ROUTE rule 10 description 'traffic from eth2.100 to ISP1'
ubnt@RTR# set firewall modify SOURCE_ROUTE rule 10 source address 192.168.0.0/24
ubnt@RTR# set firewall modify SOURCE_ROUTE rule 10 modify table 1

Da mesma forma, criaremos uma regra 20 para fonte endereço 172.16.0.0/24 usar a tabela 2.

ubnt@RTR# set firewall modify SOURCE_ROUTE rule 20 description 'traffic from eth2.200 to ISP2'
ubnt@RTR# set firewall modify SOURCE_ROUTE rule 20 source address 172.16.0.0/24
ubnt@RTR# set firewall modify SOURCE_ROUTE rule 20 modify table 2

Aplicar a diretiva Interface

Quando se trata de aplicar uma política de uma interface, precisa ser feito na interface de entrada antes que a pesquisa de roteamento ocorra.

ubnt@RTR# set interfaces ethernet eth2 vif 100 firewall in modify SOURCE_ROUTE
[edit]
ubnt@RTR# set interfaces ethernet eth2 vif 200 firewall in modify SOURCE_ROUTE
[edit]

Teste

Isto agora deve ser suficiente para verificar que hosts os 2 vlans diferentes são roteados com base no seu endereço de origem.

Executar um traceroute de um host na 192.168.0.0/24 e vemos que o roteador 2 é 192.0.2.1:

ubnt@H1:~$ traceroute google.com
Resolving Address: google.com
traceroute to google.com (74.125.224.110), 30 hops max, 60 byte packets
 1 192.168.0.1 (192.168.0.1) 0.448 ms 0.603 ms 0.704 ms
 2 192.0.2.1 (192.0.2.1) 1.354 ms 1.397 ms 1.444 ms
 <snip>

Executar um traceroute de um host na 172.168.0.0/24 e vemos que o roteador 2 é 203.0.113.1:

ubnt@H2:~$ traceroute google.com
traceroute to google.com (74.125.224.110), 30 hops max, 38 byte packets
 1 172.16.0.1 (172.16.0.1) 0.331 ms 0.275 ms 0.264 ms
 2 203.0.113.1 (203.0.113.1) 0.545 ms 0.406 ms 0.357 ms
 <snip> 

Comando show

O comando a seguir é usado para mostrar a tabela de roteamento principal:

ubnt@RTR:~$ show ip route
 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
 I - ISIS, B - BGP, > - selected route, * - FIB route
 C>* 127.0.0.0/8 is directly connected, lo
 C>* 192.0.2.0/24 is directly connected, eth0
 C>* 203.0.113.0/24 is directly connected, eth1
 C>* 172.16.0.0/24 is directly connected, eth2.200
 C>* 192.168.0.0/24 is directly connected, eth2.100


Para ver uma das tabelas de roteamento adicionais:

ubnt@RTR:~$ show ip route table 1
 table 1:
 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
 I - ISIS, B - BGP, > - selected route, * - FIB route
 S>* 0.0.0.0/0 [1/0] via 192.0.2.1, eth0
ubnt@RTR:~$ show ip route table 2
 table 2:
 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
 I - ISIS, B - BGP, > - selected route, * - FIB route
 S>* 0.0.0.0/0 [1/0] via 203.0.113.1, eth1 

Fail Over

Dado que temos 2 ISPs, seria bom que se 1 ligação falhou, então todo o tráfego poderia usar o link bom. Por exemplo, se a ligação ao ISP-2 está em baixo, na tabela de roteamento você verá a rota é inativo .

ubnt@RTR:~$ show ip route table 2
 table 2:
 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
 I - ISIS, B - BGP, > - selected route, * - FIB route
 S 0.0.0.0/0 [1/0] via 203.0.113.1 inactive

Se não houver nenhuma rota na tabela 2, então, vou tentar a mesa principal, mas atualmente não há nenhuma rota padrão na tabela principal. Use os comandos a seguir para adicionar uma rota padrão para cada ISP.

ubnt@RTR:~$ configure
[edit]
ubnt@RTR# set protocols static route 0.0.0.0/0 next-hop 192.0.2.1
[edit]
ubnt@RTR# set protocols static route 0.0.0.0/0 next-hop 203.0.113.1
[edit]
ubnt@RTR# commit
[edit]
ubnt@RTR# save; exit
Saving configuration to '/config/config.boot'...
Done
exit

Agora, se olharmos para a tabela de rotas #2, vemos que ele usará o outro caminho em vez disso:

ubnt@RTR:~$ show ip route table 2
 table 2:
 Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
 I - ISIS, B - BGP, > - selected route, * - FIB route
 S>* 0.0.0.0/0 [1/0] via 203.0.113.1 (recursive via 192.0.2.1)

Um traceroute mostra que ele está agora a tomar o caminho alternativo:

ubnt@H2:~$ traceroute google.com
traceroute to google.com (74.125.224.137), 30 hops max, 38 byte packets
 1 172.16.0.1 (172.16.0.1) 0.327 ms 0.281 ms 0.255 ms
 2 192.0.2.1 (192.0.2.1) 0.551 ms 0.390 ms 0.357 ms
 <snip>

Tráfego de LAN para LAN

No exemplo acima, a vlan não será capaz de falar um com o outro, desde que suas tabelas de roteamento só têm uma rota padrão. Isso pode ser o que quiser, mas se não, podemos adicionar uma regra à frente as regras da PBR para usar a tabela de roteamento principal se a rede de destino é uma das redes de LAN.

Primeiro vamos criar um grupo de firewall com nossas redes de LAN:

ubnt@RTR# set firewall group network-group LAN_NETS network 192.168.0.0/24
[edit]
ubnt@RTR# set firewall group network-group LAN_NETS network 172.16.0.0/24
[edit]

Então vamos criar uma regra 5, que usa o grupo LAN_NETS e seleciona o principal tabela de roteamento.

ubnt@RTR# set firewall modify SOURCE_ROUTE rule 5 description "LAN to LAN skip PBR"
[edit]
ubnt@RTR# set firewall modify SOURCE_ROUTE rule 5 destination group network-group LAN_NETS
[edit]
ubnt@RTR# set firewall modify SOURCE_ROUTE rule 5 modify table main
[edit]

Depois disso, as nossas regras SOURCE_ROUTE aparência:

ubnt@RTR# show firewall modify SOURCE_ROUTE
enable-default-log
rule 5 {
 description "LAN to LAN skip PBR"
 destination {
 group {
 network-group LAN_NETS
 }
 }
 modify {
 table main
 }
}
rule 10 {
 action modify
 description "traffic from eth2.100 to ISP1"
 modify {
 table 1
 }
 source {
 address 192.168.0.0/24
 }
}
rule 20 {
 action modify
 description "traffic from eth2.200 to ISP2"
 modify {
 table 2
 }
 source {
 address 172.16.0.0/24
 }
}
[edit]


Nota : as regras que usam um modificar tabela comando são "terminal", em que uma vez que uma correspondência for encontrada, ele pára. Então no exemplo acima, se a regra 5 é um jogo, então não fica em regra 10 ou 20. No entanto, isso pode ser uma coisa ruim se você também estiver usando o modificar comando para alterar outros itens (marca, dscp, tcp-mss). Nesses casos, as outras regras de modificar devem vir antes das regras da PBR.

Exemplo de configuração

ubnt@RTR:~$ cat /config/config.boot
firewall {
 all-ping enable
 broadcast-ping disable
 conntrack-expect-table-size 4096
 conntrack-hash-size 4096
 conntrack-table-size 32768
 conntrack-tcp-loose enable
 group {
 network-group LAN_NETS {
 network 192.168.0.0/24
 network 172.16.0.0/24
 network 10.0.0.0/24
 }
 }
 ipv6-receive-redirects disable
 ipv6-src-route disable
 ip-src-route disable
 log-martians enable
 modify SOURCE_ROUTE {
 enable-default-log
 rule 5 {
 action modify
 description "LAN to LAN skip PBR"
 destination {
 group {
 network-group LAN_NETS
 }
 }
 modify {
 table main
 }
 }
 rule 10 {
 action modify
 description "traffic from eth2.100 to ISP1"
 modify {
 table 1
 }
 source {
 address 192.168.0.0/24
 }
 }
 rule 20 {
 action modify
 description "traffic from eth2.200 to ISP2"
 modify {
 table 2
 }
 source {
 address 172.16.0.0/24
 }
 }
 }
 receive-redirects disable
 send-redirects enable
 source-validation disable
 syn-cookies enable
}
interfaces {
 ethernet eth0 {
 address 192.0.2.2/24
 }
 ethernet eth1 {
 address 203.0.113.2/24
 }
 ethernet eth2 {
 address 10.0.0.1/24
 firewall {
 in {
 modify SOURCE_ROUTE
 }
 }
 vif 100 {
 address 192.168.0.1/24
 firewall {
 in {
 modify SOURCE_ROUTE
 }
 }
 }
 vif 200 {
 address 172.16.0.1/24
 firewall {
 in {
 modify SOURCE_ROUTE
 }
 }
 }
 }
 loopback lo {
 }
}
protocols {
 static {
 route 0.0.0.0/0 {
 next-hop 192.0.2.1 {
 }
 next-hop 203.0.113.1 {
 }
 }
 table 1 {
 route 0.0.0.0/0 {
 next-hop 192.0.2.1 {
 }
 }
 }
 table 2 {
 route 0.0.0.0/0 {
 next-hop 203.0.113.1 {
 }
 }
 }
 }
}
service {
 dhcp-server {
 disabled false
 shared-network-name LAN {
 authoritative disable
 subnet 10.0.0/24 {
 default-router 10.0.0.1
 dns-server 10.0.0.1
 lease 86400
 start 10.0.0.10 {
 stop 10.0.0.100
 }
 }
 }
 shared-network-name LAN1 {
 authoritative disable
 subnet 192.168.0.0/24 {
 default-router 192.168.0.1
 dns-server 192.168.0.1
 lease 86400
 start 192.168.0.10 {
 stop 192.168.0.100
 }
 }
 }
 shared-network-name LAN2 {
 authoritative disable
 subnet 172.16.0.0/24 {
 default-router 172.16.0.1
 dns-server 172.16.0.1
 lease 86400
 start 172.16.0.10 {
 stop 172.16.0.100
 }
 }
 }
 }
 dns {
 forwarding {
 cache-size 150
 listen-on eth2
 listen-on eth2.100
 listen-on eth2.200
 }
 }
 gui {
 https-port 443
 }
 nat {
 rule 5000 {
 outbound-interface eth0
 type masquerade
 }
 rule 5010 {
 outbound-interface eth1
 type masquerade
 }
 rule 5011 {
 outbound-interface eth0
 type masquerade
 }
 }
 snmp {
 community public {
 authorization ro
 }
 }
 ssh {
 port 22
 protocol-version v2
 }
 telnet {
 port 23
 }
}
system {
 host-name RTR
 login {
 user ubnt {
 authentication {
 encrypted-password $1$zKNoUbAo$gomzUbYvgyUMcD436Wo66.
 }
 level admin
 }
 }
 name-server 8.8.8.8
 ntp {
 server 0.ubnt.pool.ntp.org {
 }
 server 1.ubnt.pool.ntp.org {
 }
 server 2.ubnt.pool.ntp.org {
 }
 server 3.ubnt.pool.ntp.org {
 }
 }
 syslog {
 global {
 facility all {
 level notice
 }
 facility protocols {
 level debug
 }
 }
 }
 time-zone US/Pacific
}
/* Warning: Do not remove the following line. */
/* === vyatta-config-version: "firewall@4:quagga@2:config-management@1:dhcp-relay@1:dhcp-server@4:ipsec@3:nat@3:qos@1:system@4:ubnt-pptp@1:vrrp@1:webgui@1:webproxy@1:zone-policy@1" === */
/* Release version: v1.0.3dev.4530060.130124.0102 */