iproute2 테이블 상속 또는 복사

iproute2 테이블 상속 또는 복사

다음 명령을 사용하여 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가 원하지 않는 새로운 라우팅 테이블과 규칙을 추가하는 일반적인 방법은 다음과 같습니다.

  1. "예외"를 포함하는 새 라우팅 테이블을 만듭니다.FOO
  2. 이 테이블을 선택하려면 조건이 포함된 규칙을 추가하세요.FOO
  3. 규칙의 우선순위가 더 낮기 때문에(더 나은) 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가 원하는 것은 다음과 같습니다.

  1. 모든 로컬 트래픽은 표에 있는 공통 경로를 사용하여 처리되어야 합니다.main
  2. 트래픽이 기본 경로에서 오는 경우 테이블 (여기 ) 192.168.1.0/24에서 가져와야 합니다.FOOdev eth0
  3. 그렇지 않으면 트래픽이 "일반적인" 기본 경로를 사용합니다.

일반적인 순서 대신 이 순서로 구현해 보겠습니다. 결과는 질문에 설명된 것과 정확히 일치하지 않을 수 있지만 원하는 결과여야 합니다. 해결해야 할 실제 문제와 OP에서 제공한 올바른 구성이 없으면 일부 사항이 어색해 보일 수 있습니다(예: 테이블에서 테이블로 ip route기본 경로를 이동하는 재사용된 출력 ).maindefault

일반적인 규칙부터 시작하세요.

# ip rule
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

테이블은 비어 있으며 default(기본적으로) 자유롭게 사용할 수 있습니다.

# ip route show table default
#
  1. main발견된 규칙을 낮은 우선순위 로 이동

    # ip rule add priority 32000 from all lookup main
    # ip rule del priority 32766
    
  2. 예외 구현

    # ip route add default dev eth0 table FOO
    # ip rule add priority 32100 from 192.168.1.0/24 lookup FOO
    
  3. 규칙 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.

관련 정보