OpenVPN горе маршрутизации между сайтами
Я борюсь с настройкой openVPN для соединения двух сайтов. Вот как выглядит сценарий
Офис 1 (сервер):
- локальная сеть: 192.168.178.0/24
- Сервер openvpn публичный IP: 192.168.178.2 на BR0
- Сервер openvpn внутренний IP: 192.168.0.1 на tun0
Офис 2 (клиент):
- локальная сеть: 192.168.177.0/24
- общедоступный клиент openvpn ip: 192.168.177.2 на p2p1
Внутренний IP-адрес клиента openvpn: 192.168.0.6 на tun0
openvpn внутренняя сеть: 192.168.0.0/24
И клиент, и сервер находятся за маршрутизаторами NAT с динамически назначаемыми IP-адресами.
По сути, задействованные машины в любом из офисов должны "видеть" друг друга. После настройки туннеля и правильной настройки таблиц маршрутизации на обоих сайтах обычные хосты в обеих сетях могут пропинговать все в этих двух сетях. Хорошо до сих пор.
Однако конечные точки могут видеть только друг друга, но ни один из хостов в соответствующей сети на дальнем конце. Например, если сделать
ping 192.168.178.2
из конечной точки VPN 192.168.177.2 он работает просто отлично, любой другой адрес не будет работать; хозяева не ответят.
Теперь посмотрим на вывод команды tcpdump, когда я пингую другой адрес, например, 192.168.178.3.
11: 11: 28.104640 IP 192.168.0.6> 192.168.178.3: эхо-запрос ICMP, id 2130, seq 1, длина 64
Исходный IP кажется не совсем правильным. Он принадлежит внутренней сети OpenVPN, и я не получаю ответ ICMP.
Все начинает работать, когда я явно инструктирую ping использовать правильный IP-адрес источника:
ping 192.168.178.3 -I 192.168.177.2
Теперь вывод tcpdump тоже в порядке:
11: 20: 08.266271 IP 192.168.177.2> 192.168.178.3: эхо-запрос ICMP, id 7883, seq 17, длина 64 11:20:08.316037 IP 192.168.178.3 > 192.168.177.2: эхо-ответ ICMP, id 7883, seq 17, длина 64
Глядя на критическую запись в таблице маршрутизации клиента, становится очевидным, что адрес источника находится во внутренней сети:
default via 192.168.177.1 dev p2p1 192.168.0.1 via 192.168.0.5 dev tun0 192.168.0.5 dev tun0 proto kernel scope link src 192.168.0.6 192.168.177.0/24 dev p2p1 proto kernel scope link src 192.168.177.2 192.168.178.0/24 via 192.168.0.5 dev tun0
Есть ли возможность заставить OpenVPN создать эту запись с соответствующим src??
Вот мои файлы конфигурации openVPN. Я пропущу части TLS, поскольку сам туннель работает как положено.
Сервер в офисе 1:
local 192.168.178.2 server 192.168.0.0 255.255.255.0 proto tcp-server port 1194 dev tun mssfix user nobody group nogroup keepalive 20 120 ping-timer-rem persist-tun persist-key float comp-lzo push "comp-lzo" push "route 192.168.178.0 255.255.255.0" route 192.168.177.0 255.255.255.0 client-config-dir client-configs
Существует одна клиентская конфигурация, которая выглядит так:
iroute 192.168.177.0 255.255.255.0 push "route 192.168.178.0 255.255.255.0 vpn_gateway"
Клиент в офисе 2:
client dev tun0 remote <server address> proto tcp-client port 1194 connect-retry 15 comp-lzo user nobody group nogroup persist-tun persist-key
Я действительно в растерянности... ваша помощь очень ценится.
1 ответ
Поведение, которое вы видите, является дизайном. Узел в сети по умолчанию будет использовать IP-адрес интерфейса, через который происходит выход трафика, в качестве исходного IP-адреса.
Клиентский компьютер в одной из локальных сетей будет использовать, например, 192.168.178.10 в качестве исходного IP-адреса, поскольку он не является многосетевым. Затем шлюз направит пакет в ваш ящик OpenVPN и без проблем пройдет через туннель.
Однако, если вы идете из самого окна OpenVPN, он будет использовать IP-адрес интерфейса OpenVPN, поскольку именно там пакет должен выйти.
Что хорошо. Доходит до удаленного сайта. Но затем удаленный сайт хочет отправить пакеты для ответа на эхо-запрос на 192.168.0.6. Ответ отправляется на шлюз, но поскольку у шлюза (я полагаю, поскольку вы не разместили таблицы маршрутизации шлюза в сети) нет маршрута для этой сети, он не знает, как продолжить.
Самый простой способ решить эту проблему - просто добавить маршрут для 192.168.0.0/24 (ваша сеть OpenVPN) к шлюзам обеих сетей.
Другой вариант, если ваша операционная система поддерживает его (вы не указали, на какой ОС вы используете OpenVPN), было бы посмотреть, можете ли вы использовать параметр "src" маршрута, чтобы переопределить это поведение по умолчанию при выборе IP-адреса. выходного интерфейса. Пожалуйста, обратитесь к вопросу под названием Как установить собственный источник маршрута в openvpn для получения дополнительной информации.