Рейтинг:2

В Linux, как добавить маршрут к префиксу через определенное устройство с определенными пунктами назначения в этом префиксе, идущими по маршруту по умолчанию?

флаг ke

В настоящее время я имею дело с VPN, конечная точка подключения которой находится в подсети, префикс которой должен быть туннелирован через эту конкретную VPN.

По сути, проблема, таким образом, сводится к сопоставлению с (большим) набором адресов назначения (маска /16), за исключением полностью содержащегося (небольшого) подмножества конкретных пунктов назначения, которые не должны маршрутизироваться таким образом (и вместо этого идти по маршруту по умолчанию) .

Если бы проблема заключалась в фильтрации, в Linux это можно было бы реализовать с помощью ipset настроить как

ipset создать MyVPN hash:net
ipset добавить MyVPN $MYVPNNET/$MYVPNMASK
ipset добавить MyVPN $MYVPNENDPOINT несоответствие

Однако такие ipsets можно использовать только внутри netfilter.

Теперь мой вопрос заключается в том, как я могу настроить что-то эквивалентное с помощью расширенной IP-маршрутизации Linux, т.е. IP-маршрут семейство команд?

djdomi avatar
флаг za
Вопросы по установке, настройке или диагностике должны включать желаемое конечное состояние, конкретную проблему или ошибку, достаточную информацию о конфигурации и среде для ее воспроизведения, а также попытки решения. Вопросы без четкой формулировки проблемы бесполезны для других читателей и вряд ли получат хорошие ответы.
datenwolf avatar
флаг ke
@djdomi: это не поиск помощи для конкретной конфигурации. Я ищу способ определить маршруты (в обобщенном виде), удалив определенные подмножества из правила таблицы маршрутов. Это то, что можно применить ко всем видам ситуаций.
Рейтинг:2
флаг ke

Как оказалось, в Linux можно использовать ipset соответствия для выбора таблиц маршрутизации. Дополнительным компонентом является использование правила сетевого фильтра, которое будет сопоставлять исходящие пакеты и применять fwmark к ним, которые затем могут быть использованы для выбора выделенной таблицы маршрутизации. Затем эта выделенная таблица маршрутизации будет содержать только один маршрут по умолчанию через VPN.

Вот в виде скрипта общая идея, как это настроить.

# Подсети для маршрутизации через TUN

ДСТНЕТС=.../...../..

# Исключаем эти пункты назначения из маршрутизации через TUN

ИСКЛЮЧИТЬ=... ...

# Устройство TUN, используемое для этого соединения, и его параметры. Обычно они предоставляются демоном VPN.

ТУНДЕВ=...
ТУНАДДР=.../..
ТУНПЕР=...

# Имя для ipset, используемого для сопоставления адресатов. База на названии TUN

IPSET=${TUNDEV}ipset

# Нам нужен сетевой фильтр fwmark и таблица iproute2. fwmarks и таблицы представляют собой 32-битные значения, ограниченные диапазоном целых чисел со знаком, т. е. [0, 2³¹-1] fwmarks могут использоваться как битовые маски, сигнализирующие о нескольких флагах, поэтому в зависимости от наших потребностей либо установите один конкретный бит (или несколько), либо очень конкретное значение, которое затем сравнивается на равенство.

FWMARK=0x...
ТАБЛИЦА=0x...

# Создайте ipset и заполните его диапазонами IP-адресов и подсетей, которые должны соответствовать или не соответствовать.

ipset создать $IPSET hash:net
для d в $DSTNETS ; добавить ipset $IPSET $d ; сделано
для x в $EXCLUDE ; do ipset add $IPSET $x nomatch ; сделано

# Создать новую таблицу правил iproute2, которая будет использоваться для поиска маршрута для всех пакетов, для которых установлен наш fwmark выбора

ip правило добавить fwmark $FWMARK таблицу $TABLE

# Вот где происходит волшебство: создайте правило netfilter, которое будет сопоставлять пакеты, исходящие с этого хоста, для пунктов назначения, которые соответствуют только что созданному нами ipset, и пометьте их выбранной нами fwmark. Из-за правила, которое мы только что создали ранее, эти пакеты будут маршрутизироваться с использованием этой конкретной таблицы, а не глобальных.

iptables -t mangle -A ВЫВОД -m set --match-set $IPSET dst -j MARK --set-mark $FWMARK

# Также добавьте правило сетевого фильтра для перезаписи исходного адреса для этих пакетов, так как сеть назначения, скорее всего, отклонит их, если они не соответствуют диапазону адресов, используемому для VPN

iptables -t nat -A POSTROUTING -m set --match-set $IPSET dst -j SNAT --to-source $INTERNAL_IP4_ADDRESS

# Теперь мы можем настроить фактическое устройство TUN.Строго говоря, эти шаги можно было сделать и раньше, но тогда в течение короткого промежутка времени между появлением TUN и установлением правил маршрутизации некоторые пакеты могли оказаться в подвешенном состоянии.

ip link set dev $TUNDEV up
IP-адрес добавить узел $TUNADDR $TUNPEER dev $TUNDEV 

# Наконец, установите маршрут по умолчанию, проходящий через TUN в нашей выделенной таблице маршрутизации, которая из-за правила fwmark будет затронута только пакетами, соответствующими нашему ipset

ip route добавить устройство по умолчанию $TUNDEV таблица $TABLE

Чтобы все снести, просто следуйте сценарию в обратном порядке, удаляя вещи; в ipset возможно разрушатьed с помощью одной команды.

Рейтинг:2
флаг cn

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

Шлюз по умолчанию в этом примере — 10.0.0.1. VPN 10.0.0.2

ip маршрут добавить 10.0.1.0/24 через 10.0.0.1
ip маршрут добавить 10.2.0.0/16 через 10.0.0.2
ip route добавить по умолчанию через 10.0.0.1

Будет направлять трафик в подсеть (10.0.1.0) через шлюз по умолчанию, VPN через 10.0.0.2 и другой трафик по умолчанию через шлюз по умолчанию.

datenwolf avatar
флаг ke
Да, так делают большинство VPN-скриптов. Но есть проблема: при добавлении узкого маршрута через конкретный шлюз такая настройка не способна беспрепятственно справляться с изменениями маршрута по умолчанию. Например, при переключении сетей в роуминге или, может быть, даже в таких простых случаях, как подключение ноутбука к док-станции (переключение с W-LAN на проводную LAN). Это излишне усложняет ситуацию, поскольку, если сделать так, как вы предложили, должно быть постоянное отслеживание состояния сети, определение необходимости изменения конкретных маршрутов и корректировка таблиц маршрутизации.
datenwolf avatar
флаг ke
То, что я ищу, является эквивалентом *ipset* `nomatch`, чтобы избежать всех этих хлопот.
флаг cn
А, ладно - понял! Я оставлю ответ, чтобы сохранить комментарии, поскольку они являются важными разъяснениями.
djdomi avatar
флаг za
@ shearn89 напомни, если это решит твою проблему, ты должен принять это, иначе нас будут помнить до конца любого десятилетия...
флаг cn
@djdomi Я не ОП...
djdomi avatar
флаг za
юпп недостаточно прокрутил выше. @datawolf, ты имел в виду мой комментарий
datenwolf avatar
флаг ke
@djdomi: Посмотрите ответ, который я написал, относительно метода, который я выяснил. Я сделаю этот ответ принятым после того, как пройдет льготный период.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.