我想设置基于 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/。