양쪽 이전 판 이전 판 다음 판 | 이전 판 |
multiple_gateway_설정 [2024/04/19 05:39] – koov | multiple_gateway_설정 [2024/04/19 12:06] (현재) – [NetworkManager 사용시] koov |
---|
| |
두개의 NIC, 두개의 Default Gateway 설정방법 | 두개의 NIC, 두개의 Default Gateway 설정방법 |
| |
| |
| |
===== 기본 환경 ===== | ===== 기본 환경 ===== |
동일한 환경에서 ''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> |
</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''값을 설정하면 된다. |
</WRAP> | </WRAP> |
| |
이렇게 하면 ''PING''통신이 동작하는데 SERVER-A에서 ''tcpdump''로 패킷을 확인해보면 | 이렇게 하면 ''PING''통신이 동작하는데 ''SERVER-A''에서 ''tcpdump''로 패킷을 확인해보면 |
| |
<WRAP prewrap> | <WRAP prewrap> |
| |
위와같이 동일한 인터페이스 ''eth1''으로 응답하는것을 확인할 수 있다. | 위와같이 동일한 인터페이스 ''eth1''으로 응답하는것을 확인할 수 있다. |
| |
| ===== NetworkManager 사용시 ===== |
| 전통적인 ''ifconfig'' 파일이 아닌 ''NetworkManager''를 사용하는경우는 설정 방법이 다르다. 기존의 ''ifcfg-eth0''파일이나 ''route-eth0'', ''rule-eth0''과 같은 파일을 사용할 수 없다. |
| |
| ''NetworkManager''는 자체적으로 별도의 라우팅테이블을 지정하는 기능이 없으므로 ''dispatcher script''를 이용하여야 한다. |
| |
| 위와 동일한 구성을 하려면 아래 파일을 생성하면 된다. |
| |
| ''/etc/NetworkManager/dispatcher.d/10-multiple-gw'' |
| <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> |
| |
| |
* 커널 공식 문서에는 이 값이 기본적으로 ''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> |