网关通过 OpenVPN 隧道从 DHCP 答复中被剥离

网关通过 OpenVPN 隧道从 DHCP 答复中被剥离

我有一个桥接的 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

服务器在网络 A 中的 Debian 机器上运行,客户端在网络 B 中的 OpenWRT 路由器上运行。在网络 A 上,tap0 接口与本地网络桥接,包含 DHCP 服务器和互联网网关。在网络 B 上,tap0 接口与没有 DHCP 服务器或互联网访问的单独网络桥接。其理念是 OpenVPN 隧道为网络 B 提供互联网访问。

在此设置中,OpenVPN 服务器不会分配 IP 地址供客户端使用。相反,它只是让本地网络中的 DHCP 服务器处理该问题。这是可行的,因为这是一个桥接 (TAP) 设置,而不是路由 (TUN) 设置。

因此,DHCP 确实可以通过隧道工作。网络 B 端的客户端直接从网络 A 端的 DHCP 服务器获取其 IP 地址。问题是默认网关似乎从 DHCP 回复中被剥离,因为它在网络 B 上的机器上是空的。

例如,这是我在连接到网络 B 的 Windows 客户端上获得的结果:

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指令,因为我需要在与 OpenVPN 客户端的 tap0 适配器桥接的机器上正确获取网关,而不是在 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 客户端将从在 OpenVPN 服务器端 LAN 上运行的 DHCP 服务器接收其 TAP 适配器的 IP 地址。请注意,只有支持将 DHCP 客户端与 TAP 适配器绑定的客户端(例如 Windows)才支持此模式。可选的 nogw 标志(高级)表示不应将网关信息推送到客户端。

有趣。我做到了不是设置nogw。可能是隐式设置还是其他原因?我可以明确地“取消设置”它吗?

编辑:发现了这一点:https://forums.openvpn.net/topic13494.html
有人有同样的问题,一年前的帖子。没有答案。

答案1

根据 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 响应再次包含默认路由选项。

答案2

我自己也遇到了这个问题,并且发现了这一点,但没有有效的解决方案。几个小时后我找到了答案!

只需使用这个:

模式服务器

tls 服务器

并删除:

服务器桥

DHCP 将直接传递给客户端!

答案3

openvpn server-bridge 选项用于桥接模式,你有两个选项可以使用单独的 dhcp 服务器或 server-bride 选项

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

如果我的子网 192.168.122.0/24 中有一个 openvpn 服务器,我可以用这种方式使用服务器桥

  #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 服务器

答案4

将其用于 OpenVPN 上的 DHCP(在 server.conf 中):

server-bridge 172.18.100.100 255.255.0.0 172.18.100.105 172.18.100.250

在哪里:

  • 172.18.100.100 是 OpenVPN 服务器的 IP
  • 172.18.100.105-172.18.100.250 是客户端 IP 范围

您还需要在 OpenVPN(server.conf)上执行此项:

push "route 172.18.0.0 255.255.0.0"

就是这样。之后,如果您想从私有网络(在客户端)出去,只需通过一个网关(服务器的 IP)转发所有流量即可。

相关内容