차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
multiple_gateway_설정 [2024/04/19 04:41] – [라우팅 테이블 등록] koovmultiple_gateway_설정 [2024/04/19 12:06] (현재) – [NetworkManager 사용시] koov
줄 4: 줄 4:
  
 두개의 NIC, 두개의 Default Gateway 설정방법 두개의 NIC, 두개의 Default Gateway 설정방법
- 
- 
  
 ===== 기본 환경 ===== ===== 기본 환경 =====
줄 41: 줄 39:
 동일한 환경에서 ''SERVER-A''의 두번째 NIC인 ''eth1''의 ''10.33.0.117''로 핑을 시도하면 핑이 되지 않는것을 확인할 수 있다. 동일한 환경에서 ''SERVER-A''의 두번째 NIC인 ''eth1''의 ''10.33.0.117''로 핑을 시도하면 핑이 되지 않는것을 확인할 수 있다.
  
-이때 ''tcpdump''를 살펴보면 아래와 같다.+이때 ''SERVER-A''에서 ''tcpdump''를 살펴보면 아래와 같다.
 <WRAP prewrap> <WRAP prewrap>
 <code bash> <code bash>
줄 57: 줄 55:
 </WRAP> </WRAP>
  
-확인된 바와 같이 ''PING'' 패킷이 ''eth1''으로 들어오지만 나가는것은 없다. 이것은 SERVER-A의 OS에서 응답자체를 안한다는 것인데 왜 그런가 하면 위의 그림에 설명된 바와 같이 요즘 OS(RHEL 7 이상)는 기본적으로 ''rp_filter''가 ''RFC3704''에 정의된 대로 ''Strict mode (=1)''로 설정되어있기 때문이다. ''rp_filter''에 대한 설명은 [[rp_filter|아래]]를 참고한다.+확인된 바와 같이 ''PING'' 패킷이 ''eth1''으로 들어오지만 나가는것은 없다. 이것은 SERVER-A의 OS에서 응답자체를 안한다는 것인데 왜 그런가 하면 위의 그림에 설명된 바와 같이 요즘 OS(RHEL 7 이상)는 기본적으로 ''rp_filter''가 ''RFC3704''에 정의된 대로 ''Strict mode (=1)''로 설정되어있기 때문이다. ''rp_filter''에 대한 설명은 [[#rp_filter|아래]]를 참고한다.
  
 이 상황을 해결하려면 아래처럼 ''rp_filter''값을 설정하면 된다. 이 상황을 해결하려면 아래처럼 ''rp_filter''값을 설정하면 된다.
줄 74: 줄 72:
 </WRAP> </WRAP>
  
-이렇게 하면 ''PING''통신이 동작하는데 SERVER-A에서 ''tcpdump''로 패킷을 확인해보면+이렇게 하면 ''PING''통신이 동작하는데 ''SERVER-A''에서 ''tcpdump''로 패킷을 확인해보면
  
 <WRAP prewrap> <WRAP prewrap>
줄 127: 줄 125:
 <code vim /etc/sysconfig/network-script/rule-eth0> <code vim /etc/sysconfig/network-script/rule-eth0>
 ### /etc/sysconfig/network-script/rule-eth0 ### /etc/sysconfig/network-script/rule-eth0
-iif eth0 table 1 +iif eth0 priority 100 table 1 
-from 192.168.0.117 table 1+from 192.168.0.117 priority 100 table 1
 </code> </code>
 </WRAP> </WRAP>
줄 140: 줄 138:
 <code vim /etc/sysconfig/network-script/rule-eth1> <code vim /etc/sysconfig/network-script/rule-eth1>
 ### /etc/sysconfig/network-script/rule-eth1 ### /etc/sysconfig/network-script/rule-eth1
-iif eth1 table 1 +iif eth1 priority 100 table 1 
-from 10.33.0.117 table 2+from 10.33.0.117 priority 100 table 2
 </code> </code>
 </WRAP> </WRAP>
 +''priority'' 값은 위 상황에선 생략 가능하다.
  
 +이렇게 설정하고 ''PING''을 날려보면
 +<WRAP prewrap>
 +<code bash>
 +tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
 +listening on eth1:, link-type EN10MB (Ethernet), capture size 262144 bytes
 +[Interface:eth1:   00:44:19.811711 IP 10.33.19.123 > 10.33.0.117: ICMP echo request, id 51, seq 22, length 64
 +[Interface:eth1:   00:44:19.811739 IP 10.33.0.117 > 10.33.19.123: ICMP echo reply, id 51, seq 22, length 64
 +[Interface:eth1:   00:44:20.835779 IP 10.33.19.123 > 10.33.0.117: ICMP echo request, id 51, seq 23, length 64
 +[Interface:eth1:   00:44:20.835822 IP 10.33.0.117 > 10.33.19.123: ICMP echo reply, id 51, seq 23, length 64
 +[Interface:eth1:   00:44:21.859569 IP 10.33.19.123 > 10.33.0.117: ICMP echo request, id 51, seq 24, length 64
 +[Interface:eth1:   00:44:21.859601 IP 10.33.0.117 > 10.33.19.123: ICMP echo reply, id 51, seq 24, length 64
 +</code>
 +</WRAP>
  
-===== 설정 정보 =====+위와같이 동일한 인터페이스 ''eth1''으로 응답하는것을 확인할 수 있다.
  
 +===== NetworkManager 사용시 =====
 +전통적인 ''ifconfig'' 파일이 아닌 ''NetworkManager''를 사용하는경우는 설정 방법이 다르다. 기존의 ''ifcfg-eth0''파일이나 ''route-eth0'', ''rule-eth0''과 같은 파일을 사용할 수 없다.
  
-{{:rhel:구성도.png|}}+''NetworkManager''는 자체적으로 별의 라우팅테이블을 지정하는 기능이 없으므로 ''dispatcher script''를 이용하여야 한다.
  
-위 그림의 ''192.168.0.0/24'' 와 ''192.168.1.0/24''는 각각 공인IP라고 가정다. +위와 동일한 구성을 하려면 아래 파일을 생성하면 된다.
-두개의 서브넷을 가지며 두개 모두 독립적으로 작동중인 네트워크다.+
  
-**디폴트 게이트웨이**는 ''192.168.0.1''이며 기본적인 트래픽은 ''eth0''을 통해서 이루다. +''/etc/NetworkManager/dispatcher.d/10-multiple-gw'' 
-지만 인커밍 리퀘스트가 발생하는 NIC별로 트픽이 발생하게 된다.+<WRAP prewrap> 
 +<code vim> 
 +#!/bin/bash 
 + 
 +INTERFACE=$1 
 +ACTION=$2 
 + 
 +if [ "$INTERFACE" == "eth0" ]; then 
 +    if [ "$ACTION" == "up" ]; then 
 +        ip route add 192.168.0.0/24 dev eth0 table 1 
 +        ip route add default via 192.168.0.1 dev eth0 table 1 
 + ip rule add iif eth0 priority 100 table 1 
 + ip rule add from 192.168.0.117 priority 100 table 1 
 +    fi 
 +fi 
 + 
 +if [ "$INTERFACE" == "eth1" ]; then 
 +    if [ "$ACTION" == "up" ]; then 
 + ip route add 10.33.0.0/24 dev eth1 table 2 
 + ip route add default via 10.33.0.1 dev eth1 table 2 
 + ip rule add iif eth1 priority 100 table 2 
 +        ip rule add from 10.33.0.117 priority 100 table 2 
 +    fi 
 +fi 
 +</code> 
 +</WRAP> 
 + 
 +그리고 **해당파일에 반드시 실행권한(+x)을 부여**해줘야 한다. 각 스크립트는 ''root''가 소유한 **일반 실행 파일**어야 합니다. 또한 그룹이나 다른 사람이 쓸 수 없어야 하며 ''setuid''가 아니야 합니다. 
 +참조링크 : https://networkmanager.dev/docs/api/latest/NetworkManager-dispatcher.html 
 + 
 +한방에 려면 아래 ''chmod''명령어 참고 
 +<WRAP prewrap> 
 +<code bash> 
 +chmod +x,g-w,o-w,-s,-t /etc/NetworkManager/dispatcher.d/10-multiple-gw 
 +</code> 
 +</WRAP>
  
  
 ====== rp_filter ====== ====== rp_filter ======
-다중 게이트웨이 설정을 하기전에 일단 ''rp_filter''에 대해 알아야 한다. 
  
 ''Reverse Path Filtering(rp_filter)'' 는 리눅스 커널이 라우팅 테이블을 참조하여 수신된 IP 패킷을 외부로 전달하는 기능을 하는 ''IP forwarding''과 달리 ''RP Filtering''은 **패킷이 들어오는 네트워크 인터페이스와 라우팅 테이블에 등록되어 있는 출발지 주소가 일치하지 않는 경우 자동으로 들어오는 패킷을 거절**하는 역할을 합니다 ''Reverse Path Filtering(rp_filter)'' 는 리눅스 커널이 라우팅 테이블을 참조하여 수신된 IP 패킷을 외부로 전달하는 기능을 하는 ''IP forwarding''과 달리 ''RP Filtering''은 **패킷이 들어오는 네트워크 인터페이스와 라우팅 테이블에 등록되어 있는 출발지 주소가 일치하지 않는 경우 자동으로 들어오는 패킷을 거절**하는 역할을 합니다
줄 192: 줄 239:
   * 커널 공식 문서에는 이 값이 기본적으로 ''0''으로 설정되어 있다고 하지만 리눅스 배포판마다 기본값을 다르게 설정하고 있습니다.   * 커널 공식 문서에는 이 값이 기본적으로 ''0''으로 설정되어 있다고 하지만 리눅스 배포판마다 기본값을 다르게 설정하고 있습니다.
  
-  * RHEL 6 이상은 기본적으로 [[http://tools.ietf.org/html/rfc3704]]에 권장되는 엄격한 역방향 전달 필터링을 적용하도록 구성됩니다. 기본값 ''1''+  * ''RHEL 6'' 이상은 기본적으로 [[http://tools.ietf.org/html/rfc3704]]에 권장되는 엄격한 역방향 전달 필터링을 적용하도록 구성됩니다. 기본값 ''1''
  
-  * Strict mode(엄격한 필터링)는 __패킷이 시스템에 도착하면 커널이 패킷의 소스 IP를 가져와 라우팅 테이블을 조회하여 패킷이 도착한 인터페이스가 커널이 해당 IP에 패킷을 보내는 데 사용하는 것과 동일한 인터페이스인지 확인__합니다. 인터페이스가 동일하면 패킷이 엄격한 필터링 테스트를 통과하고 정상적으로 처리됩니다. **인터페이스가 동일하지 않으면 패킷은 추가 처리 없이 폐기**되고 RHEL 7+에서는 ''IPReversePathFilter''카운터가 증가됩니다.+  * ''Strict mode(엄격한 필터링)''는 __패킷이 시스템에 도착하면 커널이 패킷의 소스 IP를 가져와 라우팅 테이블을 조회하여 패킷이 도착한 인터페이스가 커널이 해당 IP에 패킷을 보내는 데 사용하는 것과 동일한 인터페이스인지 확인__합니다. 인터페이스가 동일하면 패킷이 ''엄격한 필터링 테스트''를 통과하고 정상적으로 처리됩니다. **인터페이스가 동일하지 않으면 패킷은 추가 처리 없이 폐기**되고 ''RHEL 7+''에서는 ''IPReversePathFilter''카운터가 증가됩니다.
  
   * 엄격한 필터링의 주요 효과는 **지정된 원격 IP의 경우 시스템이 특정 인터페이스를 통해서만 통신한다**는 것입니다. 지정된 원격 IP 또는 네트워크에 응답하는 인터페이스를 제어하도록 정적 경로를 설정합니다.   * 엄격한 필터링의 주요 효과는 **지정된 원격 IP의 경우 시스템이 특정 인터페이스를 통해서만 통신한다**는 것입니다. 지정된 원격 IP 또는 네트워크에 응답하는 인터페이스를 제어하도록 정적 경로를 설정합니다.
  
-  * ''RHEL 5'' 이전버전에서 커널은 엄격한 필터링을 지원하지 않았습니다. 따라서 이러한 이전 릴리스에서 매개 변수에는 0(비활성화) 및 1(느슨한) 두 가지 가능한 값만 있습니다. 기본값은 1(느슨한)입니다.+  * ''RHEL 5'' 이전버전에서 커널은 엄격한 필터링을 지원하지 않았습니다. 따라서 이러한 이전 릴리스에서 매개 변수에는 ''0(비활성화)'' 및 ''1(느슨한)'' 두 가지 가능한 값만 있습니다. 기본값은 ''1(느슨한)''입니다.
  
 <WRAP prewrap> <WRAP prewrap>
줄 213: 줄 260:
   * https://access.redhat.com/solutions/30564   * https://access.redhat.com/solutions/30564
  
-===== 단계1 ===== 
- 
-==== set up eth0 ==== 
- 
- 
-/etc/iproute2/rt_tables 수정 
-<WRAP prewrap> 
-<code bash> 
-# cat /etc/iproute2/rt_tables 
-# echo "# dual nic-gateway below" >> /etc/iproute2/rt_tables 
-# echo "10 eth0table" >> /etc/iproute2/rt_tables 
-# cat /etc/iproute2/rt_tables 
-</code> 
-</WRAP> 
- 
-==== 라우팅 테이블 추가 ==== 
- 
-<WRAP prewrap> 
-<code bash> 
-# ip route add 192.168.0.0/24 dev eth0 src 192.168.0.100 table eth0table 
-# ip route add default via 192.168.0.1 dev eth0 table eth0table 
- 
- 
-# ip rule add from 192.168.0.100/32 table eth0table 
-# ip rule add to 192.168.0.100 table eth0table 
- 
-# ip route flush cache 
-</code> 
-</WRAP> 
- 
-재부팅 시에도 위 라우팅 테이블이 적용되도록 설정 
-<WRAP prewrap> 
-<code vim> 
-# vi /etc/sysconfig/network-scripts/route-eth0 
- 
-192.168.0.0 dev eth0 src 192.168.0.100 table eth0table 
-default via 192.168.0.1 dev eth0 table eth0table 
-</code> 
-</WRAP> 
- 
-<WRAP prewrap> 
-<code vim> 
-# vi /etc/sysconfig/network-scripts/rule-eth0 
- 
-from 192.168.0.100/32 table eth0table 
-to 192.168.0.100 table eth0table 
-</code> 
-</WRAP> 
- 
- 
-===== 단계2 ===== 
- 
- 
-==== set up eth1 ==== 
- 
-/etc/iproute2/rt_tables 수정 
-<WRAP prewrap> 
-<code bash> 
-# cat /etc/iproute2/rt_tables 
-# echo "# dual nic-gateway below" >> /etc/iproute2/rt_tables 
-# echo "11 eth1table" >> /etc/iproute2/rt_tables 
-# cat /etc/iproute2/rt_tables 
-</code> 
-</WRAP> 
- 
- 
-==== 라우팅 테이블 수정 ==== 
-<WRAP prewrap> 
-<code bash> 
- 
-# ip route add 192.168.1.0/24 dev eth1 src 192.168.1.200 table eth1table  
-# ip route add default via 192.168.1.1 dev eth1 table eth1table 
- 
-# ip rule add from 192.168.1.200/32 table eth1table 
-# ip rule add to 192.168.1.200 table eth1table 
- 
-# ip route flush cache 
-</code> 
-</WRAP> 
- 
- 
-재부팅 시에도 위 라우팅 테이블이 적용되도록 설정 
-<WRAP prewrap> 
-<code vim> 
-# vi /etc/sysconfig/network-scripts/route-eth1 
- 
-192.168.1.0 dev eth1 src 192.168.1.200 table eth1table 
-default via 192.168.1.1 dev eth1 table eth1table 
-</code> 
-</WRAP> 
- 
-<WRAP prewrap> 
-<code vim> 
-# vi /etc/sysconfig/network-scripts/rule-eth1 
- 
-from 192.168.1.200/32 table eth1table 
-to 192.168.1.200 table eth1table 
-</code> 
-</WRAP> 
- 
- 
-작업이 완료된 이후 network 재시작등을 수행해준다. 
- 
-===== 설정1 ===== 
-이 방법은 나가는 네트워크는 기본게이트웨이 하나로만 나가게 되지만 들어오는 요청은 요청받은 NIC를 통해 응답하게 하는 방식이다. 
- 
-서버 네트워크  
-A네트워크는 공인 네트워크 
-IP 210.10.10.11/25 
-GW 210.10.10.1 
- 
-B네트워크는 사설 네트워크 
-IP 10.1.10.11/24 
-GW 10.1.10.1 
- 
-<WRAP prewrap> 
-<code bash> 
-[root@server network-scripts]# cat route-ens192  
-210.10.10.0/25 dev ens192 table ens192table 
-default via 210.10.10.1 dev ens192 table ens192table 
- 
-[root@server network-scripts]# cat route-ens224  
-10.1.10.0/24 dev ens224 table ens224table 
-default via 10.1.10.1 dev ens224 table ens224table 
- 
-[root@server network-scripts]# cat rule-ens192  
-from 210.10.10.11/32 table ens192table priority 100 
- 
-[root@server network-scripts]# cat rule-ens224  
-from 10.1.10.11/32 table ens224table priority 200 
- 
-</code> 
-</WRAP> 
- 
-라우팅 테이블 추가 
-<WRAP prewrap> 
-<code vim /etc/iproute2/rt_table> 
-# 
-# L4 network route 
-# 
-10 ens192table 
-11 ens224table 
-</code> 
-</WRAP> 
- 
-===== 설정2 ===== 
-  * eth0 
-네트워크A 192.168.0.0/24 
-IPADDRESS 192.168.0.10 
-GATEWAY 192.168.0.1 
- 
-  * eth1 
-네트워크B 10.0.0.0/24 
-IPADDRESS 10.0.0.30 
-GATEWAY 10.0.0.1 
- 
-<WRAP prewrap> 
-<code vim /etc/sysconfig/network-script/ifcfg-eth0> 
-TYPE=Ethernet 
-BOOTPROTO=none 
-NAME=eth0 
-DEVICE=eth0 
-IPADDR=192.168.0.10 
-NETMASK=255.255.255.0 
-#GATEWAY=192.168.0.1 # Gateway 설정은 하지 않는다. 
-ONBOOT=yes 
-NM_CONTROLLED=no 
-</code> 
-</WRAP> 
- 
-<WRAP prewrap> 
-<code vim /etc/sysconfig/network-script/ifcfg-eth1> 
-TYPE=Ethernet 
-BOOTPROTO=none 
-NAME=eth1 
-DEVICE=eth1 
-IPADDR=10.0.0.30 
-NETMASK=255.255.255.0 
-#GATEWAY=10.0.0.1 # Gateway 설정은 하지 않는다. 
-ONBOOT=yes 
-NM_CONTROLLED=no 
-</code> 
-</WRAP> 
- 
-위에서 ''중요한것은 두 인터페이스 둘다 게이트웨이 설정은 하지 않는다''는것이다. 게이트웨이 설정을 하게 될경우 먼저올라오는 인터페이스의 게이트웨이가 디폴트 게이트웨이로 잡혀버린다. 따라서 이후에 설정하는 라우팅테이블이 무용지물이 되어버리므로 기본 게이트웨이가 잡히지 않도록 설정한다. 
- 
-<WRAP prewrap> 
-<code vim /etc/sysconfig/network-script/route-eth0> 
-default nexthop via 192.168.0.1 weight 1 nexthop via 10.0.0.1 weight 1 
-</code> 
-</WRAP> 
- 
-<WRAP prewrap> 
-<code vim /etc/sysconfig/network-script/route-eth1> 
-default nexthop via 192.168.0.1 weight 1 nexthop via 10.0.0.1 weight 1 
-</code> 
-</WRAP> 
- 
-라우팅 테이블은 두 인터페이스 모두 동일하게 설정해준다. 또는 인터페이스별로 nexthop 순서를 바꿔도 상관은 없다. 
- 
-<WRAP prewrap> 
-<code vim /etc/sysconfig/network-script/rule-eth0> 
-iif eth0 table 1 
-from 192.168.0.10 table 1 
-</code> 
-</WRAP> 
- 
-<WRAP prewrap> 
-<code vim /etc/sysconfig/network-script/rule-eth1> 
-iif eth1 table 2 
-from 10.0.0.30 table 2 
-</code> 
-</WRAP> 
- 
-룰 설정은 들어온 인터페이스로 통신하기 위해서 해당 인터페이스 입력은 해당 아이피 라우팅 테이블을 이용하도록 설정해준다. 
- 
-ip route 명령어를 통해 라우팅 테이블을 보면 아래와 비슷한 형태로 출력이 된다. 
- 
-<WRAP prewrap> 
-<code bash> 
-[root@test ~]# ip r 
-default  
- nexthop via 192.168.0.1 dev eth0 weight 1  
- nexthop via 10.0.0.1 dev eth1 weight 1  
-169.254.0.0/16 dev eth0 scope link metric 1002  
-169.254.0.0/16 dev eth1 scope link metric 1003  
-192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.10 
-10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.30 
-</code> 
-</WRAP> 
  
 ===== 참조링크 ===== ===== 참조링크 =====
  • multiple_gateway_설정.1713501717.txt.gz
  • 마지막으로 수정됨: 2024/04/19 04:41
  • 저자 koov