반응형
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
반응형
'OS > Linux' 카테고리의 다른 글
lsyncd + rsyncd 데이터 실시간 동기화 (0) | 2022.06.07 |
---|---|
CentOS7 에서 iptables GeoIP 모듈 적용하기 (0) | 2022.05.13 |
Ubuntu 12.04 Repository 변경 (0) | 2022.04.26 |
Linux child process 중 cpu가 높은 pid 확인 방법 (0) | 2021.03.23 |
[LINUX] 실제 디스크 용량과 df 용량의 차이가 있은 경우 (0) | 2021.03.19 |