Linux에서 몇 개의 사용자 지정 라우팅 테이블을 가질 수 있습니까?


12

나는 리눅스에서 커스텀 라우트 테이블을 다루고 있는데 "ip route"명령의 문서와 동작에 약간 혼란스러워한다. 유일하게 유효한 값은 0-255에 / etc / iproute2 / rt_tables에 정의 된 이름을 더한 것 같습니다.

255 local
254 main
253 default
0   unspec

사용자 정의 테이블의 경우 1-252가 남습니다. 정의되지 않은 테이블 이름을 사용하려고하면 오류가 발생합니다.

$ ip route show table kermit
Error: argument "kermit" is wrong: table id value is invalid

그러나 오류없이 255보다 훨씬 큰 숫자를 사용할 수있는 것 같습니다.

$ ip route show table 1000
[no output]
$ ip route add 10.10.10.0/24 dev eth0 table 1000
[no output]
$ ip route show table 1000
10.10.10.0/24 dev eth0  scope link

언젠가는 상황이 더 이상해집니다. maxint (2 ^ 31)에서 로컬 테이블 (255)로 "오버 플로우"됩니다.

$ ip route show table 2147483647
[no output]
$ ip route show table 2147483648
[exact output of table 255 (local)]

아무도 무슨 일이 일어나고 있는지 설명 할 수 있습니까? 실제로 사용할 수있는 maxint 사용자 지정 라우팅 테이블이 있습니까?

답변:


8

2.6 커널과 관련하여 max 테이블은 0xFFFFFFFF (rtnetlink.h에서)입니다. 그러나 iproute2는 필터에서 부호있는 정수를 사용하여 조회를 수행하므로 2 ^ 31에서 유효하지 않은 테이블을 지정했다고 생각하고 기본값은 테이블 255를 표시합니다.


따라서 잘못된 이름으로 오류가 발생하지만 잘못된 정수는 255입니까? 또한 255는 이전 최대 (2.4에서?)이지만 커널 2.6에서 32 비트 숫자로 증가했다고 가정합니까?
— Bob

그렇습니다, 2.4와 2.2의 최대 값은 255입니다.
— Ciclamino

또한 32 비트를 가진 값에 대해 항상 표 255를 표시하는 것은 계획된 동작이 아니며 버그 일뿐입니다. iproute에 대한 한 줄 패치로 4294967290 번호의 테이블을 만들고 표시 할 수있었습니다. 그러나 그렇게 간단하지는 않지만 2 ^ 32 테이블을 처리하지 않는 다른 부분이있을 수 있습니다.
— Ciclamino

감사합니다 패치를 제출해야 할 수도 있습니다 :)
— Bob

1
보다 최근의 도구는 최대 2 ^ 32-1까지 테이블 값을 허용하는 경향이 있습니다 (예 : $ ip -V ip utility, iproute2-ss180813 $ ip route list table 4294967296 Error: argument "4294967296" is wrong: table id value is invalid $ ip route list table 4294967295(출력 없음). 이전 동작은 "unspec"테이블 0 (255 아님)을 표시하는 것이었지만 0에는 255 (및 다른 테이블).
— AB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.