将所有流量通过OpenVPN路由

是的,这个问题已经被问了一百次了,我到处搜索也没有结果。
标题已经说得很清楚了。
我有一个OpenVPN服务器(在Ubuntu上),我可以通过我的客户端(Windows 8)连接到它...
问题出现在当我尝试通过VPN路由所有流量时。
我已经在server.conf中添加了“push”标志:
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"

当我从客户端连接时,客户端会输出以下内容:
Wed May 07 21:38:40 2014 SENT CONTROL [StretchVPN-CA]: 'PUSH_REQUEST' (status=1)
Wed May 07 21:38:41 2014 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1,dhcp-option DNS 8.8.8.8,route-gateway <Remote Router IP>,ping 10,ping-restart 120,ifconfig 192.168.0.201 255.255.255.0'
Wed May 07 21:38:41 2014 OPTIONS IMPORT: timers and/or timeouts modified
Wed May 07 21:38:41 2014 OPTIONS IMPORT: --ifconfig/up options modified
Wed May 07 21:38:41 2014 OPTIONS IMPORT: route options modified
Wed May 07 21:38:41 2014 OPTIONS IMPORT: route-related options modified
Wed May 07 21:38:41 2014 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Wed May 07 21:38:41 2014 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed May 07 21:38:41 2014 open_tun, tt->ipv6=0
Wed May 07 21:38:41 2014 TAP-WIN32 device [Local Area Connection 4] opened: \\.\Global\{1F145805-92FC-454E-8FD9-0A6017DD4AD1}.tap
Wed May 07 21:38:41 2014 TAP-Windows Driver Version 9.9
Wed May 07 21:38:41 2014 Notified TAP-Windows driver to set a DHCP IP/netmask of 192.168.0.201/255.255.255.0 on interface {1F145805-92FC-454E-8FD9-0A6017DD4AD1} [DHCP-serv: 192.168.0.0, lease-time: 31536000]
Wed May 07 21:38:41 2014 Successful ARP Flush on interface [35] {1F145805-92FC-454E-8FD9-0A6017DD4AD1}
Wed May 07 21:38:46 2014 TEST ROUTES: 1/1 succeeded len=0 ret=1 a=0 u/d=up
Wed May 07 21:38:46 2014 C:\WINDOWS\system32\route.exe ADD <Remote Router IP> MASK 255.255.255.255 172.20.10.1
Wed May 07 21:38:46 2014 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=25 and dwForwardType=4
Wed May 07 21:38:46 2014 Route addition via IPAPI succeeded [adaptive]
Wed May 07 21:38:46 2014 C:\WINDOWS\system32\route.exe ADD 0.0.0.0 MASK 128.0.0.0 192.168.0.3
Wed May 07 21:38:46 2014 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=30 and dwForwardType=4
Wed May 07 21:38:46 2014 Route addition via IPAPI succeeded [adaptive]
Wed May 07 21:38:46 2014 C:\WINDOWS\system32\route.exe ADD 128.0.0.0 MASK 128.0.0.0 192.168.0.3
Wed May 07 21:38:46 2014 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=30 and dwForwardType=4
Wed May 07 21:38:46 2014 Route addition via IPAPI succeeded [adaptive]
Wed May 07 21:38:46 2014 Initialization Sequence Completed

我尝试在客户端打开连接时使用标志。
openvpn --config "C:\Program Files\OpenVPN\config\client.ovpn" --redirect-gateway def1 --route-method exe

但是,当我访问whatsmyip.org时,它仍然显示我的客户端IP地址。
有人遇到过这个问题并成功解决吗?
非常感谢。

你试过push "route 0.0.0.0 0.0.0.0"或类似的推送路由吗?别忘了在VPN中添加回程路由! - lub
是的,当使用“redirect-gateway def1”命令时,这是自动完成的...它会添加0.0.0.0掩码127.0.0.0和127.0.0.0掩码127.0.0.0(接管默认路由而不删除已存在的路由)。 - Just Lucky Really
我担心你是否在Windows中以“管理员身份运行”客户端!如果你没有以管理员身份运行OVPN Windows客户端,就可能会出现这个问题。 - Kousha
6个回答

我已经使用OpenVPN服务器进行了测试,并在客户端和服务器配置中设置了redirect-gateway def1选项,效果很好。

当我访问whatismyip.org时,我看到的是我的OpenVPN服务器的IP地址。

以下是我使用的客户端配置:

client
dev tun
proto udp
# THE IP OF THE REMOTE OPENVPN SERVER:
remote ip_address port
resolv-retry infinite
nobind
persist-key
persist-tun
# THE CSR FILE:
pkcs12 certificate.p12
ns-cert-type server
cipher AES-256-CBC
comp-lzo
redirect-gateway def1
verb 3

我还尝试了在openvpn命令中添加redirect-gateway def1选项,并取得了相同的结果。 服务器配置如下:
port 1194
proto udp
dev tun

dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ca /etc/openvpn/easy-rsa/keys/ca.crt
# ENSURE THE DOMAIN NAME/FILENAME IS CORRECT:
cert /etc/openvpn/easy-rsa/keys/cert.crt
key /etc/openvpn/easy-rsa/keys/cert.key

