본문 바로가기

OS/Linux

Linux 다중 업링크(multiple gateway) 정책 라우팅

반응형

Cisco 스위치의 PBR(Policy Base Route)을 리눅스의 ip rule 같은 도구를 이용하여 정책 라우팅 할 수 있다.

 

개요


물리 경로

  • FW(CentOS7) 서버의 물리 경로
  • NIC enp9s0f1, enp10s0f1은 FW서버의 up 링크
  • NIC enp9s0f0은 FW 서버의 down 링크

 

IP 경로(시리얼 구간)

  • UPlink1(enp9s0f1) : 10.10.40.2 -> 10.10.10.40.1
  • UPlink2(enp10s0f1) : 10.10.60.2 -> 10.10.10.60.1
  • Downlink(enp9s0f0) : 10.10.50.1 -> 10.10.50.2
  • NIC ip 정보
[root@FW]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
 ...
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 1.1.1.5/24 brd 1.1.1.255 scope global noprefixroute eno1
...
6: enp9s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 10.10.50.1/30 brd 10.10.50.3 scope global noprefixroute enp9s0f0
...
7: enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 10.10.40.2/30 brd 10.10.40.3 scope global noprefixroute enp9s0f1
...
9: enp10s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 10.10.60.2/30 brd 10.10.60.3 scope global noprefixroute enp10s0f1
...

 

  • FW 서버의 default gateway : 1.1.1.5 -> 1.1.1.11
[root@FW]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         1.1.1.11        0.0.0.0         UG    0      0        0 eno1

 

라우팅 계획

  • 서비스 대역 : 20.20.20.0/24, 30.30.30.0/24 는 Downlonk 아래 스위치에 할당되어 있음.
  • 서비스 대역 20.20.20.0/24 : Downlink -> UPlink1 구간으로 라우팅
  • 서비스 대역 30.30.30.0/24 : Downlink -> UPlink2 구간으로 라우팅

 

  • 서비스 대역은 Downlink(enp9s0f0) 하단에 위치하므로 아래와 같이 기본 목적지 라우팅 설정
[root@FW]# ip route add 20.20.20.0/24 via 10.10.50.2
[root@FW]# ip route add 30.30.30.0/24 via 10.10.50.2

# 혹은 아래와 같이 스크립트로 적용
# 네트워크 재시작 필요
[root@FW]# cd /etc/sysconfig/network-scripts
[root@FW network-scripts]# cat route-enp9s0f0 
20.20.20.0/24 via 10.10.50.2
30.30.30.0/24 via 10.10.50.2

# 확인
[root@FW]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         1.1.1.11	    0.0.0.0        	UG    102    0        0 enp9s0f1
...
20.20.20.0  	10.10.50.2      255.255.255.0 	UG    101    0        0 enp9s0f0
30.30.30.0  	10.10.50.2      255.255.255.0 	UG    101    0        0 enp9s0f0

 

  • 라우팅 테이블의 우선순위는 netmask가 작은 수 부터 우선 순위를 가진다

 

설정


라우팅 테이블 생성

  • UPlink1 경로 : 100 uplink1
  • UPlink2 경로 : 200 uplink2
[root@FW]# cat /etc/iproute2/rt_tables 
...
255	local
254	main
253	default
0	unspec
100	uplink1
200	uplink2
...

 

라우팅 테이블 default 라우팅 설정

  • UPlink1(enp9s0f1) : 10.10.40.2 -> 10.10.10.40.1
  • UPlink2(enp10s0f1) : 10.10.60.2 -> 10.10.10.60.1
# uplink1 테이블
[root@FW ~]# ip route add default via 10.10.40.1 dev enp9s0f1 table uplink1
[root@FW ~]# ip route ls table uplink1
default via 10.10.40.1 dev enp9s0f1 

# uplink2 테이블
[root@FW ~]# ip route add default via 10.10.60.1 dev enp10s0f1 table uplink2
[root@FW ~]# ip route ls table uplink2
default via 10.10.60.1 dev enp10s0f1

 

ip rule을 이용한 서비스 대역 라우팅

  • 서비스 대역 20.20.20.0/24 : 라우팅 테이블 uplink1 로 보내고 우선순위는 1000(0에서 부터 오름차순으로 우선수위를 가짐)
  • 결국 uplink1의 default gateway에 의해 10.10.40.1로 라우팅 됨
[root@FW ~]# ip rule add from 20.20.20.0/24 lookup uplink1 prio 1000
[root@FW ~]# ip rule ls
0:	from all lookup local  
1000:	from 20.20.20.0/24 lookup uplink1 
32766:	from all lookup main 
32767:	from all lookup default

 

  • 서비스 대역 30.30.30.0/24 : 라우팅 테이블 uplink2 로 보내고 우선순위는 999(0에서 부터 오름차순으로 우선수위를 가짐)
  • 결국 uplink2의 default gateway에 의해 10.10.60.1로 라우팅 됨
[root@FW ~]# ip rule add from 30.30.30.0/24 lookup uplink2 prio 999
[root@FW ~]# ip rule ls
0:	from all lookup local 
999:	from 30.30.30.0/24 lookup uplink2
1000:	from 20.20.20.0/24 lookup uplink1 
32766:	from all lookup main 
32767:	from all lookup default

 

rp_filter

  • 라우팅 경로 설정에 따라 업링크가 달라지는 경우가 있어 rp_filter에 의해 라우팅이 안됨
  • rp_filter는 들어온 경로로 나가는 것을 원칙으로 리눅스에서 지원하는 보안 옵션임.
  • 다중 업링크의 라우팅의 경우 rp_filter를 꺼야 원활한 라우팅이 가능함.
 # net.ipv4.conf.all.rp_filter은 기본 off
 # 두개의 업링크 off 
 # net.ipv4.conf.enp10s0f1.rp_filter
 # net.ipv4.conf.enp9s0f1.rp_filter
 
 > cat /etc/sysctl.conf
 ...
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.eno1.rp_filter = 1
net.ipv4.conf.eno2.rp_filter = 1
net.ipv4.conf.eno3.rp_filter = 1
net.ipv4.conf.eno4.rp_filter = 1
net.ipv4.conf.enp10s0f0.rp_filter = 1
net.ipv4.conf.enp10s0f1.rp_filter = 0
net.ipv4.conf.enp9s0f0.rp_filter = 1
net.ipv4.conf.enp9s0f1.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0

 

반응형