OpenVPN简单远程访问

OpenVPN简单远程访问

我已经花了两天时间寻找线索来创建符合我要求的正确 OpenVPN 配置。现在我希望你们中有人能理解这种可能性。

要求

我的目标是允许 VPN 客户端向特定远程子网发送请求:192.168.1.0

但是所有未针对该子网的其他数据包都应发送到本地网关或本地子网。

我的第一次尝试

我已经解决了第二个要求(这很简单,您只需进行一次路由推送)。但远程网关(10.8.0.1)不响应例如 192.168.1.90 的请求。但它会响应对 192.168.1.99 的请求,这是我的服务器的本地 IP。

服务器配置:

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
cipher AES-128-CBC
user nobody
group nogroup
persist-key
persist-tun
verb 3
crl-verify crl.pem
explicit-exit-notify
push "route 192.168.1.0 255.255.255.0 vpn_gateway" 

客户端配置

client
dev tun
proto udp
remote quickme.at 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-128-CBC
verb 3
<ca>

我第二次尝试

现在我发现还有 Tap。它在两个网络之间建立桥梁。所以我改用 Tap。但是当我 ping 192.168.1.90 时,192.168.1.128(我桥接到的远程 IP)回答目标主机无法访问。

服务器配置:

port 1194
proto udp

dev tap
dev-node tap-bridge

server-bridge 192.168.1.99 255.255.255.0 192.168.1.128 192.168.1.254

ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
keepalive 10 120
cipher AES-128-CBC
verb 3
crl-verify crl.pem

push "route-gateway 192.168.1.90"
push "route 192.168.1.0 255.255.255.0"

客户端配置:

client
dev tap
proto udp
remote b.bos.at 1194
resolv-retry infinite
nobind
remote-cert-tls server
auth SHA512
cipher AES-128-CBC
verb 3
<ca>

我对每一个可行的解决方案都很满意;)

答案1

因此问题在于,ip 数据包使用远程客户端的虚拟子网 ip 发送,例如 10.8.0.2

接收方将响应发送到其默认网关,因为虚拟子网显然不在其子网中。

最后,答案被默认网关丢弃,因为它不知道如何处理这个数据包。

对此有两种解决方案:

第一个解决方案

为您想要访问的远程局域网中的所有主机添加静态路由。这样应答数据包就会发送到另一个网关:VPN 服务器。

静态路由在 Windows 中定义如下: route add 10.8.0.0/24 192.168.1.99这可能应该可行,但我还没有测试过。

第二种解决方案

在路由器(默认网关)上添加一条静态路由,告诉它将数据包发送到 vpn 服务器(192.168.1.99)

第三种解决方案

伪装来自 VPN 客户端的所有流量。这意味着将源 IP 更改为 VPN 服务器的 IP。有关更多信息,请参阅:https://community.openvpn.net/openvpn/wiki/BridgingAndRouting

如果您在服务器端有 Windows,则可能需要 NetNat 来配置它。

比较

所有的解决方案都有一个缺点。

对于第一个解决方案,问题在于您必须配置自动启动,以便在重新启动后也能添加路由。

第三种解决方案需要网关转发所有应答数据包,这会增加延迟和开销。

第二种解决方案隐藏了源 IP。这通常不利于调试 IP 数据包的真实来源。

笔记

最后我选择了第二种解决方案,因为它是可维护性和可调试性之间的最佳折衷。

我还忘记在我的配置中添加 DNS 服务器:https://serverfault.com/questions/318563/how-to-push-my-own-dns-server-to-openvpn

如果其中有任何错误,请随意评论或编辑。我只是将我的知识与我最近的研究结合起来。

相关内容