У меня есть VPN типа "сеть-сеть", настроенная с использованием OpenVPN. Кажется, что туннель проходит нормально (и я могу пинговать с одного конца на другой), но я не могу заставить сети на двух концах видеть друг друга.
Моя топология следующая:
Net1 (192.168.13.0/24)
|
|
|
192.168.13.35
ens160
-----------
OVPN Client
-----------
tun0
10.13.10.2
|
|
10.13.10.1
tun0
-----------
OVPN Server
-----------
ens160
10.1.121.6
|
|
Net2 (10.1.121.0/26)
Я могу пинговать от клиента к серверу:
srv# ping 10.13.10.2
PING 10.13.10.2 (10.13.10.2) 56(84) bytes of data.
64 bytes from 10.13.10.2: icmp_seq=1 ttl=64 time=5.46 ms
64 bytes from 10.13.10.2: icmp_seq=2 ttl=64 time=5.01 ms
Я могу получить от клиента к Net1 (конечно, после добавления соответствующих маршрутов):
client#ping 10.1.121.8
PING 10.1.121.8 (10.1.121.8) 56(84) bytes of data.
64 bytes from 10.1.121.8: icmp_seq=1 ttl=63 time=48.0 ms
Однако я совершенно не могу пойти другим путем (пинговать что-то в клиентской сети -Net2- с сервера). Я даже не могу попасть на IP клиента в Net2 с сервера:
server#ping 192.168.13.35
PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data.
^C
--- 192.168.13.35 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2014ms
У меня есть подходящие маршруты:
server# ip route
default via 10.1.121.1 dev ens160 onlink
10.1.121.0/26 dev ens160 proto kernel scope link src 10.1.121.6
10.13.10.0/24 dev tun0 proto kernel scope link src 10.13.10.1
192.168.13.0/24 via 10.13.10.2 dev tun0
client# ip route
default via 192.168.13.1 dev ens160 onlink
10.1.121.0/24 via 10.13.10.1 dev tun0
10.13.10.0/24 dev tun0 proto kernel scope link src 10.13.10.2
192.168.13.0/24 dev ens160 proto kernel scope link src 192.168.13.35
IPTables ничего не блокирует (все установлено в ACCEPT):
client# iptables -L -vn
Chain INPUT (policy ACCEPT 56 packets, 3839 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 40 packets, 4343 bytes)
pkts bytes target prot opt in out source destination
server# iptables -L -vn
Chain INPUT (policy ACCEPT 736 packets, 75398 bytes)
pkts bytes target prot opt in out source destination
2 168 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 4 packets, 236 bytes)
pkts bytes target prot opt in out source destination
1 84 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 449 packets, 43393 bytes)
pkts bytes target prot opt in out source destination
Если я запускаю tcpdump в туннельном интерфейсе, я вижу, что пакеты ICMP покидают клиента, но не вижу их входящих на сервер:
server# ping 192.168.13.35
PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data.
16:57:40.262004 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 1, length 64
16:57:41.269165 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 2, length 64
16:57:42.277154 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 3, length 64
16:57:43.285163 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 4, length 64
client# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
Обе конечные точки - это Ubuntu 16.04 Server LTS (x64, установлен в основном со значениями по умолчанию).
Я думал, что немного разбираюсь в сетях Linux, но ... похоже, я ошибался :). Я понятия не имею, почему это не работает, и у меня закончились идеи, что я мог бы попробовать. Кто-нибудь может указать мне правильное направление?
Спасибо!
Возможно, вам не хватает iroute
. Помимо толкающих маршрутов вам понадобится iroute
в файлах конфигурации. Вот выдержка из справочной страницы OpenVPN.
--iroute network [маска подсети]
Создайте внутренний маршрут к конкретному клиенту. Параметр netmask, если он не указан, по умолчанию равен 255.255.255.255. Эта директива может использоваться для маршрутизации фиксированной подсети от сервера к конкретному клиенту, независимо от того, откуда клиент подключается. Помните, что вы также должны добавить маршрут в системную таблицу маршрутизации (например, с помощью директивы --route). Причина, по которой необходимы два маршрута, заключается в том, что директива --route направляет пакет от ядра к OpenVPN. Попав в OpenVPN, директива --iroute направляется к конкретному клиенту. Этот параметр должен быть указан либо в файле конфигурации экземпляра клиента с помощью --client-config-dir, либо динамически сгенерирован с помощью сценария --client-connect. Директива --iroute также имеет важное взаимодействие с --push "route ...". --iroute по существу определяет подсеть, которая принадлежит определенному клиенту (мы назовем этого клиента A). Если вы хотите, чтобы другие клиенты могли подключиться к подсети A, вы можете использовать --push "route ..." вместе с --client-to-client, чтобы выполнить это. Чтобы все клиенты могли видеть подсеть A, OpenVPN должен протолкнуть этот маршрут всем клиентам, ЗА ИСКЛЮЧЕНИЕМ для A, поскольку подсеть уже принадлежит A. OpenVPN выполняет это, не отправляя маршрут к клиенту, если он соответствует одному из маршрутов клиента. iroutes.
Вам потребуются записи конфигурации, как показано ниже, для соответствующих клиентов и серверов.
iroute 192.168.3.0 255.255.255.0
Кроме того, вам может потребоваться проверить CCD, если у вас есть несколько сетей за несколькими клиентами.
клиент-конфигурация-каталог
Эта директива устанавливает каталог конфигурации клиента, который сервер OpenVPN будет сканировать при каждом входящем соединении в поисках файла конфигурации для конкретного клиента (дополнительную информацию см. На странице руководства). Файлы в этом каталоге можно обновлять «на лету» без перезапуска сервера. Обратите внимание, что изменения в этом каталоге вступят в силу только для новых подключений, но не для существующих. Если вы хотите, чтобы изменение файла конфигурации, зависящее от клиента, немедленно вступило в силу для подключенного в данный момент клиента (или того, который отключился, но у которого сервер не прервал тайм-аут своего объекта экземпляра), уничтожьте объект экземпляра клиента, используя команду управления интерфейс (описан ниже). Это заставит клиента повторно подключиться и использовать новый файл client-config-dir.
Ответ Fossil был именно тем, что мне было нужно, и я уже принял его. Я просто хотел бы добавить некоторую информацию для других людей, у которых может быть такая же проблема. Поскольку вопрос уже задавался о сбое сервера, но в ответах либо не упоминается iroute (один пример) или иметь только мертвые ссылки (например, вот этот)
Итак ... во-первых, я нашел хорошее объяснение iroute (и зачем это нужно) Вот . Но поскольку я только что упомянул о риске потери ссылок, я также постараюсь упомянуть наиболее важные идеи ниже.
Похоже, маршрутов ядра недостаточно для прохождения трафика через туннель OpenVPN. Если вы хотите подключиться к локальной сети, которая находится за клиентом OpenVPN, вам также понадобится внутренний маршрут OpenVPN (iroute). Это добавляется с помощью оператора client-configuration-dir в server.conf и добавления операторов iroute в файлы конфигурации, размещенные внутри этого подкаталога.
В моем случае мне также потребовались:
#Inside server.conf
client-configuration-dir my-config-dir
#Inside my-config-dir/client1 (same name as the client!)
#Tell OpenVPN that 192.168.13.0/24 is reachable via client1
iroute 192.168.13.0 255.255.255.0
Это также вызывает интересную проблему - если OpenVPN не может работать, используя только маршруты ядра, на первый взгляд кажется, что невозможно запустить протокол маршрутизации поверх туннелей ovpn. У кого-нибудь получилось такое решение (ovpn + rip / ospf) работающее?