Невозможно заставить работать раздельное туннелирование в 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;
}

Я надеюсь, что это поможет всем, кто борется с раздельным туннелированием.

Другие вопросы по тегам