EdgeRouter - 정책 기반 라우팅 (시작 주소 기반)

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

Overview


이 문서에서는 시작 주소를 바탕으로 정책 기반 라우팅을 설정하는 방법에 대하여 서술합니다.

이 문서는 EdgeOS에서 목적지 대신 시작 주소를 바탕으로 어떻게 정책 기반 라우팅을 설정하는지 예제를 설명합니다.

아래의 다이어그램은 2개의 인터넷 연결(ISP-1, ISP-2)을 보여주고 있습니다:

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

LAN은 vlan을 사용합니다:
  1. eth2.100 192.168.0.0/24
  2. eth2.200 172.16.0.0/24

이 예제에서 vlan 100에서 ISP-1로, vlan 200에서 ISP-2를 사용하여 트래픽을 발생하고 싶다고 가정합니다.

네트워크 다이어그램

image0

정책 기반 라우팅 (PBR)

EdgeOS에서 PBR을 설정하기 위해서는 3가지가 필요합니다:

  1. 각 목적지에 고정 루트를 갖는 새로운 라우팅 테이블
  2. 다른 라우팅 테이블을 선택하도록 방화벽 정책 수정
  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]

Note: modify table 명령을 사용하는 룰은 더 이상 탐색을 종료하게 됩니다. 만약 rule 5을 수행하면, rule 10과 rule 20의 정책은 수행하지 않게 됩니다. modify 명령을 통해서 다른 내용(mark, dscp, tcp-mss)를 변경하고자 한다면 위의 방법은 적절하지 않은 방법입니다. 이와 같은 경우에는 PBR 룰보다 상위 룰로 지정해야 합니다.

예제 설정

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