我有一个桥接的 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)转发所有流量即可。