Berapa banyak tabel rute kustom yang dapat saya miliki di Linux?

12

Saya telah bekerja dengan tabel rute kustom di Linux, dan saya agak bingung dengan beberapa dokumentasi dan perilaku perintah "ip route". Tampaknya satu-satunya nilai yang valid adalah 0-255 plus nama-nama yang didefinisikan di / etc / iproute2 / rt_tables:

255 local
254 main
253 default
0   unspec

Ini akan meninggalkan 1-252 untuk tabel khusus. Mencoba menggunakan nama tabel yang tidak ditentukan memberikan kesalahan:

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

Namun, tampaknya saya dapat menggunakan angka yang jauh lebih tinggi dari 255 tanpa kesalahan:

$ 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

Pada titik tertentu, segalanya menjadi lebih aneh. Tepat pada maksint (2 ^ 31), "meluap" ke tabel lokal (255):

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

Adakah yang bisa menjelaskan apa yang terjadi? Apakah sebenarnya ada tabel perutean kustom maksint yang dapat digunakan?

Bob
sumber

Jawaban:

8

Sejauh menyangkut kernel 2.6, tabel max adalah 0xFFFFFFFF (dari rtnetlink.h). Namun, iproute2 menggunakan bilangan bulat yang ditandatangani di filter untuk melakukan pencarian jadi pada 2 ^ 31 ia berpikir Anda menentukan tabel yang tidak valid dan default untuk menampilkan Anda tabel 255.

Ciclamino
sumber
Jadi, nama yang tidak valid memberi Anda kesalahan, tetapi integer yang tidak valid memberi Anda 255? Juga, saya berasumsi bahwa 255 adalah maks sebelumnya (di 2.4 mungkin?) Tetapi ditingkatkan menjadi angka 32-bit di kernel 2.6?
Bob
Ya, maks. Dalam 2,4 dan 2.2 adalah 255.
Ciclamino
Juga, selalu menampilkan tabel 255 untuk nilai-nilai dengan bit ke-32 tampaknya bukan jenis perilaku yang direncanakan, hanya bug. Dengan tambalan satu baris ke iproute, saya dapat membuat dan menampilkan tabel dengan nomor 4294967290. Namun, mungkin tidak sesederhana itu, mungkin ada bagian lain yang masih tidak berurusan dengan 2 ^ 32 tabel.
Ciclamino
Diterima, terima kasih. Mungkin Anda harus mengirimkan tambalan Anda :)
Bob
1
Alat yang lebih baru cenderung untuk memungkinkan nilai tabel hingga 2 ^ 32-1 (misalnya: $ 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(tidak ada output). Perilaku sebelumnya mungkin menunjukkan tabel "unspec" 0 (bukan 255), tetapi 0 akan mencakup 255 (dan apa saja) meja lainnya)
AB