Мне нужно знать, как составить список идентификаторов всех таблиц маршрутизации. Например, я могу бегать:
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, если применяется одно или два из трех условий.