Невозможно заставить работать раздельное туннелирование в Strongswan.
Я пытаюсь настроить Strongswan для раздельного туннелирования VPN.
Мне нужны только подсети и доступны через VPN-туннель. Все остальное решается черезdefault gateway
для сети.
Всем клиентам присваивается IP-адрес, принадлежащий10.0.201.0/24
подсеть.
В моем файле конфигурации у меня есть, среди прочего, следующее:
# Default login method
eap-defaults {
remote {
auth = eap-radius
id = %any
eap_id = %any
}
}
connections
{
conn-unix : conn-defaults, eap-defaults {
children {
net {
local_ts = 10.0.200.0/24, 10.88.0.0/16
}
esp_proposals = aes128gcm128-x25519
}
pools = IkeVPN-ipv4
proposals = aes128-sha256-x25519
}
conn-windows : conn-defaults, eap-defaults {
children {
net {
local_ts = 10.0.200.0/24, 10.88.0.0/16
}
esp_proposals = aes256-sha256-prfsha256-modp1024
}
proposals = aes256-sha256-prfsha256-modp1024
pools = IkeVPN-ipv4
}
}
pools
{
IkeVPN-ipv4 {
addrs = 10.0.201.0/24
dns = 10.0.88.2
}
}
Когда я вхожу в систему через VPN, можно пинговать хосты, принадлежащие и , поэтому я знаю, что могу использовать VPN-туннель.
Однако:
Если я попытаюсь получить доступ к любому другому ресурсу в Интернете, оставаясь при этом подключенным к VPN, я даже не смогу пропинговать IP-адрес, принадлежащий этому ресурсу.
В моей таблице маршрутизации на моем компьютере с Windows я могу найти следующие записи:
Я знаю, что когда у вас есть два маршрута к данной подсети, например0.0.0.0/0
в таблице маршрутизации, то побеждает правило с наименьшей метрикой, и трафик пересылается с использованием этого правила.
Однако я не хочу, чтобы VPN-сервер устанавливал маршрут по умолчанию через VPN, а просто сообщаю, что подсети10.88.0.0/16
и10.0.200.0/24
должен быть маршрутизирован через VPN.
Я хочу, чтобы я видел таблицу маршрутизации, близкую к этой, без необходимости редактировать таблицу маршрутизации вручную на каждом VPN-клиенте:
Итак, как мне это сделать?
1 ответ
Оказывается, моя проблема с раздельным туннелированием возникла совершенно в другой области, поскольку у меня дома 2 маршрутизатора, поэтому моя домашняя сеть выглядит примерно так: ISP <-> R1 <-> R2 <-> Me.
... и R1 был настроен на IP-адрес в диапазоне 10.0.0.0/24.
Когда вы отключаете маршрутизацию по умолчанию в VPN-клиенте Windows, он добавляет маршрут на основе классов, поэтому в моем случае он добавляет маршрут, который отправляет все для 10.0.0.0/8 через VPN, что, конечно же, будет конфликтовать с настройкой. на маршрутизаторе R1.
Вот почему хотелось вообще удалить маршрут 10.0.0.0/8 и протолкнуть маршруты для подсетей и10.0.200.0/16
через VPN.
Оказывается, это осуществимо.
Маршрутизация на основе классов удаляется путем включенияdisable class based routing
когда ты отключишьdefault routing
в VPN-клиенте.
В Strongswan вам необходимо перенаправить запрос DHCP от клиентов на DHCP-сервер, реализовавший RFC3442.
Итак, в моей конфигурации выше я должен заменить все вхожденияpools = IkeVPN-ipv4
сpools = dhcp
И вstrongswan.conf
Мне нужно добавить следующее в подраздел плагинов charon:
charon {
plugins {
...
dhcp {
server = ip.address.of.dhcp.server
}
}
}
тогда я могу удалить всеpools
раздел внизу моей конфигурации.
Есть еще несколько доступных вариантов, о которых можно прочитать здесь .
Руководство от Strongswan из подсказки @ecdsa дало некоторую информацию, но это руководство предназначено для Windows, поэтому в нем не рассказывается, как обращаться с устройствами Linux, MacOS или Android. Однако RFC3442 будет обрабатывать общий случай.
Вкратце, в RFC3442 говорится, что вам необходимо отправить следующие два параметра DHCP:
- опция 121 (относится к Linux, Android и Windows Vista или более ранним версиям)
- опция 249 (относится к Windows 7 или новее и MacOS)
По сути, вам нужно закодировать каждый маршрут как массив целых чисел, используя следующий синтаксис:
х, у1, у2, у3, у4, z1, z2, z3, z4
Где:
- x: сетевая маска CIDR
- y1 - y4: сеть, которую вы хотите маршрутизировать, но с той особенностью, что, когда хвост последовательности y1,y2,y3,y4 состоит из нулей, они опускаются.
- z1–z4: шлюз следующего перехода в подсеть.
Если через DHCP необходимо отправить более одного маршрута, вам придется добавить еще одну последовательность, аналогичную приведенной выше, в хвосте первого маршрутизатора.
Согласно документации Strongswan, я могу заменить стандартный шлюз на0.0.0.0
.
Это означает, что мой путь к10.0.200.0/24
кодируется как24,10,0,200,0,0,0,0
и10.88.0.0/16
кодируется в16,10,88,0,0,0,0
.
Объединение этих двух дает мне24,10,0,200,0,0,0,0,16,10,88,0,0,0,0
, что приводит меня к следующей конфигурации вISC DHCP server
:
option rfc-routes code 121 = array of integer 8;
option ms-routes code 249 = array of integer 8;
default-lease-time 21600;
max-lease-time 86000;
subnet 10.0.201.0 netmask 255.255.255.0 {
range 10.0.201.1 10.0.201.254;
option domain-name "example.com";
option domain-name-servers ip.address.of.dns.server;
option rfc-routes 24,10,0,200,0,0,0,0,16,10,88,0,0,0,0;
option ms-routes 24,10,0,200,0,0,0,0,16,10,88,0,0,0,0;
}
Я надеюсь, что это поможет всем, кто борется с раздельным туннелированием.