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

Com*_*fox 5 networking dhcp vpn openvpn openwrt

我有一个桥接的 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
Run Code Online (Sandbox Code Playgroud)

服务器在运行在网络 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
Run Code Online (Sandbox Code Playgroud)

我发现了这个: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
Run Code Online (Sandbox Code Playgroud)

请记住,这是 OpenWRT 的 UCI 格式。

编辑:

刚刚在日志中发现了这个:

daemon.notice openvpn(sample_client)[5062]: Extracted DHCP router address: 192.168.2.1
Run Code Online (Sandbox Code Playgroud)

这正是我想要禁用的行为。

还发现了这个:

如果不带任何参数使用 --server-bridge,它将启用 DHCP 代理模式,在这种模式下,连接 OpenVPN 客户端将从运行在 OpenVPN 服务器端 LAN 上的 DHCP 服务器接收其 TAP 适配器的 IP 地址。请注意,只有支持 DHCP 客户端与 TAP 适配器绑定的客户端(如 Windows)才能支持此模式。可选的 nogw 标志(高级)表示不应将网关信息推送到客户端。

有趣的。我并没有设置nogw。可能是隐式设置还是什么?我可以明确地“取消”它吗?

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

Zat*_*rra 0

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

server-bridge 172.18.100.100 255.255.0.0 172.18.100.105 172.18.100.250
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • 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"
Run Code Online (Sandbox Code Playgroud)

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