我在 Raspberry PI(服务器:192.168.0.2)和 Ubuntu 笔记本电脑(客户端:192.168.0.3)上安装了 OpenVPN。两台机器都连接到同一个无线网络,它们的地址由 DHCP 从 192.168.0.1 的无线路由器分配。但是,当启动 VPN 时,我无法从客户端访问互联网。
当我在服务器上启动 OpenVPN(使用以下选项)时,它似乎正确启动。
port 1194
proto udp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh2048.pem
cipher AES-256-CBC
auth SHA512
topology subnet
server 10.8.0.0 255.255.255.0
push "dhcp-option DNS 8.8.8.8"
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
当我在客户端上启动 OpenVPN(使用以下选项)时,它似乎也能正确启动。
ca keys/ca.crt
cert keys/client-no-pass.crt
key keys/client-no-pass.key
remote 192.168.0.2 1194
comp-lzo
client
dev tun
redirect-gateway local
remote-cert-tls server
cipher AES-256-CBC
auth SHA512
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
mute 20
在客户端上,我可以看到我的 IP 路由表已被操纵,使用服务器的 VPN IP 地址作为默认路由,并且所有到 VPN 网络的流量都将来自 tun0 的 IP 地址 10.8.0.4。
me@client:~$ ip route
default via 10.8.0.1 dev tun0
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.4
169.254.0.0/16 dev wlp4s0 scope link metric 1000
192.168.0.0/24 dev wlp4s0 proto kernel scope link src 192.168.0.3 metric 600
当 VPN 断开时,我可以 ping 通 8.8.8.8(DNS 服务器)。当 VPN 连接时,我不能 ping 通。
在 Google 搜索后,我尝试在服务器上添加它,但没有帮助:
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o wlan0 -j SNAT --to-source 192.168.0.2
我做错了什么?我该如何解决?我的本地 WLAN VPN 方案是否根本不受支持?我尝试运行 Wireshark 来捕获来自客户端的 tun0 流量,但无法解决问题。
编辑: 附加信息:
服务器的 IP 地址被“保留”(按 MAC 地址),因此路由器始终为其分配相同的地址
192.168.0.2
该服务器已配置(通过编辑
/etc/sysctl.conf
)以转发 IPV4 数据包,并且已通过运行进行了测试cat /proc/sys/net/ipv4/ip_forward
(返回 1)服务器路由表显示如下:
我@服务器:~$ ip 路由 默认通过 192.168.0.1 dev wlan0 metric 303 10.8.0.0/24 dev tun0 proto 内核范围链接 src 10.8.0.1 192.168.0.0/24 dev wlan0 proto 内核范围链接源 192.168.0.2 度量 303
- 服务器的防火墙如下所示:
我@服务器:~ $ sudo iptables -S -P 输入接受 -P 转发接受 -P 输出接受 -A 转发 -m conntrack --ctstate 相关,已建立 -j 接受 -A 转发 -s 10.8.0.0/24 -i tun0 -o wlan0 -m conntrack --ctstate 新 -j 接受 我@服务器:~ $ sudo iptables -t nat -S -P 预路由接受 -P 输入接受 -P 输出接受 -P 路由后接受 -A POSTROUTING -s 10.8.0.0/24 -o wlan0 -j MASQUERADE
答案1
您需要确认路由和网络地址解读(NAT)在您的 VPN 服务器上正常运行。尝试使用tcpdump检查服务器 VPN 接口和以太网端口上的网络流量,以确保数据包正在流动,以及它们的地址是什么。回答您关于此设计是否可以实现这一点的评论,答案是肯定可以,而且这是了解所有相关概念的好方法。
这是关于Linux 中的 NAT,还有许多其他可用。要检查的关键是您的系统是否正确配置了路由 - 默认情况下,它可能已关闭。如果
cat /proc/sys/net/ipv4/ip_forward
返回零,则表示已关闭,防火墙规则将无法挽救您。您可以运行echo 1 > /proc/sys/net/ipv4/ip_forward
以将其打开,但最好查看整个指南以完成所有必要的步骤以及使此更改永久生效的说明(否则每次重新启动时都会丢失)。
此外,如果您使用 DHCP 作为 VPN 服务器,那么您可能希望使用 MASQUERADE 而不是 SNAT,因为 IP 地址可能会发生变化,从而导致防火墙规则不正确。
请注意,如果您不想使用 NAT,则需要让本地路由器(插入 ISP 的路由器)知道您的 VPN 子网 (10.8.0.0/24) 位于 VPN 服务器的 IP 地址 (192.168.0.2) 后面。目前,它不知道如何找到 10.8.0.4,因此只会丢弃回复数据包。
同样,如果服务器的地址是由 DHCP 分配的,那么这可能会发生变化,您需要更新路由条目,如果您使用 ISP 的路由器并且他们不允许您管理他们的设备,您甚至可能无法添加此路由。