EdgeRouter - 정책기반 WAN 로드밸런싱과 라우팅

download at 2017-02-07T01:10:46Z origin

Overview


Note: WAN 로드 밸런싱 기법은 로드 밸런싱 기법 이전에 동작하는 방법입니다. (LINK) 아래의 방법이 동작하면, 로드밸런싱 기능이 동작하지 않는 동안 패킷 차단을 하지 않을 것입니다.

이 문서는 멀티 포트를 사용하도록 설계한 WAN의 라우터들을 어떻게 WAN 로드 밸런싱을 하는가에 대하여 서술합니다.

예제는 패킷/커넥션을 듀얼 WAN 로드 밸런싱을 수행하도록 합니다. 이전의 정책 기반 라우팅 예제는 라우팅 테이블을 선정하는 작업을 고정된 시작, 목적지 포트로 결정했지만, 본 예제의 바탕인 위키 페이지에서는 새로운 커넥션을 ISP1과 ISP2를 50/50 으로 로드밸런싱을 수행합니다.

아래의 다이어그램은 ISP-1, ISP-2 2개의 인터넷 연결을 나타내고 있습니다:

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

LAN 측:

  1. eth2 172.16.0.0/24

네트워크 다이어그램


image0

라우팅 테이블


EdgeOS 정책 기반 라우팅 과 동일한 라우팅 테이블을 사용합니다. ("main" 라우팅 테이블이 양쪽 ISP로의 기본 루트를 포함하고 있습니다.) 테이블 1은 ISP1로 향하는 경로만 존재하고, 테이블 2는 ISP2로 향하는 경로만 존재합니다. 이제 테이블에 패킷 마킹을 수행합니다. mark 1을 테이블 1에 사용하고 mark 2를 테이블 2에 사용합니다. 이는 mark 1을 가진 패킷은 테이블 1을 통하고, mark 2를 가진 패킷은 테이블 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

로드 밸런싱


상태기반 방화벽이 새로운 연결에 대하여 작업을 수행할 수 없다면, 모든 커넥션을 추적하여 나중에라도 상태를 추적할 수 있도록 합니다. 커넥션을 진입할 때와 패킷에 모두 마킹 을 수행합니다. 마킹은 저장, 복구가 가능합니다. 마킹 작업은 새로운 커넥션의 50%에 대하여 1 을 마킹하고 남은 50%에 대하여 2 를 마킹하는 것이 목표입니다. 마킹 작업을 통해서 새로운 커넥션이 생성될 때 패킷에 마킹을 적용할 수 있습니다. 현재 존재하는 커넥션이 마킹되어 있다면, 해당 방화벽의 유휴 상태에서 다시 마킹에 대한 패킷을 복구할 수 있습니다.

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

이제 LAN 인터페이스에 적용합니다.

set interfaces ethernet eth2 firewall in modify balance

테스팅


이제 룰 30과 40이 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

새로운 WAN 커넥션


설정된 포트 포워딩 룰이 존재한다면, WAN에서 새로운 커넥션이 생성될 수 있습니다. 새로운 커넥션이 같은 인터페이스를 사용할 수 있도록 mark 1을 ISP1에서 생성된 새로운 커넥션에, mark 2를 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

WAN 인터페이스에 적용합니다:

set interfaces ethernet eth0 firewall in modify ISP1_IN
set interfaces ethernet eth1 firewall in modify ISP2_IN

환경설정 예제

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: 아래 내용을 삭제하지 마세요. */
/* === 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 */