Тщательно понимать стратегию маршрутизации WireGuard.
Тщательно понимать стратегию маршрутизации WireGuard.

❝Исходная ссылка🔗:https://icloudnative.io/posts/linux-routing-of-wireguard/ Или нажмите на левый нижний угол Прочитайте оригинальную статью Посмотреть исходный текст напрямую👇

Давным-давно нам просто нужно было Linux Войдите в терминал route -n(Позже развился ip route,То есть команда, предоставленная да iproute2),Вы можете узнать направление всех пакетов данных в системе.,Да,Сэр, времена изменились!

если ты WireGuard игроков, и весь трафик проходит через WireGuard выход, но ты не можешь пройти ip route Любые подсказки можно увидеть в выводе команды:

Язык кода:javascript
копировать
default via 192.168.100.254 dev eth0 proto dhcp src 192.168.100.63 metric 100 
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.63 
192.168.100.254 dev eth0 proto dhcp scope link src 192.168.100.63 metric 100

таблица маршрутизация говорит нам, что весь трафик выходит через физическую сетевую карту и не проходит WireGuard Виртуальный сетевой интерфейс. Почему это?

таблица маршрутизации

фактически Linux от 2.2 Начиная с версии ядра около 10, оно содержит несколько таблиц маршрутизации,Скорее, чем один! в то же время,Также существует свод правил,Этот набор правил сообщает ядру, как выбрать правильную таблицу маршрутизации для каждого пакета.

когда вы выполняете ip route Когда вы видите конкретную таблицу на да маршрутизации main,Кроме main Есть другие таблицы маршрутизациижитьсуществовать。таблица Маршрутизации обычно идентифицируются целым числом или могут быть названы текстом. Эти имена сохраняются в существующих файлах. /etc/iproute2/rt_tables середина. Содержимое по умолчанию следующее:

Язык кода:javascript
копировать
$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep

Linux В системе вы можете настроить 1-252 индивидуальныйтаблица маршрутизации。Linux Система поддерживается по умолчанию 4 индивидуальныйтаблица маршрутизации:

  • 0:таблица хранения системы。
  • 253:defulte стол. Маршруты по умолчанию, которые не указаны конкретно, помещаются в эту таблицу.
  • 254:main стол. Не указано таблица Все маршруты маршрутизации занесены в эту таблицу.
  • 255:locale стол. Сохранение адреса локального интерфейса, широковещательного адреса, NAT Адрес поддерживается системой и не может быть изменен пользователем.

этот Есть один виндивидуальныйочень странные слова:inr.ruhep,это возможнода Alexey Kuznetsov Добавлено, что он отвечает за реализацию качества обслуживания (QoS) в ядре Linux, iproute2. Он же и главный. Это слово означает «Ядерные исследования/Российский институт физики высоких энергий». Alexey Место работы в это время может относиться к их внутренней сети. Конечно, есть и другая возможность: есть старая русская компьютерная сеть/провайдер. называется RUHEP/Radio-MSU[1]

Есть два способа просмотра таблицы маршрутизации:

Язык кода:javascript
копировать
$ ip route show table table_number
 
$ ip route show table table_name

❝Не ставьте таблицу маршрутизациии iptables Запутать,таблица маршрутизации РешатьКак передавать пакеты данных,и iptables Решатьда Нет передачи пакетов данных,Их обязанности разные.

стратегия маршрутизации

Как ядро ​​узнает, какой пакет какую таблицу должен использовать? А как насчет маршрутизации? Ответ был дан ранее. В системе существует набор правил, которые сообщают ядру, как выбрать правильную таблицу для каждого пакета данных. маршрутизации,Этот свод правилдастратегия маршрутизациибаза данных。этотиндивидуальныйбаза данных Зависит от ip rule Команда управления, если параметры не добавлены, будут напечатаны все правила маршрутизации:

Язык кода:javascript
копировать
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

Число слева (0, 32764, ......)Указывает приоритет правила:Чем меньше значение, тем выше приоритет правила.。То естьдаобъяснять,Правила с меньшими значениями будут обработаны в первую очередь.

❝Диапазон значений правил маршрутизации: 1 ~

2^{23}-1

Помимо приоритета,Каждыйиндивидуальныйправило Есть еще одининдивидуальныйселектор(selector)и соответствующиестратегия исполнения(action)。селекторбудет судить по правилуда Применимо ли к текущему пакету,если применимо,Просто реализуйте соответствующую стратегию. Самая распространенная стратегия исполнение Искать конкретную таблицу на да маршрутизации (см. предыдущий раздел). Если таблица Если маршрутизация содержит маршрут текущего пакета, то маршрут будет выполнен, в противном случае текущая таблица будет пропущена; маршрутизации, продолжайте соответствовать следующему правилу маршрутизации.

