我刚刚设置完 VPN,Google 显示我的 IP 是我的 VPN 的 IP,所以这没问题。但是,当我通过 SSH 登录 VPN 服务器时,它显示我上次登录的 IP 是我的(非 VPN 的)IP(即使经过多次登录/退出)。这让我相信并非所有数据都通过 VPN 传输。
在我的server.conf
我有以下指令:
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
并iptables
设置如下:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
有办法解决这个问题吗?
答案1
这是 100% 预期的行为。为了通过 VPN 连接路由所有流量,添加了一个默认路由,并以虚拟接口为目标。但这带来了一个问题 - 用于承载 VPN 连接本身的网络数据包也会被路由到 VPN 接口,从而形成一种路由循环。为了解决这个问题,使用您的普通 Internet 网关作为目标添加了到 VPN 服务器的静态主机路由。这样,OpenVPN 创建的数据包就可以通过 Internet 传输到 OpenVPN 服务器,而其他所有内容都通过 VPN 链接传输。
由于主机路由,如果您尝试通过 SSH 连接到 VPN 服务器的 Internet 地址,则连接将通过常规 Internet 连接进行,您将在who
或 的输出中看到您的 IP last
。另一方面,如果您通过 SSH 连接到 VPN 隧道的另一端,您的连接将显示为源自分配给隧道客户端的 IP 地址。
例如,典型的 OpenVPN 虚拟接口配置如下:
$ ifconfig
...
tun0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 10.10.11.9 --> 10.10.11.10 netmask 0xffffffff
open (pid 48658)
本例中 VPN 隧道的远端是10.10.11.10
。这是 BSD 样式的ifconfig
输出(实际上是 OS X)。Linux 上的输出略有不同。这是相应的主机路由(同样是 BSD 格式):
$ netstat -rn
Destination Gateway Flags Refs Use Netif Expire
0/1 10.10.11.9 UGSc 0 0 tun0
default 10.0.1.1 UGSc 22 0 en0
10.0.1/24 link#4 UCS 1 0 en0
10.10.11/24 10.10.11.9 UGSc 0 0 tun0
10.10.11.9 10.10.11.10 UHr 5 0 tun0
yy.yy.yy.yy/32 10.0.1.1 UGSc 1 0 en0
第一条路由将所有流量(除指向本地网络的流量外10.0.1/24
)导向接口tun0
,即 OpenVPN。到 OpenVPN 服务器的静态路由是最后一行。10.0.1.1
在本例中是 Internet 网关。