注意:我是网络新手,所以请假设我什么都不知道并相应地解释事情(或提供更多信息的链接)。
我正在尝试设置一个 OpenVPN 服务器,以便所有客户端流量(包括网络流量)都通过 VPN 路由。我正在遵循 OpenVPN HOWTO,并且已经到了“通过 VPN 路由所有客户端流量(包括网络流量)”部分 (https://openvpn.net/index.php/open-source/documentation/howto.html#redirect)。
我的设置是:
OpenVPN 服务器(私有网络 IP 10.240.233.2 上的 BeagleBone Black (BBB))连接到我家里的宽带路由器(私有网络 IP 10.240.233.1 上)。
连接到外部网络的客户端(运行 Xubuntu GNU/Linux 的笔记本电脑)。
我可以成功:
在 BBB 上启动 OpenVPN 服务器
将客户端连接到 VPN
从客户端 (10.8.0.6) Ping OpenVPN 服务器 (10.8.0.1) 并反之亦然
从客户端 ping 路由器 (10.240.233.1)
后者是通过以下方式实现的:
将以下指令添加到服务器配置文件:
push "route 10.240.233.0 255.255.255.0"
通过编辑在 OpenVPN 服务器上启用 IP 转发
/etc/sysctl.conf
(这是编辑:# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
,之后命令sudo sysctl net.ipv4.ip_forward
产生net.ipv4.ip_forward = 1
)使用以下命令启用 tun 转发(来自本指南:https://nikinuryadin.wordpress.com/2010/04/16/step-by-step-setting-up-openvpn-in-debian-with-routing-tun-connection/):
sudo iptables -A INPUT -i tun+ -j ACCEPT
和sudo iptables -A FORWARD -i tun+ -j ACCEPT
现在对于重定向位...
我在服务器配置文件中添加了以下指令(来自 OpenVPN HOWTO):
push "redirect-gateway def1"
push "dhcp-option DNS 10.240.233.1"
注意:推送的 DNS IP 是我的宽带路由器的 IP,连接到 VPN 时我可以从客户端成功 ping 通该 IP,并且服务器将其报告为其名称服务器(cat /etc/resolv.conf
在服务器上产生nameserver 10.240.233.1
)
然后我使用以下命令将 VPN 客户端流量 NAT 到互联网(来自 OpenVPN HOWTO):
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
(是的,服务器报告我从 OpenVPN 服务器到宽带路由器的连接为eth0
(使用ifconfig
))
最后,我执行了以下命令来保存 iptables 并重新启动 VPN(来自上面链接的 Niki Nuryadin):
sudo iptables-save
sudo /etc/init.d/networking restart
sudo /etc/init.d/openvpn restart
我可以从 OpenVPN 服务器成功 ping 通 www.google.com 和 www.bbc.co.uk。(当然,在未连接到 VPN 时,我也可以从笔记本电脑 ping 通它们!)但是,连接到 VPN 后,我无法从客户端 ping 通这些网站。
通常情况下,如果你尝试 ping 某个不可用的东西(例如ping 192.168.7.2
),你会得到如下结果:
PING 192.168.7.2 (192.168.7.2) 56(84) bytes of data.
然后它就挂了。但是,在这种情况下,当客户端连接到 OpenVPN 服务器并且我尝试 ping Google 或 BBC 时,我根本没有得到任何输出。
我在 serverfault.com 或其他地方都找不到答案。我唯一的线索是 OpenVPN HOWTO 说:
[使用 `push "dhcp-option DNS 10.240.233.1"] 将配置 Windows 客户端(或非 Windows 客户端使用一些额外的服务器端脚本) 使用 [10.240.233.1] 作为其 DNS 服务器。
那么,我是否需要一些额外的服务器端脚本?或者还有其他问题?
另外,一旦我可以 ping 网站并浏览互联网,我该如何检查所有流量确实经过 OpenVPN 隧道而不是像我采取这些步骤之前那样绕过它?
答案1
后来我找到了答案。这是 HOWTO 中的拼写错误。额外的脚本在客户侧面,而不是服务器边。
只需将以下内容添加到客户文件:
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
要检查所有流量是否都通过隧道,请使用traceroute
,例如
traceroute google.com
输出显示数据包到达目的地所采用的路由。您应该在 traceroute 输出中看到 VPN 网关(在我的情况下是我家里的宽带路由器)。
非常感谢 OpenVPN 社区论坛提供的帮助:http://forums.openvpn.net/viewtopic.php?f=4&t=23249&p=67315&sid=f2657d061da760b5af60aec18dcea81e#p67315