Я недавно установил свой StrongSwan VPN, в основном следуя этому Руководство по DigitalOcean. Это работало хорошо, пока я не столкнулся с этой странной проблемой маршрутизации.
Схема сети ниже:
+-----------+ +-----------+ Internet +------------+ +-------------+
|VPN server |___|Router |. . . . . |WiFi gateway|___|Laptop |
|192.168.0.2| |192.168.0.1| |192.168.0.1 | |192.168.0.111|
+-----------+ +-----------+ +------------+ +-------------+
Обычно я теряю доступ к своей локальной сети, когда подключаюсь к Wi-Fi, который имеет тот же IP-адрес (или ту же сеть), что и мой маршрутизатор. Когда я пытаюсь подключиться к 192.168.0.XXX
мой ноутбук пытается получить доступ к хосту за сетью маршрутизатора Wi-Fi, а не к сети VPN-сервера.
Я подозреваю, что это проблема с маршрутизацией на клиенте, но я мало что могу сделать, когда подключаюсь, например, с iOS.
Есть ли настройка сервера, которая может предотвратить такое поведение?
Что касается маршрутизации, если вы уже находитесь в подсети 192.168.0.0/24, вы получите доступ к ней через локальное соединение, а не по маршруту. Обычно вы выполняете VPN-сервер на общедоступном IP-адресе, поддерживающий доступ к частной сети за ним.
Устанавливая туннель через VPN-сервер, вы фактически получаете адаптер в этой сети - через туннель.
Если обе сети используют один и тот же сетевой диапазон, ваша система не может определить, где находятся машины, и обычно идентифицирует локальное соединение как имеющее более низкую стоимость для удаленного соединения и, таким образом, отправляет весь сетевой трафик локально.
Как можно это решить?
Это может можно настроить клиента, который может переназначить адреса за вас.
Однако вам, вероятно, будет проще сделать это на сервере. Настройте второй туннель на VPN-сервере для доступа к другому диапазону частной сети. Затем определите адаптер на сервере, используя этот диапазон (в зависимости от вашей настройки, это может быть легко). Вы можете переназначить IP-адреса, например, с помощью IPTABLES, но вы, вероятно, также нужно переназначить ARP, что немного сложнее. Вы можете использовать arptables (часто используемые в средах балансировки нагрузки).
Все это потребует довольно много работы ...