使用分割隧道通过 SSH/RDP 访问 OpenVPN 服务器后面的 LAN

使用分割隧道通过 SSH/RDP 访问 OpenVPN 服务器后面的 LAN

我想设置基于 OpenVPN 的私有 VPN,以便在旅途中访问我的家庭 LAN。我希望拥有以下功能:

  • 远程客户端应该位于单独的子网上(这似乎是设置 OpenVPN 最简单的方法)
  • 远程客户端可以“看到”我家局域网上的所有设备并与之交互;
  • 家庭客户端可以“看到”远程客户端并与之交互;
  • 来自远程客户端的所有“非 LAN”流量都应使用远程客户端的现有互联网连接(即,我不希望远程客户端通过 OpenVPN 服务器和我家 LAN 自己的互联网连接路由来访问互联网)

如果我理解正确的话,最后一个要求是设置分割隧道。

下面的图片可能有助于说明我想要实现的目标:

在此处输入图片描述 OpenVPN 服务器在 Debian Buster 下运行。大多数(但不是全部)远程和客户端计算机都是基于 Windows 或 iOS 的。

VPN 子网为 192.168.5.0/24。我家 LAN 的子网为 192.168.1.0/24。我家 LAN 的互联网网关为 192.168.1.254。

我已经能够创建看起来像是分割隧道的远程连接。从我的 iPhone,我成功地创建了到 OpenVPN 服务器的链接,并且 iPhone 被分配了 VPN 子网的 IP 地址,但我仍然可以上网(我认为这意味着“非 LAN”流量被路由到 iPhone 的互联网连接)。

iPhone 可以 ping VPN 服务器的客户端 (192.168.5.1) 或家庭 LAN 端的设备 (192.168.1.5,这是 VPN 服务器的家庭 LAN 地址),但我无法从 iPhone 的客户端建立 SSH 或 RDP 连接。有时 ping 是不够的 :)。

这是我的 OpenVPN server.conf 文件:

port **redacted**
proto udp
dev tun

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/mycroft-server.crt
key /etc/openvpn/server/mycroft-server.key
dh /etc/openvpn/server/dh.pem

topology subnet
server 192.168.5.0 255.255.255.0
client-to-client

push "route 192.168.1.0 255.255.255.0 192.168.5.1"
push "dhcp-option DNS 192.168.1.5"
push "dhcp-option DOMAIN localnet"
push "block-outside-dns"

cipher AES-256-CBC

tls-version-min 1.2
tls-crypt /etc/openvpn/server/ta.key
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-$

auth SHA512
auth-nocache

keepalive 10 60

persist-key
persist-tun

compress lz4

daemon

user nobody
group nogroup

status /etc/openvpn/openvpn-status.log
status-version 3
log-append /var/log/openvpn.log

verb 3

这是我的客户端 ovpn 文件,减去各种加密元素:

client
dev tun
proto udp
remote moose.zapto.org 37639

route 192.168.1.0 255.255.255.0 192.168.5.1

cipher AES-256-CBC

auth SHA512
auth-nocache

tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-$

resolv-retry infinite
compress lz4
nobind

persist-key
persist-tun

mute-replay-warnings

verb 3

附加信息

我应该包括这个但是忘了。这是route -n在 OpenVPN 服务器上运行的输出:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.254   0.0.0.0         UG    202    0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     202    0        0 eth0
192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 tun0

最后一个条目显然是由 OpenVPN 创建的。

我尝试使用以下命令从我的家庭 LAN 子网添加到 VPN 子网的路由:

sudo ip route add 192.168.5.0/24 via 192.168.1.5 dev tun0

但它会产生以下错误:

错误:Nexthop 具有无效网关。

Ping 和 Traceroute

从我的 iPhone 上,我可以 ping 通 VPN 服务器的客户端(192.168.5.1)以及运行 VPN 服务器的机器(即从其“LAN 端”:192.168.1.5)。

从客户端来看,tracert 192.168.1.5单跳即可成功。

答案1

您快到了。

sudo ip route add 192.168.5.0/24 via 192.168.1.5 dev tun0

上述命令不起作用,因为接口和下一跳属于不同的子网。

您需要在 server.conf 中添加以下几行:

# Define VPN virtual subnet
server 192.168.5.0 255.255.255.0
# Specify local LAN, and permit routing
push "route 192.168.1.0 255.255.255.0"
route 192.168.5.0 255.255.255.0

假设eth0面向互联网、eth1面向 LAN 并且tun0是隧道接口(假设 UDP 1194 已添加到防火墙例外中)

$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward
$ sudo iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -o eth1 -j MASQUERADE
$ sudo iptables -A FORWARD -i tun0 -j ACCEPT
$ sudo iptables -A FORWARD -i tun0 -o eth0 -s 192.168.5.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -i eth1 -o tun0 -d 192.168.5.0/24 -j ACCEPT
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A FORWARD -j REJECT

答案2

如果有人想更详细地了解我在 Debian Buster Raspberry Pi 上运行 OpenVPN 时遇到的问题,请参阅https://imperfect.olbert.com/my-vpn-saga-take-two/

相关内容