EdgeRouter - 정책 기반 라우팅 (시작 주소 기반)¶
download at 2017-02-07T01:10:43Z origin
Overview¶
이 문서에서는 시작 주소를 바탕으로 정책 기반 라우팅을 설정하는 방법에 대하여 서술합니다.
이 문서는 EdgeOS에서 목적지 대신 시작 주소를 바탕으로 어떻게 정책 기반 라우팅을 설정하는지 예제를 설명합니다.
아래의 다이어그램은 2개의 인터넷 연결(ISP-1, ISP-2)을 보여주고 있습니다:
- ISP-1 on eth0 192.0.2.0/24
- ISP-2 on eth1 203.0.113.0/24
- eth2.100 192.168.0.0/24
- eth2.200 172.16.0.0/24
네트워크 다이어그램¶
정책 기반 라우팅 (PBR)¶
EdgeOS에서 PBR을 설정하기 위해서는 3가지가 필요합니다:
- 각 목적지에 고정 루트를 갖는 새로운 라우팅 테이블
- 다른 라우팅 테이블을 선택하도록 방화벽 정책 수정
- 인터페이스에 수정된 방화벽 정책 적용
새로운 라우팅 테이블 만들기¶
table 1 에 ISP-1로 통하는 기본 루트를 vlan 100 (다음 홉 주소, 192,0.2.1)으로 설정합니다.
ubnt@RTR# set protocols static table 1 route 0.0.0.0/0 next-hop 192.0.2.1
[edit]
table 2 에 ISP-2로 통하는 기본 루트를 vlan 200 (다음 홉 주소, 203,0.113.1)으로 설정합니다
ubnt@RTR# set protocols static table 2 route 0.0.0.0/0 next-hop 203.0.113.1
[edit]
정책 수정하기¶
정책 수정 은 룰에 맞는 각 정책을 수정할 수 있도록 합니다. 시작 주소가 192.168.0.0 에서 시작한다면, 라우팅 table 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
같은 방식으로 127.16.0.0/24 를 시작 주소로 갖는 다면 table 2의 rule 20을 생성합니다.
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
인터페이스에 정책 적용¶
정책을 인터페이스에 적용하기 위해서는 라우팅 테이블 룩업이 이루어지기 이전 인풋 인터페이스에 적용이 되어야 합니다.
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]
테스팅¶
2개의 다른 vlan으로 다른 시작 주소에서 라우팅이 제대로 이루어지는지 검증을 수행합니다.
192.168.0.0/24 대역을 갖는 호스트에서 traceroute를 수행하여 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>
172.168.0.0/24 대역을 갖는 호스트에서 traceroute를 수행하여 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>
확인 명령어¶
다음 명령어를 사용하여 메인 라우팅 테이블을 확인합니다:
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
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
페일오버 (Failover)¶
2개의 ISP에서는 1개의 링크가 장애가 발생했을 때 모든 트래픽이 장애가 발생하지 않은 링크를 사용해야 합니다. 예를 들어, ISP-2 링크에 장애가 생겼을 경우, 라우팅 테이블에서 상태를 inactive 로 지정해야 합니다.
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
table 2에서 사용 가능한 루트가 없을 경우, 메인 테이블 사용을 시도합니다. 현재는 기본 메인 테이블이 없기 때문에 각 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
이제 table #2에서 다른 경로를 사용 할 것입니다.
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)
traceroute는 대안 경로를 출력합니다:
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>
LAN에서 LAN으로의 트래픽¶
위의 예제에서 vlan이 각 라우팅 테이블과 통신할 수 없을 때, 기본 메인 테이블에 질의를 하게 됩니다. 만약 기본 메인 테이플에 질의하기를 원치 않을 경우, PBR 룰보다 상위 룰을 지정하여 목적지 네트워크를 LAN 네트워크로 지정할 수 있습니다.
먼저 방화벽 그룹에 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]
룰 5를 생성하여 LAN_NETS 그룹을 사용하고 main 라우팅 테이블을 선택하도록 룰을 생성합니다.
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]
설정을 하고 난 이후에는 SOURCE_ROUTE 룰은 다음과 같이 출력됩니다:
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]
예제 설정¶
ubnt@RTR:~$ cat /config/config.boot
firewall {
group {
network-group LAN_NETS {
network 192.168.0.0/24
network 172.16.0.0/24
network 10.0.0.0/24
}
}
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
}
}
}
}
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
}
}
}
}
}
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 {
shared-network-name LAN {
authoritative enable
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 enable
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 enable
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 5020 {
outbound-interface eth0
type masquerade
}
}
}
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: 다음 줄을 삭제하지 마시오. */
/* === 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 */