существовать Linux Когда система запустится, ядро ​​будет в режиме стратегии. База данных маршрутизации настроена с тремя правилами по умолчанию:

  • 0:соответствовать любому состоянию,Запростаблица маршрутизации local (ID 255), таблица local даа специальная таблица маршрутизации, содержащие маршруты управления приоритетом для локальных и широковещательных адресов. правило 0 Очень особенный и не может быть удален или перезаписан.
  • 32766:соответствовать любому состоянию,Запростаблица маршрутизации main (ID 254),Этот стол является обычным столом,Содержит все неполитические маршруты. Системные администраторы могут удалить это правило или заменить его другим правилом.
  • 32767:соответствовать любому состоянию,Запростаблица маршрутизации default (ID 253),Стол представляет собой пустую таблицу,Он зарезервирован для последующей обработки. для Предыдущая политика не соответствовала пакетам,Система использует эту стратегию для обработки,Это правило также можно использовать.

существуют По умолчанию при маршрутизации сначала следуют правилам 0 существоватьместныйтаблица Найдите маршрут в маршрутизации. Если адрес назначения указан в этой сети или широковещательный адрес, существование может найти соответствующий маршрут здесь. Если маршрут не пройден, будет сопоставлено следующее непустое правило, только существующее; 32766 правило,существоватьздесь будетсуществоватьхозяинтаблица Найти маршрут в маршрутизации, если не получится, то он совпадет; 32767 правила, т.е. искать таблицу по умолчанию маршрутизации。если не удалось,Маршрутизация не удастся. Вы можете увидеть это здесь,Стратегическая маршрутизация совместима с предыдущими версиями

WireGuard общая ситуациястратегия маршрутизации

сейчассуществоватьвернуться в WireGuard, многие WireGuard Пользователь решит передать весь трафик локального компьютера через WireGuard Пир-маршрутизация, причина всем известна😁.

Конфигурация также очень проста, просто добавьте 0.0.0.0/0 добавить в AllowedIPs Прямо внутри:

Язык кода:javascript
копировать
# /etc/wireguard/wg0.conf