server 10.5.3.0  255.255.255.0
# YOUR LOCAL SERVER IP HERE:
client-config-dir ccd
route 10.5.3.0 255.255.255.0
ifconfig-pool-persist ipp.txt
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun

status log/openvpn-status.log 5
status-version 2
log-append log/openvpn.log
verb 3  # verbose mode
management localhost port /etc/openvpn/management-password

# ROUTE THE CLIENT'S INTERNET ACCESS THROUGH THIS SERVER:
push "redirect-gateway def1"
push "remote-gateway vpn_server_ip"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 60

今天尝试了那个...还是没有成功。我注意到你正在使用TUN适配器而不是TAP适配器...我会尝试使用TAP适配器并回报结果:D - Just Lucky Really
1好的,使用TUN适配器似乎正在起作用...尽管我对需要分配的路由有些困扰...我正在使用192.168.1.0/24作为VPN网络,而192.168.0.0/24是我的服务器局域网。所以在我的服务器配置中,我已经添加了route 192.168.1.0 255.255.255.0push "route 192.168.0.0 255.255.255.0",但是我的客户端无法访问除了它的192.168.1.0/24网络之外的任何其他子网...我会再仔细查看一下。 - Just Lucky Really
选项"remote-gateway"未被识别或缺少额外参数:/ - mik3fly-4steri5k

也许你忘记修改你的NAT了?以root身份运行以下3个命令。
iptables -I FORWARD -i tun0 -o eth0 \
         -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT

iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED \
         -j ACCEPT

iptables -t nat -I POSTROUTING -o eth0 \
          -s 10.8.0.0/24 -j MASQUERADE

标题:

  • tun0:您的虚拟 VPN 网络卡
  • eth0:您的常规网络卡
  • 10.8.0.0:您的 VPN 网络 IP 段

2这个NAT修改步骤非常关键。如果不执行上述三个命令,我就无法使其正常工作。 - Nitesh Kumar Anand
7请注意,这些命令需要在OpenVPN服务器上运行,而不是客户端。 - Kem Mason
2我发现只修改nat表在我的服务器上也能正常工作。 - Ginhing
1在OpenVPN服务器重新启动的情况下,我们需要持久化iptables规则吗? - DWils
@DWils 是的,你需要将它们放在一些启动脚本中。查看这个问答:https://askubuntu.com/questions/270693/how-can-set-these-iptables-rules-to-run-at-startup - Arne
在OpenVPN服务器上启用内核IP转发对我来说也是必需的。sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward" - Frank Liu

在艰难地寻找答案之后,我似乎解决了这个问题,或许只是部分地解决了,但至少非常简单:
我使用的是Xubuntu 14.04和来自主要源的OpenVPN软件包。在“设置 > 系统 > 网络”中,我将预装的DNS地址127.0.1.1替换为谷歌的8.8.8.8,现在我可以看到所有流量都通过VPN服务器。
在Wireshark的表格中,没有DNS这样的字符串:所有数据都像TCP一样通过加密通道传输。当我查看tun0(笔记本内部)时,我可以看到DHCP和DNS流量。当我探索wlan0(笔记本和WiFi路由器之间的外部)流量时,我只能得到灰色的TCP数据包。
我认为这是因为在字符转数字解码中不需要DNS查询,它会像普通数据包一样进入公共流。
我很乐意听取您的想法,如果我完全错了也不会感到惊讶。

我忘了,这种方法有一个无可争议的优点 - 即使VPN服务器不支持DNS重定向,它也能正常工作。 - xrobot
顺便说一句,我们可以玩一个小把戏:如果我们不时发送一些虚假的明显无害的DNS查询,间接地这可能成为我们对大哥忠诚的确认。 - xrobot

我遇到了同样的问题,并且发现在使用 PiVPN 设置脚本时,Open VPN 的服务器配置文件中包含以下行:

push "redirect-gateway def1 bypass-dhcp"

已经完成。

在IOS客户端上,所有内容都会自动通过隧道路由(日志中有显示)。

在Tunnelblick客户端上,您需要在client.ovpn文件中添加以下行:

redirect-gateway def1 bypass-dhcp

应该可以完美运行。至少在我的Mac上是这样的。

这对我有用。谢谢。 - Paul Heller

在服务器端找到 server.conf 文件,然后只需将以下内容添加到其中即可。
push "redirect-gateway autolocal"

它将通过隧道重定向所有客户端流量。

如果您的OpenVPN客户端在Windows 10(或类似系统)上,还有一个需要注意的问题,那就是网络适配器的绑定顺序。局域网或无线适配器上现有的DNS服务器设置可能会优先于隧道接口的DNS服务器设置,因此即使从OpenVPN的角度来看一切都设置正确,Windows仍然会继续使用原始的DNS服务器。
您可以按照这篇微软论坛帖子中的描述来解决这个问题。

https://social.technet.microsoft.com/Forums/windowsserver/en-US/1cc5b647-6e51-482b-8998-ac5c3900938c/how-to-force-vpn-clients-to-use-the-dnsserver-from-their-vpn-adapter-not-the-dnsserver-from-their?forum=winserverNIS


not an answer to the question - pim