我在 Debian 9 服务器上设置了一个 OpenVPN 服务器,一切似乎都运行正常:我可以通过该 VPN 访问 Internet。但是,我发现任何针对该服务器的流量仍然使用 或 而eth0
不是wlan0
。tun0
例如,如果我在本地网络上不允许 ICMP:
ping google.com
将按预期工作(用作tun0
输出接口)
ping myvpn.com
(如果 myvpn.com 是我的 vpn 服务器)将不起作用,因为它使用 eth0 或 wlan0 作为输出接口,因此被网络防火墙阻止。
我查看了路由,发现在连接时,OpenVPN 客户端正在在路由表中添加一个条目:(
1.2.3.4 via 10.0.0.1 dev wlp7s0 proto static metric 600
其中 1.2.3.4 是我的 vpn 公网 IP)
我理解此路由的用途:当 OpenVPN 客户端将数据包发送到 OpenVPN 服务器,然后重新路由到 Internet 时,它必须通过物理接口发送数据包。但是,我希望当我 ping 或 SSH 到服务器时,数据包通过 tun0 接口发送。
是否有一个选项可以提供给 OpenVPN 客户端或者一条iptables
规则,以便只有 OpenVPN 生成的数据包才能通过物理接口发送?
编辑:对于传出流量,一切都运行良好:除了目的地为服务器本身的流量外,所有流量都通过 VPN。我认为问题可能出在客户端,因为客户端正在添加到服务器的路由。以下是服务器配置文件:
port 443
proto tcp
dev tun
ca /path/to/ca.crt
cert /path/to/server.crt
key /path/to/server.key
dh /path/to/dh.pem
server 10.8.0.0 255.255.255.0
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
push "redirect-gateway def1 bypass-dhcp"
push "route 10.8.8.0 255.255.255.0"
我尝试修改此行:
push "redirect-gateway def1 bypass-dhcp"
更改为:
push "redirect-gateway autolocal def1 bypass-dhcp"
按照答案中的建议,但结果仍然相同:我可以 ping google.com,但不能 ping 我的 VPN 公共 IP
答案1
最简单的方法是在客户端上添加一个 iptables 规则,将目的地为 myvpn.com:22 的传出流量重定向到 10.8.0.1 的 vpn 端点
sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp -d myvpn.com --dport 22 -j DNAT --to-destination 10.8.0.1:22
iptables -t nat -A POSTROUTING -d 10.8.0.1 -p tcp --dport 22 -j SNAT --to myvpn.com:22
iptables -A FORWARD -d 10.8.0.1 -p tcp --dport 22 -j ACCEPT
需要 SNAT 规则来接收回复:如果没有它,数据包将被丢弃,因为源 IP 不是我们期望的(10.8.0.1 而不是 myvpn.com)。
我认为没有办法通过将一些选项从 openvpn 服务器推送到客户端来强制执行此行为。您需要手动将这些规则添加到您的客户端。