Назад | Перейти на главную страницу

перечислить все таблицы маршрутов

Мне нужно знать, как составить список идентификаторов всех таблиц маршрутизации. Например, я могу бегать:

ip rule add fwmark 2 table 104
ip route add dev eth0 default via 192.168.3.7 table 104

Звонок в ip rule list показывает:

0:  from all lookup local 
32765:  from all fwmark 0x2 lookup 104 
32766:  from all lookup main 
32767:  from all lookup default

И призыв к ip route show table 104 показывает:

default via 192.168.3.7 dev eth0

Если я тогда позвоню ip rule del table 104, последующий вызов ip rule list показывает:

0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default

Однако призыв к ip route show table 104 все еще показывает:

default via 192.168.3.7 dev eth0

Я знаю, что могу очистить стол, используя ip route flush table 104. Я бы хотел очистить все таблицы, которые не local, main, и default. Таким образом, я хочу иметь возможность перечислить существующие таблицы.

Я видел, как люди использовали cat /etc/iproute2/rt_tables, но это дает только:

#
# reserved values
#
255 local
254 main
253 default
0   unspec
#
# local
#
#1  inr.ruhep

Что я могу сделать, чтобы получить все существующие имена таблиц? Заранее спасибо!

Существует способ перечислить все записи маршрутизации всех таблиц. ip route show table all

Используя некоторую магию оболочки, вы можете извлечь все имена и идентификаторы таблиц следующим образом:

ip route show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq

или

ip route show table all | grep -Po 'table \K[^\s]+' | sort -u

Если вас интересуют только числовые имена таблиц, добавьте фильтрацию grep:

ip route show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq | grep -e "[0-9]"

или

ip route show table all | grep -Po 'table \K[^\s]+' | sort -u | grep -e "[0-9]"

Что я могу сделать, чтобы получить все существующие имена таблиц?

Файл /etc/iproute2/rt_tables единственный источник таблицы имена в системе. Внутри таблицы маршрутизации имеют целочисленные идентификаторы.

Остальная часть вашего вопроса немного сбивает с толку. Если на таблицу не ссылается правило, то она эффективно «удаляется», потому что не влияет на маршрутизацию системы. Так что вы можете перечислить все активный такие таблицы маршрутизации:

ip rule list | awk '/lookup/ {print $NF}'

Это выглядит для всех lookup действие в правилах маршрутизации и печатает цель.

Похоже, что таблица маршрутизации идентифицируется 64-битным целым числом. Если вы действительно хотите найти все таблицы маршрутизации с правилами, даже неактивные, которые не влияют на вашу систему, вы можете просто перебрать цикл от 1 до 2 ^ 64:

seq 0 $(echo '2 64 ^ p' | dc) | xargs -iTABLE sh -c 'echo === TABLE ===; ip route show table TABLE'

... но это будет длиться вечно, потому что 64 бита занимают много места.

(egrep '^\s*[0-9]' /etc/iproute2/rt_tables | awk '{print $2}' | sort -u; ip rule list | awk '/lookup/ {print $NF}' | sort -u; ip route show table all | sed 's/.*\(table.*\)/\1/g' | awk '{if($0 ~ /table/) print $2; else print "main";}' | sort -u) | sort | uniq -c

Благодарность за этот поток, ведущий к этой комбинации, которая показывает все таблицы маршрутизации, которые в настоящее время содержат маршруты, на которые ссылаются правила и которые имеют имена, с 3 рядом с каждой таблицей, которая имеет содержимое, на которую есть ссылки, и с именем или 2 или 1, если применяется одно или два из трех условий.