EdgeMAX - roteamento com WAN-balanceamento de carga baseada em políticas

Visão geral


Os leitores aprenderão a executar WAN balanceamento de carga para roteadores com múltiplas portas WAN designado.

O exemplo usa marcas de conexão/pacote para fazer dual WAN Load Balancing. Nos exemplos anteriores roteamento política baseou-se na fonte fixa ou porta de destino a decisão de tabela de roteamento. Queremos tentar equilibrar as 50/50 de novas conexões sobre ISP1 e ISP2 para esta página wiki.

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 de LAN:

  1. ETH2 172.16.0.0/24

Diagrama de rede


Tabelas de roteamento


Estamos usando as mesmas tabelas de roteamento a partir de EdgeOS política baseado roteamento onde a tabela de roteamento "principal" tem uma rota padrão para ambos do ISP, tabela 1 tem apenas uma rota para ISP1 e tabela 2 só tem uma rota para ISP2, mas com uma simples adição. Aqui nós também estamos associando uma tabela com uma marca de pacote - marque 1 para tabela 1 e marcar 2 para a mesa 2. Isto nos diz para usar a tabela 1, se o pacote tiver uma marca de 1 e 2, quando há uma marca de 2.

set protocols static route 0.0.0.0/0 next-hop 192.0.2.1
set protocols static route 0.0.0.0/0 next-hop 203.0.113.1
set protocols static table 1 mark 1
set protocols static table 1 route 0.0.0.0/0 next-hop 192.0.2.1
set protocols static table 2 mark 2
set protocols static table 2 route 0.0.0.0/0 next-hop 203.0.113.1

Balanceamento de carga


Quando o firewall dinâmico estiver em uso, o sistema mantém o controle de todas as conexões no sistema. Tanto a entrada de conexão e o pacote podem ter um marca aplicado a eles e marcas podem ser salvar/restaurado entre a conexão e o pacote. Basicamente o que estamos tentando fazer aqui é para uma novo conexão 50% do tempo marcaremos o pacote com o mark 1 e o resto do tempo vai marcá-lo com 2 . Então nós vamos economizar essa marca de pacote para a nova entrada de conexão. Para as conexões existentes já haja uma marca, assim que vou restaurar essa marca para o pacote.

 set firewall modify balance rule 10 action modify
 set firewall modify balance rule 10 description 'restore mark from connection'
 set firewall modify balance rule 10 modify connmark restore-mark
 set firewall modify balance rule 20 action accept
 set firewall modify balance rule 20 description 'accept the packet if the mark isnt zero'
 set firewall modify balance rule 20 mark '!0'
 set firewall modify balance rule 30 action modify
 set firewall modify balance rule 30 description 'for new connections mark 50% with mark 1'
 set firewall modify balance rule 30 modify mark 1
 set firewall modify balance rule 30 protocol tcp_udp
 set firewall modify balance rule 30 state new enable
 set firewall modify balance rule 30 statistic probability 50%
 set firewall modify balance rule 40 action modify
 set firewall modify balance rule 40 description 'for packets with mark zero, mark with 2'
 set firewall modify balance rule 40 mark 0
 set firewall modify balance rule 40 modify mark 2
 set firewall modify balance rule 40 protocol tcp_udp
 set firewall modify balance rule 40 state new enable
 set firewall modify balance rule 50 action modify
 set firewall modify balance rule 50 description 'save the packet mark to the connection mark'
 set firewall modify balance rule 50 modify connmark save-mark

Então precisamos aplicá-la a nossa interface de LAN.

set interfaces ethernet eth2 firewall in modify balance
 

Teste


Aqui podemos ver que as regras de 30 e 40 são quase equilibradas 50/50:

ubnt@PBR:~$ show firewall modify statistics
 --------------------------------------------------------------------------------
 IPv4 Firewall "balance"
 Active on (eth2,IN)
 rule packets bytes action description
 ---- ------- ----- ------ -----------
 10 399516 61839166 MODIFY restore mark from connection
 20 366897 59641481 ACCEPT accept the packet if the mark isn't zero
 30 16196 1094021 MODIFY for new connections mark 50% with mark 1
 40 16377 1101667 MODIFY for packets with mark zero, mark with 2
 50 32619 2197685 MODIFY save the packet mark to the connection mark
 10000 32619 2197685 ACCEPT DEFAULT ACTION

Novas conexões WAN


