OpenVPN 不通过 VPN 重定向所有流量

Ale*_*rth 2 routing iptables openvpn centos6

我刚刚完成了我的 VPN 的设置,谷歌显示我的 IP 是我的 VPN 的 IP,所以这很好用。但是,当我通过 SSH 登录到 VPN 服务器时,它显示我的最后一次登录是我的(非 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"
Run Code Online (Sandbox Code Playgroud)

iptables使用以下设置:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

有没有办法来解决这个问题?它

小智 5

这是 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)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,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
Run Code Online (Sandbox Code Playgroud)

第一路线引导所有流量(除了一个涉及本地网络10.0.1/24)的tun0接口,即,OpenVPN的。到 OpenVPN 服务器的静态路由是最后一行的路由。10.0.1.1在这种情况下是 Internet 网关。