Назад | Перейти на главную страницу

Шлюз лишается ответа DHCP через туннель OpenVPN

У меня есть мостовая настройка OpenVPN. Это моя конфигурация сервера:

port 1194
proto udp
dev tap0

ca      /etc/openvpn/easy-rsa/keys/ca.crt
cert    /etc/openvpn/easy-rsa/keys/server.crt
key     /etc/openvpn/easy-rsa/keys/server.key
dh      /etc/openvpn/easy-rsa/keys/dh2048.pem

# brtctl upscript
script-security 2
up /etc/openvpn/up.sh

tls-server
server-bridge

keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

Сервер работает на машине Debian, работающей в сети A, клиент работает на маршрутизаторе OpenWRT в сети B. В сети A интерфейс tap0 соединен с локальной сетью, содержащей DHCP-сервер и шлюз в Интернет. В сети B интерфейс tap0 соединен с отдельной сетью без DHCP-сервера или доступа в Интернет. Идея состоит в том, что туннель OpenVPN обеспечивает доступ в Интернет для сети B.

В этой настройке сервер OpenVPN не выделяет IP-адреса для использования клиентами. Вместо этого он просто позволяет DHCP-серверу в локальной сети справляться с этим. Это работает, потому что это мостовая (TAP), а не маршрутизированная (TUN) установка.

Итак, DHCP действительно работает через туннель. Клиенты на стороне сети B получают свои IP-адреса непосредственно от DHCP-сервера на стороне сети A. Проблема в том, что похоже, что шлюз по умолчанию удаляется из ответа DHCP, потому что он пуст на машинах в сети B.

Например, вот что я получаю на клиенте Windows, подключенном к сети B:

Ethernet adapter Ethernet:

   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   IPv4 Address. . . . . . . . . . . : 192.168.2.123(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Lease Obtained. . . . . . . . . . : vrijdag 25 juli 2014 22:49:38
   Lease Expires . . . . . . . . . . : zaterdag 26 juli 2014 10:49:38
   Default Gateway . . . . . . . . . :
   DHCP Server . . . . . . . . . . . : 192.168.2.1
   DNS Servers . . . . . . . . . . . : 8.8.8.8
   NetBIOS over Tcpip. . . . . . . . : Enabled

Я нашел это: https://community.openvpn.net/openvpn/ticket/312#comment:3

Это говорит о том, что это задокументированное поведение, но я не знаю, как это отключить. Я пробовал использовать директиву route-nopull на стороне клиента, но, похоже, не имеет никакого эффекта.

Кроме того, я не могу использовать redirect-gateway директивы, поскольку мне нужно получить шлюз прямо на машинах, соединенных мостом с адаптером tap0 клиента OpenVPN, а не на самом клиенте OpenVPN.

Моя клиентская конфигурация выглядит следующим образом:

config openvpn sample_client
    option enabled 1

    option client 1

    option dev tap

    option proto udp

    list remote "server.com 1194"

    option resolv_retry infinite

    option nobind 1

    option persist_key 1
    option persist_tun 1

    option ca /etc/openvpn/ca.crt
    option cert /etc/openvpn/client.crt
    option key /etc/openvpn/client.key

    option ns_cert_type server

    option comp_lzo yes

    option verb 3

    option route-nopull 1

Имейте в виду, что это формат OpenWRT UCI.

РЕДАКТИРОВАТЬ:

Только что нашел это в журналах:

daemon.notice openvpn(sample_client)[5062]: Extracted DHCP router address: 192.168.2.1

Это именно то поведение, которое я хочу отключить.

Также нашел это:

Если --server-bridge используется без каких-либо параметров, он включит режим DHCP-прокси, при котором подключенные клиенты OpenVPN получат IP-адрес для своего адаптера TAP от DHCP-сервера, работающего в локальной сети на стороне сервера OpenVPN. Обратите внимание, что только клиенты, которые поддерживают привязку DHCP-клиента к адаптеру TAP (например, Windows), могут поддерживать этот режим. Необязательный флаг nogw (расширенный) указывает, что информация о шлюзе не должна передаваться клиенту.

Интересный. я сделал не устанавливать nogw. Может быть, это неявно установлено или что-то в этом роде? Могу ли я его явно "отключить"?

РЕДАКТИРОВАТЬ: Нашел это: https://forums.openvpn.net/topic13494.html
Кто-то с той же проблемой, ветка год назад. Нет ответов.

Согласно документации OpenVPN
server-bridge это сокращенное выражение для

mode server
tls-server
push "route-gateway dhcp"

и

server-bridge nogw это сокращенное выражение для

mode server
tls-server

что интересно push "route-gateway dhcp" активирует DHCP-прокси, который удаляет параметр шлюза по умолчанию в ответе DHCP от исходного DHCP-сервера. Это можно увидеть в журнале OpenVPN.
daemon.notice openvpn[4879]: Extracted DHCP router address: a.b.c.d

Ваше решение - использовать серверный мост nogw и ответ DHCP снова содержит параметр маршрута по умолчанию.

У меня была эта проблема, и я нашел ее без полезного решения. Через несколько часов я понял это!

Просто используйте это:

режим сервера

tls-сервер

и удалите:

серверный мост

И DHCP будет передаваться напрямую клиенту!

Используйте это для DHCP через OpenVPN (в server.conf):

server-bridge 172.18.100.100 255.255.0.0 172.18.100.105 172.18.100.250

Куда:

  • 172.18.100.100 - IP сервера OpenVPN
  • 172.18.100.105-172.18.100.250 - это диапазон IP-адресов клиентов

И вам также понадобится это в OpenVPN (server.conf):

push "route 172.18.0.0 255.255.0.0"

Вот и все. После этого вам нужно только перенаправить весь трафик через один шлюз (IP-адрес сервера), если вы хотите выйти из частной сети (на клиенте).

параметры openvpn server-bridge используются для режима моста, у вас есть два варианта: используйте отдельный dhcp-сервер или параметр server-bridge

  https://openvpn.net/index.php/open-source/documentation/miscellaneous/76-ethernet-bridging.html

Если у меня есть сервер openvpn в моей подсети 192.168.122.0/24, я могу использовать серверный мост таким образом

  #ip of my vpn server 192.168.122.9
  #vpn client ip pool
  server-bridge 192.168.122.9 255.255.255.0 192.168.122.20 192.168.122.40

Таким образом, мой VPN-клиент получает IP-адрес в удаленной подсети без использования удаленного DHCP-сервера.