다음 명령을 사용하여 Linux "라우터"에서 소스 정책 라우팅을 설정했습니다.
ip rule add from 192.168.1.0/24 table FOO
ip route add default dev eth0 table FOO
이 서브넷에서 전달된 패킷은 인터넷 대상에 도달합니다.
문제는 FOO 테이블이 main 테이블로부터 로컬 연결 경로를 상속받지 않는다는 것입니다.
로컬 연결을 위한 경로를 수동으로 추가할 수 있지만 이는 취약하고 유지 관리가 더 많이 필요합니다.
테이블 FOO가 기본 테이블의 모든 경로를 상속받도록 하려면 "ip 경로 추가 기본값..." 대신 "ip 경로 변경 기본값"을 사용할 수 있습니다.
기본 테이블의 기본 경로는 다른 서브넷에 남아 있어야 합니다.
어떻게 해야 하나요?
답변1
OP가 원하지 않는 새로운 라우팅 테이블과 규칙을 추가하는 일반적인 방법은 다음과 같습니다.
- "예외"를 포함하는 새 라우팅 테이블을 만듭니다.
FOO
- 이 테이블을 선택하려면 조건이 포함된 규칙을 추가하세요.
FOO
- 규칙의 우선순위가 더 낮기 때문에(더 나은)
FOO
새 테이블이 먼저 읽혀지므로 해당 테이블은 일반적으로 완전히 무시됩니다main
. 이 문제를 "수정"하려면main
테이블의 경로를 테이블에 복사하세요FOO
.
규칙은 다음과 같습니다.
# ip rule
0: from all lookup local
32765: from 192.168.1.0/24 lookup FOO
32766: from all lookup main
32767: from all lookup default
OP는 경로가 변경될 때 관리 부담이 증가하기 때문에 3을 수행할 필요가 없습니다.
내가 이해한 바에 따르면 OP가 원하는 것은 다음과 같습니다.
- 모든 로컬 트래픽은 표에 있는 공통 경로를 사용하여 처리되어야 합니다.
main
- 트래픽이 기본 경로에서 오는 경우 테이블 (여기 )
192.168.1.0/24
에서 가져와야 합니다.FOO
dev eth0
- 그렇지 않으면 트래픽이 "일반적인" 기본 경로를 사용합니다.
일반적인 순서 대신 이 순서로 구현해 보겠습니다. 결과는 질문에 설명된 것과 정확히 일치하지 않을 수 있지만 원하는 결과여야 합니다. 해결해야 할 실제 문제와 OP에서 제공한 올바른 구성이 없으면 일부 사항이 어색해 보일 수 있습니다(예: 테이블에서 테이블로 ip route
기본 경로를 이동하는 재사용된 출력 ).main
default
일반적인 규칙부터 시작하세요.
# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
테이블은 비어 있으며 default
(기본적으로) 자유롭게 사용할 수 있습니다.
# ip route show table default
#
main
발견된 규칙을 낮은 우선순위 로 이동# ip rule add priority 32000 from all lookup main # ip rule del priority 32766
예외 구현
# ip route add default dev eth0 table FOO # ip rule add priority 32100 from 192.168.1.0/24 lookup FOO
규칙 32100에서 예외가 트리거될 수 있도록 "일반적인" 기본 경로를 테이블에서
main
테이블 로 이동했습니다.default
이전에 일치하는 항목이 발견되지 않은 경우 규칙 32767은 여전히 테이블에 기본 경로를 제공하며default
연결 손실은 발생하지 않습니다.# ip route add $(ip route show 0.0.0.0/0) table default # ip route del default
이제 규칙은 다음과 같습니다.
# ip rule
0: from all lookup local
32000: from all lookup main
32100: from 192.168.1.0/24 lookup FOO
32767: from all lookup default
컨테이너의 몇 가지 예(관련된 테이블만 보면 별 의미가 없습니다):
# ip -br link
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eth0@if12 UP 66:d4:11:94:49:5f <BROADCAST,MULTICAST,UP,LOWER_UP>
local0@if9 UP 00:16:3e:6a:c1:e9 <BROADCAST,MULTICAST,UP,LOWER_UP>
# ip -4 -br a
lo UNKNOWN 127.0.0.1/8
local0@if9 UP 10.0.3.66/24
# ip route
10.0.3.0/24 dev local0 proto kernel scope link src 10.0.3.66
# ip route show table FOO
default dev eth0 scope link
# ip route show table default
default via 10.0.3.1 dev local0
# ip -o route get 10.0.3.2
10.0.3.2 dev local0 src 10.0.3.66 \ cache
# ip -o route get 8.8.8.8
8.8.8.8 via 10.0.3.1 dev local0 table default src 10.0.3.66 \ cache
# ip -o route get 8.8.8.8 from 192.168.1.2 iif local0
8.8.8.8 from 192.168.1.2 dev eth0 table FOO \ cache iif local0
그게 다야. 유일한 사용법 차이점은 "일반적인" 기본 경로가 이제 table default
( 253
) 대신 table main
( )에 설정되어야 한다는 것입니다 254
. 이를 처리하려면 부팅 스크립트를 조정해야 합니다. 설정에서는 기본 경로나 게이트웨이를 지정해서는 안 되며 이를 수행하려면 추가 사용자 정의 스크립트를 실행해야 합니다 ip route add default ... table default
. Debian의 경우 이는 다음 명령을 통해 수행할 수 있습니다 post-up
(예를 들어 post-up ip route add default via xxx table default || :
) 존재하다 /etc/network/interfaces
. RHEL7의 경우 이 작업을 수행해야 합니다.경로-XXX문서. systemd의 새로운 네트워킹 방법에 관해서는 모르겠습니다.
답변2
그냥 추가하세요
ip rule add from 192.168.1.0/24 table main suppress_prefixlength 0
패킷이 이동하여 table main
경로를 찾지만 table main
기본 경로는 사용되지 않습니다.
그런 다음 패킷은 으로 이동하여 table FOO
으로 라우팅됩니다 eth0
.