info_i_25x25.png Our ticketing platform provider has scheduled a maintenance window on May 20th, 2018. It will start at 1:00 am UTC on Sunday, May 20th and end at 1:00 pm UTC on Sunday, May 20th. During this time there might be an interruption in the chat service, but all our users will still be able to submit support tickets via the ticket submission form.

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 */