[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
Address = 10.0.0.2/32
# PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# ListenPort = 51820

[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Endpoint = 192.168.100.251:51820
AllowedIPs = 0.0.0.0/0

Теоретически это позволяет всему трафику проходить через одноранговый маршрут, но если вы используете wg-quick Версия более старая,Одна операция жестока, как тигр(wg-quick up wg0)после,Вы обнаружите, что все не так, как вы себе представляли,Может быть, даже WireGuard Другой конец не может быть подключен. Главным образом потому, что WireGuard Его собственный трафик также маршрутизируется через интерфейс виртуальной сети, что заведомо невозможно.

новая версия wg-quick проходитьстратегия Маршрутизации ловко решили эту проблему, давайте взглянем на ее замечательные возможности!

Во-первых, используйте wg-quick запускать wg0 Сетевая карта:

Язык кода:javascript
копировать
$ wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.0.2/32 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n

Хе-хе, я увидел знакомую стратегию маршрутизации, распечатайте все правила маршрутизации, чтобы увидеть:

Язык кода:javascript
копировать
$ 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

Привет ребята, еще два правила:

Язык кода:javascript
копировать
32764:  from all lookup main suppress_prefixlength 0
32765:  not from all fwmark 0xca6c lookup 51820

Давай снимем с них трусики,Раскройте тайну。Сначала три вопроса о душе:suppress_prefixlength да Что?0xca6c Что это еще раз? Как это возможно, что пакет данных not from all

Rule 32764

первое правило 32764 Начните анализировать, поскольку его значение относительно невелико, оно будет сопоставлено в первую очередь:

Язык кода:javascript
копировать
32764:  from all lookup main suppress_prefixlength 0

Это правило не использует селектор, то есть ядро ​​будет запрашивать каждый пакет. main таблица маршрутизации. давайте посмотрим main таблица маршрутизациисодержаниеда Что:

Язык кода:javascript
копировать
$ ip route
default via 192.168.100.254 dev eth0 proto dhcp src 192.168.100.63 metric 100 
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.63 
192.168.100.254 dev eth0 proto dhcp scope link src 192.168.100.63 metric 100

Если бы это было так, все пакеты прошли бы main таблица маршрутизации маршрута, никогда не приходит wg0. Не забывай,этотполоскаправило末尾Есть еще одининдивидуальныйпараметр:suppress_prefixlength 0,этотда Что Что это значит??ссылка ip-rule(8) man page:

Язык кода:javascript
копировать
suppress_prefixlength NUMBER
    reject routing decisions that have a prefix length of NUMBER or less.

Вот prefix То естьдапрефикс,выражатьтаблица маршрутизациисовпадающих диапазонов адресовмаска。поэтому,Еслитаблица маршрутизации Содержит 10.2.3.4 Для маршрутов длина префикса равна 32, если да; 10.0.0.0/8,Длина префикса — да 8.

suppress значит подавлять, поэтому suppress_prefixlength 0 значениеда:Отклонить стратегию маршрутизации, длина которой меньше или равна 0

Итак, какая длина префикса диапазона адресов будет меньше или равна 0?Есть только одна возможность:0.0.0.0/0,Это маршрут по умолчанию. Возьмите мою машину в качестве примера,Маршрут по умолчанию:

Язык кода:javascript
копировать
default via 192.168.100.254 dev eth0 proto dhcp src 192.168.100.63 metric 100

Если пакет данных соответствует маршруту по умолчанию, ему будет отказано в пересылке; если он соответствует другим маршрутам, он будет перенаправлен обычным образом;

Цель этого правила проста,Маршруты, добавленные администратором в основную таблицу маршрутизации вручную, будут перенаправлены в обычном режиме.,Маршрут по умолчанию будет игнорироваться,Продолжить соответствие следующему правилу

Rule 32765

Следующее правило 32765

Язык кода:javascript
копировать
32765:  not from all fwmark 0xca6c lookup 51820

Вот not from all да ip rule Проблема с форматированием,Немного античеловеческий,Последовательность, которую легче понять людям, должна быть такой:

Язык кода:javascript
копировать
32765:  from all not fwmark 0xca6c lookup 51820

спереди wg-quick up wg0 Судя по выводу, правило селектора не добавлено from Префикс (адрес или диапазон адресов):

Язык кода:javascript
копировать
ip -4 rule add not fwmark 51820 table 51820

Если в селекторе правил нет from префикс,ip rule распечатаю from all,Так это правило делает это таким.

51820 даодининдивидуальныйтаблица маршрутизации,Также wg-quick Создан, содержит только один маршрут:

Язык кода:javascript
копировать
$ ip route show table 51820
default dev wg0 scope link

такэтотполоскаправило Эффектда:Все пакеты, соответствующие этому правилу, маршрутизируются через узел WireGuard.,Кроме not fwmark 0xca6c

0xca6c Только один тег брандмауэра, wg-quick позволит wg Отметьте все пакеты, которые он отправляет(wg set wg0 fwmark 51820),Эти пакеты инкапсулировали другие пакеты,еслиэтотнекоторые пакеты данныхтакжепроходить WireGuard Маршрутизация образует бесконечный цикл маршрутизации.

так not from all fwmark 0xca6c lookup 51820 Значение да сказал, выполнить условия from all fwmark 0xca6c(WireGuard Принесите все, что вы отправляете fwmark 0xca6c) Пожалуйста,проигнорируйте это правило и продолжайте спускаться. В противном случае используйте 51820 таблица маршрутизации,проходить wg0 Туннель наружу.

для wg0 В пакет интерфейса входит 0xca6c, переходим к следующему правилу, то есть да соответствует значению по умолчанию main таблица маршрутизации:

Язык кода:javascript
копировать
32766:  from all lookup main

На данный момент подавителей нет, и все пакеты можно использовать бесплатно. main таблица маршрутизации,поэтому WireGuard противоположный конец Endpoint Адрес пройдет eth0 Интерфейс отправлен.

Идеальный!

❝wg-quick Созданотаблицей маршрутизациии fwmark Используется тот же номер: 51820.0xca6c. да 51820 шестнадцатеричное представление.

Подвести итог

wg-quick Самое умное в этом подходе то, что он не будет отвлекать ваше основное внимание. маршрутизации,идапроходитьправилосоответствовать новому Созданотаблицей маршрутизации。При отключении простоудалитьэтот两полоска路Зависит отправило,Путь по умолчанию Зависит отбудет повторно активирован。Вы потерпели неудачу в учебе?

Справочная ссылка

[1]

RUHEP/Radio-MSU: http://www.radio-msu.net/about.htm

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose