Я пытаюсь настроить прозрачный VPN-шлюз для удаленной сети, в удаленной сети есть сервер OpenVPN, а в локальной сети - клиент OpenVPN, выполняющий роль шлюза.

Диаграмма показывает IP и маршруты для каждого хоста, зеленым цветом я отметил маршруты, которые я добавил, чтобы все работало, я хочу сделать NAT на сервере VPN, поэтому никаких дополнительных маршрутов на каждом сервере этой сети не требуется ( сервер с именем Destination является примером сервера в этой сети).

Отредактировано, чтобы добавить пояснения:

Моя проблема живет только на сервере с надписью «VPN-клиент», я могу заставить установку работать, настроив NAT на этом сервере, как описано ниже, но я хочу, чтобы он направлял пакеты на «VPN-сервер» без NAT, NAT будет выполнен "VPN-сервером".

Схема подключения

Насколько я понимаю, пинг с компьютера, помеченного как "рабочая станция", на сервер, помеченный как "назначение", должен работать, но он не работает, такой же пинг с клиента VPN работает, как и ожидалось, только с одним NAT, выполняемым на сервере VPN.

Если я открою tcpdump на tun0 с обеих сторон, я смогу увидеть ping-пакеты с рабочей станции до места назначения на VPN-клиенте, но ничего на VPN-сервере, вот вывод tcpdump на VPN-клиенте:

$ sudo tcpdump -i tun0 'icmp'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
16:07:11.391614 IP 10.1.110.7 > 192.168.1.63: ICMP echo request, id 10871, seq 49, length 64
16:07:12.404989 IP 10.1.110.7 > 192.168.1.63: ICMP echo request, id 10871, seq 50, length 64

Если я добавлю правило маскарада на VPN-клиенте, пинг достигнет пункта назначения и отправит ответ:

$ iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Но с этой настройкой я буду выполнять NAT дважды, я хочу, чтобы VPN-клиент пересылал пакеты без наттинга.

Политика пересылки брандмауэра настроена на принятие:

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

И нет правил NAT, которые могли бы помешать:

$ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        

Переадресация IP включена:

$ cat /proc/sys/net/ipv4/ip_forward
1

Чего мне не хватает?

1 ответ1

0

Оказывается, что OpenVPN имеет свои собственные таблицы маршрутизации, часть из тех, которые вы можете увидеть с помощью ip ro или route -n .

Если сервер OpenVPN получает пакет от клиента с адресом источника, для которого у него нет маршрутов (сервер vpn, а не хост), он отбрасывает его до достижения tun0. Когда это происходит, вы можете увидеть подобное сообщение в журнале openvpn:

Tue Nov 14 11:26:21 2017 us=135733 client/X.X.X.X:40770 MULTI: bad source address from client [10.1.110.7], packet dropped

Когда это происходит, вам нужно добавить iroute, iroutes зависит от клиента, и вы должны включить client-config-dir

#/etc/openvpn/server.conf
...
client-config-dir ccd

Затем в /etc/openvpn/ccd/<client_name> вы можете добавить свой iroute:

# /etc/openvpn/ccd/client
iroute 10.1.0.0 255.255.0.0

После перезапуска сервера OpenVPN вы начнете видеть, что ваши пакеты достигают tun0 с другой стороны, так как на этот раз OpenVPN не будет отбрасывать их.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .