Настроить: У меня есть установка клиент / сервер openvpn (файлы конфигурации внизу), и я получаю печально известный MULTI: bad source address from client [192.168.x.x], packet dropped
сообщение на сервере. Сервер имеет публичный IP-адрес, а клиент находится за NAT.
Недостатки ранее предложенных решений: В client-config-dir
определенный в конфигурации сервера в настоящее время пуст. В предыдущих сообщениях (здесь и на форумах поддержки openvpn) предлагалось добавить файл с именем DEFAULT
с надлежащими правилами в client-config-dir
или добавьте файл с этими правилами для каждого пользователя, чтобы решить проблему.
Однако это не кажется долгосрочным решением, потому что эти правила зависят от местоположения клиента. Итак, я могу добавить правило, разрешающее клиентам из 192.168.x.0
для подключения. Но если они подключаются из другой сети, которая вместо этого использует 192.168.y.0
для NAT потребуется новое правило.
Вопросы:
Конфигурация сервера:
port 1234
proto tcp
dev tun
ca ca.crt
cert openvpn.crt
key openvpn.key
dh dh2048.pem
server 10.78.96.0 255.255.255.0
keepalive 10 120
comp-lzo
cipher CAMELLIA-128-CBC
user nobody
group nogroup
persist-key
persist-tun
client-cert-not-required
plugin /usr/lib/openvpn/openvpn-auth-pam.so login
status openvpn-status.log
push "redirect-gateway def1"
push "remote-gateway 1.2.3.4"
push "dhcp-option DNS 8.8.8.8"
client-config-dir ccd
verb 4
Конфигурация клиента:
ca ca.crt
client
dev tun
proto tcp
remote 1.2.3.4 1234
auth-user-pass
script-security 2
keepalive 5 60
topology subnet
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
cipher CAMELLIA-128-CBC
comp-lzo
verb 4
Ты спрашивал: "Может кто-нибудь объяснить, почему возникает эта проблема?"
На основании того, что сообщается в официальный OpenVPN FAQ Бьюсь об заклад, это вызвано проблемой маршрутизации в движке OpenVPN.
Чтобы лучше прояснить сценарий, позвольте мне обратиться к следующей диаграмме:
Здесь вы можете увидеть:
Также
Теперь предположим, что:
Имея такой сценарий, давайте подробно проверим, что происходит, когда R_PC1 (192.168.1.2) отправляет пакет, например эхо-запрос, на L_PC1 (10.0.1.2):
Так что все нормально ...
Теперь давайте проверим, что происходит с эхо-ответом, который L_PC1 отвечает R_PC1.
Теперь, если мы хотим, чтобы OpenVPN Server мог подключиться к удаленному сайту, нам нужно определить маршрутизацию с помощью «статического маршрута». Что-то вроде:
route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.10.0.2
Обратите внимание на адрес P2P, используемый в качестве шлюза..
Такие статические маршруты будут работать на уровне ОС. Другими словами, это необходимо, чтобы операционная система правильно маршрутизировала пакет. Это означает что-то вроде: «Пожалуйста, весь трафик, адресованный подсети 192.168.1.0/24, должен быть перенаправлен на движок OpenVPN, с которым ОС может общаться через P2P-адрес». Благодаря такому статическому маршруту теперь ...
Итак, теперь проблема в следующем: как программное обеспечение сервера openvpn сможет определять маршрут пакета с SRC_IP 10.0.1.2 и DST_IP 192.168.1.2?
Обратите внимание, что на основе конфигурации сервера OpenVPN он знает ничего ни о сети 192.168.1.0/24, ни о хосте 192.168.1.2. Это не подключенный клиент. Это не местный клиент. Так что? OpenVPN также знает, что это не "OS-Router", поэтому он на самом деле не хочет (и может ....) отправлять пакет обратно на локальный шлюз. Таким образом, единственный вариант здесь - вызвать ошибку. Это именно та ошибка, с которой вы столкнулись
Сказать это языком FAQ: "... он не знает, как направить пакет на эту машину, поэтому он отбрасывает пакет ...".
Как видно из официальная документация, опция iroute точно соответствует нашему объему:
--iroute network [netmask]
Generate an internal route to a specific client. The netmask
parameter, if omitted, defaults to 255.255.255.255.
This directive can be used to route a fixed subnet from the server
to a particular client, regardless of where the client is
connecting from. Remember that you must also add the route to the
system routing table as well (such as by using the --route
directive). The reason why two routes are needed is that the
--route directive routes the packet from the kernel to OpenVPN.
Once in OpenVPN, the --iroute directive routes to the specific
client.
Итак, вам понадобится:
--iroute 192.168.1.0 255.255.255.0
для применения (к серверу) при подключении вашего клиента OpenVPN, например, через специальный файл конфигурации, определенный на сервере (client-config-dir и т. д.).
Если вам интересно, почему эта проблема не происходит на шаге 2) выше, насколько я понимаю, клиент OpenVPN знает как его маршрутизировать, потому что он знает, что VPN-туннель является шлюзом по умолчанию.
То же самое нельзя сделать на сервере OpenVPN, потому что там обычно используется шлюз по умолчанию. не переопределено. Кроме того, учтите, что у вас может быть один сервер OpenVPN с большим количеством клиентов OpenVPN: каждый клиент знает, как связаться с сервером, но ... как сервер может решить, какой клиент выступает в качестве шлюза для неизвестной подсети?
Что касается вашего первого вопроса (Могут ли необходимые правила быть написаны универсальным / одноразовым способом?), Извините, но я не понимаю вашу проблему. Не могли бы вы перефразировать, указав более подробную информацию?
У меня была проблема, которая кажется похожей, но я не уверен, совпадает ли она с вашей. Я пытался выполнить эхо-запрос с клиента openvpn на компьютер в локальной сети сервера openvpn (маршрутизированный в конфигурации сервера), не получая ответа, и я мог видеть сообщение «плохой адрес источника» в журнале сервера openvpn.
Чтобы решить эту проблему, мне пришлось сделать 2 вещи:
Это исправило это для меня.