我有一个 OpenVPN 客户端运行在我的服务器上,该客户端在其他国家/地区的远程网络上获取公共 IP。客户端配置如下:
dev tap
remote a.b.30.7
float a.b.30.7
port 5167
ifconfig a.b.28.178 255.255.255.128
route-gateway a.b.28.129
#redirect-gateway def1
secret woot.key
cipher AES-128-CBC
dhcp-option DNS a.b.8.8
重定向网关被注释掉,这样我的服务器(运行 openvpn 客户端)就不会被 VPN 连接“接管”。我可以将服务绑定到 tap0 接口(即 httpd 等),并在另一个国家/地区通过此 IP 运行网站。运行 openVPN 客户端的服务器所在的 ISP 没有设置出口过滤,因此 VPN 的流量可以直接通过另一个国家/地区的公共 IP 的 eth0 默认网关出去。只有入站流量通过 VPN 路由(即传入的 httpd 请求),但出站流量通过 VPN 公共 IP 欺骗的 eth0 出去。没有任何摆弄路由或 iptables,这在 DEBIAN 服务器上完全没有问题。明显的好处是,我拥有常规 eth0 接口的速度和路由,但 IP 位于不同的国家/地区。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
x.y.150.64 0.0.0.0 255.255.255.224 U 0 0 0 eth0
a.b.28.128 0.0.0.0 255.255.255.128 U 0 0 0 tap0
0.0.0.0 x.y.150.65 0.0.0.0 UG 0 0 0 eth0
xy 是实际服务器的网络,ab 是远程 openvpn 网络。
问题是什么?完全相同的操作在 Ubuntu 中不起作用,我不知道为什么。我在无数 Debian 服务器上执行过此操作,没有任何问题,而且绝对没有自定义路由或任何类型的 iptables 规则。两台服务器都没有运行防火墙。我相信这是一个非常基本的问题,或者 Ubuntu 发生了某种奇怪的事情。值得注意的是,如果我取消注释重定向网关(应该如此),VPN 确实可以在 Ubuntu 服务器上工作,但这不是我想要的。我仍然需要从服务器的主接口 eth0 访问它。
Debian 服务器跟踪(工作中):
# traceroute -i tap0 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 40 byte packets
1 blah (a.b.29.1) 39.161 ms 39.140 ms 39.332 ms
2 asdf (a.b.30.1) 40.870 ms 40.879 ms 40.850 ms
3 sth-sbb2-ank35-1-ge26-100.dcs.net (217.78.35.5) 40.816 ms 40.818 ms 40.783 ms
4 google-gw.dcs.net (217.78.35.14) 40.780 ms 40.601 ms 40.565 ms
etc. fine here.
Ubuntu 服务器跟踪(不起作用):
# traceroute -i tap0 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
borked.
8.8.8.8 是 Google 公共 DNS。
VPN IP 无法从外部世界访问。有趣的是,如果我要:
ssh -b [debian.server.openvpn.client.IP] user@[ubuntu.server.openvpn.client.IP]
我可以连接/ping/查看它。这是在 Debian 和 Ubuntu 机器上运行两个单独的 VPN 客户端,在与路由表相同的 ab 网络上(远程网络上的不同 IP)。Debian 服务器 VPN 客户端 IP 是公开可访问的,但在 Ubuntu 服务器上则不是!只能在 ab 内访问!
目标是欺骗 eth0 流量,而不是通过 VPN 将其发送回去并浪费 VPN 带宽。此外,相同的 VPN 配置将在 Debian 服务器上正常工作。我可以将 Ubuntu 机器上的 VPN 配置放到 Debian 机器上,这样就没问题了。
Debian 服务器运行 Debian 5 64 位,版本号为 2.6.32-bpo.5-xen-amd64
Ubuntu 服务器运行 Ubuntu 10.04.1 LTS,版本号为 2.6.32-24-server
我认为这可能是内核模块和 tun.ko 的问题,因为我在 Ubuntu 服务器上使用 modprobe -l 没有看到它,但在 debian 服务器上却看到了。请参阅https://bugs.launchpad.net/ubuntu/+source/linux/+bug/565856如果感兴趣的话。我尝试了各种解决方法,但无济于事。我想是别的原因。
任何帮助都非常感谢!我很抱歉在必要的地方没有适当的网络术语,我只具备中级网络知识,而且由于这在 debian 中对我来说很轻松,所以不需要做任何特别的事情。
答案1
我必须承认,我(目前)还不完全理解您想要实现的目标。但我认为您希望您的 Ubuntu(和 Debian)服务器可以通过您通过 OpenVPN 获得的 IP(传入流量)访问,但通过您(Ubuntu)服务器本地的 eth0 接口发送您自己的(= Ubuntu 服务器)流量(“欺骗”)VPN-IP。或者沿着这些思路。我不确定这是否是一个很好的主意(可能取决于您这样做的原因),但我认为这是有原因的,正如您所说,它确实适用于 Debian。所以我们不要详细阐述这一点(尽管以后它可能仍然很重要)。
我还想知道为什么
route-gateway a.b.28.129
包含在您的 VPN 配置中似乎不会导致您的路由表中出现条目。
另外,我不确定您展示的两个跟踪路由的目标/见解是什么...您似乎试图8.8.8.8
通过 VPN 隧道进行跟踪路由。因为这是传出流量 我不太明白它与你的问题有什么关系。而且我会说(查看你的路由表)你以这种方式生成的流量不会(不应该?)通过隧道。我看到 Debian 上的情况似乎就是这样……但我不明白为什么会这样。查看路由表,我宁愿假设你尝试发送的 traceroute 包tap0
(应该?)“重新路由”到eth0
(默认路由)。
现在,这让我想到了针对你的问题的猜测:IP 转发。可能是您的 Debian 机器启用了该功能,而 Ubuntu 禁用了该功能?您可以通过访问上述链接(或使用您最喜欢的搜索引擎或 Ubuntu 手册)找到更多信息(例如,如何确定 IP 转发是否已启用)。
你能在 Ubuntu 上访问 SSH 守护进程,说明你已经非常接近了 :)。因此,了解你所说的
“Debian 服务器 VPN 客户端 IP 是可公开访问的,但 Ubuntu 服务器上却不能!”
当 Ubuntu 计算机“无法访问”时,您尝试做什么(即尝试连接什么服务)?访问其 Web 服务器?此服务正在监听哪个 IP?
答案2
Ubuntu 可能对反向路径过滤有不同的默认设置。请查看rp_filter
中的各种设置/proc/sys/net/ipv4/conf/...
。
如果这没有帮助,下一步是使用 tcpdump 或 wireshark 确认数据包是否进出。同时确认您确实没有防火墙iptables -vL
。
答案3
检查 rp_filering 是否处于活动状态
sysctl -a | grep \\.rp_filter
查找 = 1 的接口
编辑 /etc/sysctl.conf,并设置
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
这里有一个关于它的好网页 http://www.tolaris.com/2009/07/13/disabling-reverse-path-filtering-in-complex-networks/