Мы настроили VPN-сервер L2TP с этим руководство, все работает как шарм.
Единственная проблема
Мы не хотим, чтобы клиент маршрутизировал весь трафик с помощью этой VPN, только определенную подсеть, например 10.0.0.0/20
На Mac нам нужно установить маршрут вручную с помощью команды, но для мобильных устройств, кажется, нет возможности сделать это?
Итак, можно ли настроить клиента автоматически для подсети «10.0.0.0/20»?
Хорошо, этот вопрос задают снова и снова в Интернете, и в большинстве случаев есть (полу) неверный ответ, что вы не можете сделать то, что было описано в исходном сообщении. Разрешите прояснить это раз и навсегда :)
Короткий ответ: L2TP (и PPTP, если на то пошло) не имеет средств для проталкивания маршрута внутри протокола, но это может быть достигнуто за пределами протокола.
Поскольку L2TP - изобретение Microsoft, лучшим источником информации является их техническая документация (и они, кстати, неплохо в этом разбираются). Техническое описание того, что я собираюсь объяснить ниже, можно найти на Адресация и маршрутизация VPN. Ключевые слова для правильной настройки (если вы собираетесь проводить собственное исследование): DHCPINFORM и «бесклассовые статические маршруты».
Прежде всего, как это работает:
Что ж, есть нюанс:
Я собираюсь описать типичную конфигурацию с использованием Linux-сервера в качестве сервера VPN (вы можете настроить серверы MS, используя ссылку на документацию Microsoft).
Для настройки маршрутов на клиентах нам потребуются следующие ингредиенты:
Ниже приведен дамп рабочей конфигурации Accel-PPP. Я предоставляю ее полностью, иначе было бы сложно объяснить, что куда идет. Если у вас уже работает ваша VPN, вы можете пропустить этот файл конфигурации и сконцентрироваться на конфигурации DHCP, описанной ниже.
[root@vpn ~]# cat /opt/accel-ppp/config/accel-ppp.conf
[modules]
log_syslog
pptp
l2tp
auth_mschap_v2
ippool
sigchld
chap-secrets
logwtmp
[core]
log-error=/var/log/accel-ppp/core.log
thread-count=4
[ppp]
verbose=1
min-mtu=1280
mtu=1400
mru=1400
check-ip=1
single-session=replace
mppe=require
ipv4=require
ipv6=deny
ipv6-intf-id=0:0:0:1
ipv6-peer-intf-id=0:0:0:2
ipv6-accept-peer-intf-id=1
[lcp]
lcp-echo-interval=30
lcp-echo-failure=3
[auth]
#any-login=0
#noauth=0
[pptp]
echo-interval=30
echo-failure=3
verbose=1
[l2tp]
host-name=access-vpn
verbose=1
[dns]
dns1=192.168.70.251
dns2=192.168.70.252
[client-ip-range]
disable
[ip-pool]
gw-ip-address=192.168.99.254
192.168.99.1-253
[log]
log-file=/var/log/accel-ppp/accel-ppp.log
log-emerg=/var/log/accel-ppp/emerg.log
log-fail-file=/var/log/accel-ppp/auth-fail.log
log-debug=/var/log/accel-ppp/debug.log
copy=1
level=3
[chap-secrets]
gw-ip-address=192.168.99.254
chap-secrets=/etc/ppp/chap-secrets
[cli]
telnet=127.0.0.1:2000
tcp=127.0.0.1:2001
[root@vpn ~]#
===
На этом этапе наши клиенты могут подключаться через L2TP (или PPTP) и общаться с сервером VPN. Таким образом, единственная отсутствующая часть - это DHCP-сервер, который прослушивает созданные туннели и отправляет в ответ необходимую информацию. Ниже приведен отрывок из файла конфигурации dnsmasq (я предоставляю только параметры, связанные с DHCP):
[root@vpn ~]# grep -E '^dhcp' /etc/dnsmasq.conf
dhcp-range=192.168.99.254,static
dhcp-option=option:router
dhcp-option=121,192.168.70.0/24,192.168.99.254,192.168.75.0/24,192.168.99.254,10.0.0.0/24,192.168.99.254
dhcp-option=249,192.168.70.0/24,192.168.99.254,192.168.75.0/24,192.168.99.254,10.0.0.0/24,192.168.99.254
dhcp-option=vendor:MSFT,2,1i
[root@vpn ~]#
В приведенном выше отрывке мы проталкиваем маршруты 192.168.70.0/24, 192.168.75.0/24 и 10.0.0.0/24 через 192.168.99.254 (сервер VPN).
Наконец, если вы обнюхаете сетевой трафик (например, на сервере VPN), вы увидите в ответе на сообщение DHCPINFORM что-то вроде следующего:
19:54:46.716113 IP (tos 0x0, ttl 64, id 10142, offset 0, flags [none], proto UDP (17), length 333)
192.168.99.254.67 > 192.168.99.153.68: BOOTP/DHCP, Reply, length 305, htype 8, hlen 6, xid 0xa27cfc5f, secs 1536, Flags [none]
Client-IP 192.168.99.153
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: ACK
Server-ID Option 54, length 4: 192.168.99.254
Domain-Name Option 15, length 18: "vpn.server.tld"
Classless-Static-Route-Microsoft Option 249, length 24: (192.168.70.0/24:192.168.99.254),(192.168.75.0/24:192.168.99.254),(10.0.0.0/24:192.168.99.254)
Vendor-Option Option 43, length 7: 2.4.0.0.0.1.255
P.S. Я почти забыл важную часть, необходимую для успешного использования вышеуказанной конфигурации. Ну, это было описано в документации Microsoft, на которую я ссылался, но кто читал документацию? :) Хорошо, клиенты должны быть настроены без «Использовать шлюз по умолчанию» в VPN-подключении (в Windows это находится в свойствах подключения -> Сеть -> Протокол Интернета версии 4 (TCP / IPv4) -> Свойства -> Дополнительно -> Настройки IP ). На некоторых клиентах также есть опция «Отключить добавление маршрута на основе классов» - она должна быть отключена, поскольку она явно отключает функции, которые мы пытаемся реализовать.
Я не думаю, что вы можете протолкнуть маршрут к клиенту в L2TP / IPSEC VPN. Вам нужно будет выполнить настройку прямо на клиенте.
С каким мобильным клиентом у вас проблемы? Намного легче предоставить информацию, если мы знаем, какую операционную систему и программное обеспечение вы используете.