Se nós temos regras de encaminhamento de porta configuradas, então talvez tenhamos novas conexões iniciadas a partir do lado da WAN. A fim de manter essas novas conexões saindo a mesma interface que eles entraram, vamos marcar um 1 em novas conexões de ISP1 e marcar 2 em novas conexões do ISP2.

 set firewall modify ISP1_IN rule 1 description 'use mark 1 for new ISP1 connections'
 set firewall modify ISP1_IN rule 1 action modify
 set firewall modify ISP1_IN rule 1 log enable
 set firewall modify ISP1_IN rule 1 modify connmark set-mark 1
 set firewall modify ISP1_IN rule 1 protocol tcp_udp
 set firewall modify ISP1_IN rule 1 state new enable
 set firewall modify ISP2_IN rule 1 description 'use mark 2 for new ISP2 connections'
 set firewall modify ISP2_IN rule 1 action modify
 set firewall modify ISP2_IN rule 1 log enable
 set firewall modify ISP2_IN rule 1 modify connmark set-mark 2
 set firewall modify ISP2_IN rule 1 protocol tcp_udp
 set firewall modify ISP2_IN rule 1 state new enable

Se aplicam a interfaces WAN:

set interfaces ethernet eth0 firewall in modify ISP1_IN
set interfaces ethernet eth1 firewall in modify ISP2_IN
 Exemplo de configuração
 firewall {
 modify ISP1_IN {
 rule 1 {
 action modify
 description "use mark 1 for new ISP1 connections"
 log enable
 modify {
 connmark {
 set-mark 1
 }
 }
 protocol tcp_udp
 state {
 new enable
 }
 }
 }
 modify ISP2_IN {
 rule 1 {
 action modify
 description "use mark 2 for new ISP2 connections"
 log enable
 modify {
 connmark {
 set-mark 2
 }
 }
 protocol tcp_udp
 state {
 new enable
 }
 }
 }
 modify balance {
 enable-default-log
 rule 10 {
 action modify
 description "restore mark from connection"
 modify {
 connmark {
 restore-mark
 }
 }
 }
 rule 20 {
 action accept
 description "accept the packet if the mark isn't zero"
 mark !0
 }
 rule 30 {
 action modify
 description "for new connections mark 50% with mark 1"
 modify {
 mark 1
 }
 protocol tcp_udp
 state {
 new enable
 }
 statistic {
 probability 50%
 }
 }
 rule 40 {
 action modify
 description "for packets with mark zero, mark with 2"
 mark 0
 modify {
 mark 2
 }
 protocol tcp_udp
 state {
 new enable
 }
 }
 rule 50 {
 action modify
 description "save the packet mark to the connection mark"
 modify {
 connmark {
 save-mark
 }
 }
 }
 }
 }
 interfaces {
 ethernet eth0 {
 address 192.0.2.2/24
 duplex auto
 firewall {
 in {
 modify ISP1_IN
 }
 }
 speed auto
 }
 ethernet eth1 {
 address 203.0.113.2/24
 duplex auto
 firewall {
 in {
 modify ISP2_IN
 }
 }
 speed auto
 }
 ethernet eth2 {
 address 172.16.0.1/24
 duplex auto
 firewall {
 in {
 modify balance
 }
 }
 speed auto
 }
 loopback lo {
 }
 }
 protocols {
 static {
 route 0.0.0.0/0 {
 next-hop 192.0.2.1 {
 }
 next-hop 203.0.113.1 {
 }
 }
 table 1 {
 mark 1
 route 0.0.0.0/0 {
 next-hop 192.0.2.1 {
 }
 }
 }
 table 2 {
 mark 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 172.16.0.0/24 {
 default-router 172.16.0.1
 dns-server 8.8.8.8
 lease 86400
 start 172.16.0.10 {
 stop 172.16.0.100
 }
 }
 }
 }
 gui {
 https-port 443
 }
 nat {
 rule 5000 {
 outbound-interface eth0
 type masquerade
 }
 rule 6000 {
 outbound-interface eth1
 type masquerade
 }
 }
 ssh {
 port 22
 protocol-version v2
 }
 }
 system {
 host-name WLB
 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 UTC
 }
 /* Warning: Do not remove the following line. */
 /* === vyatta-config-version: "config-management@1:dhcp-relay@1:dhcp-server@4:firewall@4:ipsec@3:nat@3:qos@1:quagga@2:system@4:ubnt-pptp@1:vrrp@1:webgui@1:webproxy@1:zone-policy@1" === */
 /* Release version: v1.1.0beta3dev.4539852.130227.0102 */
Powered by Zendesk