Заметка дня #9 Управление трафиком - занятие, требующее особого… — Остальные 90% — TG.ME

Заметка дня #9 Управление трафиком - занятие, требующее особого внимания. Настраивая VPN или просто играясь с таблицами маршрутизации, обычно хочется понять, применились ли настройки ожидаемым образом. В общем случае решение задачи заключается в чтении таблицы маршрутизации, однако распутывание клубка может затянуться. Мало того, что жонглирование масками и адресами требует сноровки, так ещё и Linux использует Policy Based Routing: ядро поддерживает несколько таблиц маршрутизации и для каждого пакета выбирает нужную на основе правил, которые, в свою очередь, могут использовать метки, навешиваемые на пакет фаерволом. Так, например, поднятый при помощи wg-quick VPN в Нидерланды может корректно работать, но совершенно не будет заметен в выводе команды ip route show: $ ip route show default via 192.168.1.1 dev wlp0s20f3 proto dhcp metric 600 169.254.0.0/16 dev wlp0s20f3 scope link metric 1000 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 192.168.1.0/24 dev wlp0s20f3 proto kernel scope link src 192.168.1.13 metric 600 # Note: interface 'netherlands' is up! $ ip -br link lo UNKNOWN 00:00:00:00:00:00 enp58s0 DOWN 95:85:36:4a:ee:7f wlp0s20f3 UP 2f:61:0a:d7:6f:59 docker0 DOWN 05:b2:b8:f7:70:91 netherlands UNKNOWN <POINTOPOINT,NOARP,UP,LOWER_UP> Обнаружить искомую таблицу маршрутизации всё-таки можно, подглядев её номер в выводе команды ip rule: $ ip rule 0: from all lookup local 32764: from all lookup main suppress_prefixlength 0 32765: not from all fwmark 0xca6c lookup 51820 32766: from all lookup main 32767: from all lookup default # Use table number 51820 to see routes: here it is! $ ip route show table 51820 default dev netherlands scope link Часть с fwmark 0xca6c навешивается через nftables и её тоже можно найти, однако уже сейчас видно, какой глубины расследование приходится проводить - и даже после этого не вполне очевидно, как убедиться, что трафик на определённые адреса пойдёт через VPN, а не другие интерфейсы. Такое длительное вступление позволит лучше оценить команду ip route get, ради которой и затевалась заметка. Команда позволяет узнать, как в итоге ядро будет маршрутизировать пакет с заданным адресом назначения: $ ip route get 1.1.1.1 1.1.1.1 dev netherlands table 51820 src 10.20.30.40 uid 1000 cache $ ip route get 192.168.1.12 192.168.1.12 dev wlp0s20f3 src 192.168.1.13 uid 1000 cache man ip-route подробно рассказывает, какие ещё параметры пакета помимо адреса назначения можно указать: интерфейс прибытия пакета, адрес отправителя, порт, метка фаервола и прочее - команда может значительно облегчить жизнь при настройке сети. #tip

March 17, 2025 727 2 16