메뉴 닫기

리눅스 multi default gateway(routing) 설정

서버를 운영하다 보면 다른 네트워크 즉 2개 이상의 vlan 환경에서 테스트를 해야
하는 경우가 있습니다.

이것은 2개 이상의 게이트웨이를 설정해야한다는 말이며 인터페이스(디바이스) 2개이상
사용 할수 있는것을 의미 합니다.

기본적으로 어떤 운영 체제이든 기본 게이트웨이가 1개만 동작하게 되어 있으며
2개 이상의 게이트웨이를 설정할 경우 한개의 게이트웨이만 동작하게 됩니다.

2개 이상 게이트웨이를 사용할려면 리눅스에서는 라우팅 테이블과 룰을 수정해야 합니다.

2개 이상의 인터페이스 사용시 부하 분산 및 서비스 별 인터페이스 분리 및 여러 가지 이점이
있습니다.

 

※ 참고 – 테스트는 CentOS6 에서 진행 했습니다.

네트워크 디바이스 설정


[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=211.xxx.xxx.132
NETMASK=255.255.255.224
GATEWAY=211.xxx.xxxx.129

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=211.xxx.xxx.70
NETMASK=255.255.255.248
DNS=115.68.62.210

작업전 routing table, rule 확인


[root@localhost ~]# ip route show table 1
[root@localhost ~]# ip route show table 2
[root@localhost ~]# 
# 출력 되는게 없어야 한다.

[root@localhost ~]# ip rule show
0:	from all lookup local 
32766:	from all lookup main 
32767:	from all lookup default
# 기본 룰만 확인된다.

routing, rule 추가


[root@localhost ~]# ip route add 211.xxx.xxx.128/27 dev eth0 table 1
# eth0 네트웍 cidr(네트웍아이피/넷마스크) 라우팅 테이블에 추가.

[root@localhost ~]# ip route add default via 211.xxx.xxx.129 table 1
# eth0 게이트웨이 라우팅 테이블에 추가.

[root@localhost ~]# ip route add 211.xxx.xxx.64/29 dev eth1 table 2
# eth1 네트웍 cidr(네트웍아이피/넷마스크) 라우팅 테이블에 추가.

[root@localhost ~]# ip route add default via 211.xxx.xxx.65 table 2
# eth1 게이트웨이 라우팅 테이블에 추가.

[root@localhost ~]# ip rule add from 211.xxx.xxx.132/32 table 1 priority 100
# 위에 생성한 table 1과 eth0의 IP를 통해 통신하도록 설정하는 룰을 생성하며 priority는 중요하지 않음 .

[root@localhost ~]# ip rule add from 211.xxx.xxx.70/32 table 2 priority 110
# 위에 생성한 table 2과 eth1의 IP를 통해 통신하도록 설정하는 룰을 생성하며 priority는 중요하지 않음 .

[root@localhost ~]# ip route flush cache
# iproute2가 규칙이 추가되거나 제거시 자동적으로 플러시 되지 않아서 플러시 해주라고 한다.

확인


[root@localhost ~]# ip route show table 1
211.xxx.xxx.128/27 dev eth0  scope link 
default via 211.xxx.xxx.129 dev eth0 
# 테이블 확인.

[root@localhost ~]# ip route show table 2
211.xxx.xxx.64/29 dev eth1  scope link 
default via 211.xxx.xxx.65 dev eth1
# 테이블 확인.

[root@localhost ~]# ip rule show
0:	from all lookup local 
100:	from 211.xxx.xxx.132 lookup 1 
110:	from 211.xxx.xxx.70 lookup 2 
32766:	from all lookup main 
32767:	from all lookup default 
# 룰 확인.

[root@localhost ~]# ip route get 8.8.8.8 from 211.55.113.132
8.8.8.8 from 211.xxx.xxx.132 via 211.xxx.xxx.129 dev eth0 
    cache  mtu 1500 hoplimit 64

[root@localhost ~]# ip route get 8.8.8.8 from 211.xxx.xxx.70
8.8.8.8 from 211.xxx.xxx.70 via 211.xxx.xxx.65 dev eth1 
    cache  mtu 1500 hoplimit 64
# 디바이스 아이피별로 게이트웨이 확인.

[root@localhost ~]# tcpdump -nni eth0 icmp -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:55:59.324402 IP 222.xxx.xxx.6 > 211.xxx.xxx.132: ICMP echo request, id 19137, seq 14, length 64
12:55:59.324418 IP 211.xxx.xxx.132 > 222.xxx.xxx.6: ICMP echo reply, id 19137, seq 14, length 64
12:56:00.326902 IP 222.xxx.xxx.6 > 211.xxx.xxx.132: ICMP echo request, id 19137, seq 15, length 64
12:56:00.326913 IP 211.xxx.xxx.132 > 222.xxx.xxx.6: ICMP echo reply, id 19137, seq 15, length 64
12:56:01.329372 IP 222.xxx.xxx.6 > 211.xxx.xxx.132: ICMP echo request, id 19137, seq 16, length 64
# eth0 디바이스 트래픽 확인.

[root@localhost ~]# tcpdump -nni eth1 icmp -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
12:56:26.275612 IP 222.xxx.xxx.6 > 211.xxx.xxx.70: ICMP echo request, id 19139, seq 8, length 64
12:56:26.275627 IP 211.xxx.xxx.70 > 222.xxx.xxx.6: ICMP echo reply, id 19139, seq 8, length 64
12:56:27.279244 IP 222.xxx.xxx.6 > 211.xxx.xxx.70: ICMP echo request, id 19139, seq 9, length 64
12:56:27.279256 IP 211.xxx.xxx.70 > 222.xxx.xxx.6: ICMP echo reply, id 19139, seq 9, length 64
12:56:28.280733 IP 222.xxx.xxx.6 > 211.xxx.xxx.70: ICMP echo request, id 19139, seq 10, length 64
# eth1 디바이스 트래픽 확인.

서버 재시작후 자동으로 route, rule을 넣기 위해 rc.local에 관련 내용 추가한다.


[root@localhost ~]# vi /etc/rc.local 
...
...
ip route add 211.xxx.xxx.128/27 dev eth0 table 1
ip route add default via 211.xxx.xxx.129 table 1
ip route add 211.xxx.xxx.64/29 dev eth1 table 2
ip route add default via 211.xxx.xxx.65 table 2
ip rule add from 211.xxx.xxx.132/32 table 1 priority 100
ip rule add from 211.xxx.xxx.70/32 table 2 priority 110
ip route flush cache
# 재부팅후 룰이 들어가 있나 확인은 해보자

[root@localhost ~]# ip route show table 1
211.xxx.xxx.128/27 dev eth0  scope link 
default via 211.xxx.xxx.129 dev eth0 

[root@localhost ~]# ip route show table 2
211.xxx.xxx.64/29 dev eth1  scope link 
default via 211.xxx.xxx.65 dev eth1 

[root@localhost ~]# ip rule show
0:	from all lookup local 
100:	from 211.xxx.xxx.132 lookup 1 
110:	from 211.xxx.xxx.70 lookup 2 
32766:	from all lookup main 
32767:	from all lookup default 

참고 사항


[root@localhost ~]# ping -I eth0 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 211.xxx.xxx.132 eth0: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=30.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=30.5 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1070ms
rtt min/avg/max/mdev = 30.228/30.374/30.521/0.227 ms

[root@localhost ~]# ping -I eth1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 211.xxx.xxx.70 eth1: 56(84) bytes of data.
From 211.xxx.xxx.70 icmp_seq=2 Destination Host Unreachable
From 211.xxx.xxx.70 icmp_seq=3 Destination Host Unreachable
From 211.xxx.xxx.70 icmp_seq=4 Destination Host Unreachable
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3838ms
pipe 3
# ssh혹은 서버 접속후 외부로의 통신은 default routing으로 통신된다.
   eth1의 IP로 ssh 접속후 ping을 외부로 요청했다고 하면 ssh 관련된 트래픽은 eth1을 타나 ping관련 icmp 트래픽은
   default routing 인 eth0으로 통신된다. 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x