Вопрос или проблема
Моя цель – настроить двусторонний VPN между двумя сайтами.
Я хочу иметь возможность получать доступ к серверам с клиентской стороны и к клиентским устройствам с серверной стороны.
Я не делаю ничего сложного и пытался следовать инструкциям в руководстве по настройке соединения OpenVPN между сайтами. Но, думаю, из-за того, что я использую два роутера DD-WRT в качестве сервера и клиента для VPN, у меня возникают проблемы с сопоставлением руководства с моей ситуацией.
С клиентской стороны я могу подключаться к хостам сети серверной стороны.
С серверной стороны я не могу подключиться к хостам клиентской стороны.
Сетевое отображение:
CG-NAT Network LAN 192.168.0.0/22
OpenVPN клиент на DD-WRT 192.168.0.2
Обычная сеть LAN 192.168.4.0/22
OpenVPN сервер на DD-WRT 192.168.4.2
Туннель: 10.10.28.1 <-> 10.10.28.2 (Я вижу, что он настроен правильно в логах)
Я контролирую обе стороны, поэтому пытался настроить маршруты, чтобы исправить ситуацию.
Я подозреваю, что маршруты (или настройки на сервере OpenVPN) неправильные.
Это таблица маршрутизации на стороне клиента OpenVPN:
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 br0
10.10.28.0 * 255.255.255.0 U 0 0 0 tun1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
192.168.0.0 * 255.255.252.0 U 0 0 0 br0
192.168.4.0 10.10.28.1 255.255.252.0 UG 200 0 0 tun1
Я могу пинговать с любой точки клиентской сети в сеть 192.168.4.0:
# ping 192.168.4.222
PING 192.168.4.222 (192.168.4.222): 56 data bytes
64 bytes from 192.168.4.222: seq=0 ttl=63 time=42.244 ms
64 bytes from 192.168.4.222: seq=1 ttl=63 time=32.047 ms
Это таблица маршрутизации на хосте сервера OpenVPN, когда я его впервые включаю:
default via 192.168.4.1 dev br0
10.10.28.0/24 dev tun2 scope link src 10.10.28.1
127.0.0.0/8 dev lo scope link
192.168.4.0/22 dev br0 scope link src 192.168.4.2
Наблюдения:
Я не могу пинговать с сети сервера в сеть 192.168.0.0.
ОДНАКО, находясь на хосте сервера OpenVPN (192.168.4.2), я могу пинговать другую сторону туннеля (10.10.28.2)
# ping 10.10.28.2
PING 10.10.28.2 (10.10.28.2): 56 data bytes
64 bytes from 10.10.28.2: seq=0 ttl=64 time=40.287 ms
64 bytes from 10.10.28.2: seq=1 ttl=64 time=35.791 ms
# traceroute 192.168.0.1
traceroute to 192.168.0.1 (192.168.0.1), 30 hops max, 46 byte packets
1 192.168.4.1 (192.168.4.1) 5.108 ms 4.927 ms 3.953 ms
2 * *
Так что, моя первая догадка была добавить этот маршрут, чтобы он соответствовал маршруту клиента для подсети сервера:
route add -net 192.168.0.0 netmask 255.255.252.0 gw 10.10.28.2 metric 200 tun2
Это создало дополнительную запись:
192.168.0.0 10.10.28.2 255.255.252.0 UG 200 0 0 tun2
Это внесло некоторые изменения, но traceroute или ping не возвращаются.
# traceroute 192.168.0.1
traceroute to 192.168.0.1 (192.168.0.1), 30 hops max, 46 byte packets
1 * * *
Очевидно, я новичок, так что дайте знать, какая дополнительная информация нужна, чтобы помочь мне.
OpenVPN доступ к LAN за клиентом (и наоборот)
Это должно быть вполне стандартной проблемой для OpenVPN между сайтами.
Если я все правильно понимаю, на вашей стороне сервера вы добавили:
- маршрут к 192.168.0.0/22, который представляет сеть за вашим клиентом,
- этот маршрут проходит через шлюз 10.10.28.2, который является внутренним адресом вашего сервера в VPN,
Правильно?
Поскольку вы добавили маршрут в VPN, ваш сервер должен направить пакет к 192.168.0.2 (или любому последнему числу байта в подсети /22) через VPN.
Однако OpenVPN не знает, к какой точке завершения VPN ему направить этот пакет.
Примечание: возможно, это работает от подсети клиента к подсети сервера, потому что клиент должен добавить маршрут по умолчанию через VPN, так что все будет отправлено через него – это не совсем ясно из ваших выдержек.
Поэтому OpenVPN использует концепцию внутреннего маршрута “iroute”, чтобы знать, к какой точке завершения VPN направлять пакет для конкретного диапазона IP-адресов.
В файле конфигурации сервера вам нужно добавить:
route 192.168.0.0 255.255.255.0
client-config-dir ccd
Это сообщит, что пакеты для этой подсети необходимо отправлять на интерфейс VPN.
И включите папку, специфичную для клиента, ccd в конфигурационном файле на сервере:
ifconfig-push 10.10.28.1 255.255.255.0
(это установит IP-адрес, если все статично, я полагаю, это можно опустить, если ваш клиент имеет фиксированный IP в своей конфигурации).
iroute 192.168.0.0 255.255.255.0
Это заставит OpenVPN понять, что пакеты, входящие в VPN с этой подсетью в качестве адреса назначения, необходимо отправлять этому конкретному клиенту.
Клиент должен иметь необходимое для маршрутизации к машинам в своей собственной подсети.
Ответ или решение
Для настройки двунаправленного VPN-соединения между двумя маршрутизаторами DD-WRT, вам нужно убедиться, что маршрутизация настроена правильно как на клиентской, так и на серверной стороне. На основании вашего описания вашей проблемы и текущих маршрутов, давайте рассмотрим шаги для решения вашей ситуации.
Описание ситуации
- У вас есть клиентская сеть:
192.168.0.0/22
с клиентом OpenVPN на192.168.0.2
. - Серверная сеть:
192.168.4.0/22
с сервером OpenVPN на192.168.4.2
. - Туннельные адреса:
10.10.28.1
(сервер) и10.10.28.2
(клиент).
Проблема
Вы можете получить доступ к серверной сети с клиентской стороны, но не наоборот. Это означает, что маршрутизация с сервера на клиент не настроена должным образом.
Предлагаемое решение
-
Проверка маршрутизаторов и конфигурации OpenVPN:
Убедитесь, что у вас правильно настроена конфигурация OpenVPN и что на сервере включена опцияclient-config-dir
.В конфигурационном файле сервера OpenVPN добавьте:
route 192.168.0.0 255.255.252.0 client-config-dir ccd
-
Создание клиентского конфигурационного файла:
Вам нужно создать файл для клиента в директории, указанной вclient-config-dir
. Назовите файл так же, как имя вашего клиента, например,client_name
, и добавьте в него следующее:ifconfig-push 10.10.28.2 255.255.255.0 iroute 192.168.0.0 255.255.252.0
Это говорит серверу OpenVPN, что пакеты, адресованные в подсеть
192.168.0.0
, должны быть отправлены этому конкретному клиенту (10.10.28.2). -
Настройка маршрутов на сервере и клиенте:
Убедитесь, что у вас правильно настроены маршруты. На сервере OpenVPN, добавьте маршрут к подсети клиента. В вашем случае это уже сделано, но если нет, используйте команду, которую вы уже упоминали:route add -net 192.168.0.0 netmask 255.255.252.0 gw 10.10.28.2 metric 200 tun2
-
Проверка маршрутов на клиенте:
На клиентском маршрутизаторе должно быть два маршрута, которые направляют трафик по туннелю, например:192.168.4.0 10.10.28.1 255.255.252.0 UG 200 0 0 tun1
Если необходимо, можете добавить маршрут вручную.
-
Настройка брандмауэра:
Убедитесь, что брандмауэры на обеих сторонах не блокируют пакеты, которые должны идти в обратном направлении. Проверьте соответствующие правила IPTables или настройки брандмауэра, чтобы убедиться, что разрешен трафик между двумя сетями. -
Тестирование подключения:
После внесения всех изменений, перезапустите службу OpenVPN и протестируйте доступ. Попробуйте пинговать адреса из каждой сети, чтобы удостовериться, что соединение установлено корректно.
Заключение
Соблюдая эти шаги, вы должны смочь настроить правильную маршрутизацию и обеспечить двунаправленное соединение между клиентом и сервером через VPN. Если вы все еще испытываете сложности, следите за логами OpenVPN на обоих устройствах, чтобы получить больше информации для устранения неполадок.