我有一个 Apache 服务器,它运行正常,直到我连接到 VPN,然后所有与服务器的连接都超时。
现在据我了解,问题是tun0
成为默认输出接口,因此 apache 对如何发送数据包感到困惑,所以我尝试使用控制组修复它,通过标记从 apache 发出的数据包并重定向它们,eth0
如本文所述SU 答案,但是当我将 Ubuntu 操作系统升级到版本 16.04 后,它就不再起作用了。这是我的网络图:
这是我的网络详细信息:
me@mypc:~$ ip route list
0.0.0.0/1 via 10.132.1.5 dev tun0
default via 192.168.0.1 dev eth0 proto static metric 100
10.132.1.1 via 10.132.1.5 dev tun0
10.132.1.5 dev tun0 proto kernel scope link src 10.132.1.6
123.4.5.6 via 192.168.0.1 dev eth0
234.5.6.7 via 192.168.0.1 dev eth0
128.0.0.0/1 via 10.132.1.5 dev tun0
169.254.0.0/16 dev eth0 scope link metric 1000
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.6 metric 100
me@mypc:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:cc:a9:b3:c9:41
inet addr:192.168.0.6 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:864897 errors:0 dropped:0 overruns:0 frame:0
TX packets:467142 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1088053099 (1.0 GB) TX bytes:220201868 (220.2 MB)
Interrupt:17
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
...
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.132.1.6 P-t-P:10.132.1.5 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:46622 errors:0 dropped:0 overruns:0 frame:0
TX packets:14950 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:60587170 (60.5 MB) TX bytes:1396546 (1.3 MB)
我做了进一步的测试,发现如果我添加这个路由规则:
sudo route add -host 123.4.5.6 gw 192.168.0.1
我能够使用路由器 IP 从连接到路由器的设备连接到服务器,123.4.5.6
但不能从任何其他 IP 地址连接到服务器。
在 apache 上设置控制组并尝试以下命令后:
sudo cgexec -g net_cls:novpn wget http://www.whatsmyip.org/
并检查下载的网页中的 IP,它是我的路由器 IP 123.4.5.6
,而不是我的 VPN IP 10.132.1.6
。
因此,我猜测控制组解决方案可以以某种方式起作用,但不适用于 apache,并且 apache 成功接收了传入的数据包,但没有发出任何数据包。
我如何配置 apache 来使用eth0
输出数据包而不是tun0
?
答案1
因此,您需要两个默认网关;然后使用路由规则来实现:
1)向 eth0 添加一个辅助 IP - 即 192.168.1.7,然后重新启动 apache(听起来您的配置是这样的,listen 0.0.0.0:80
因此您只需要重新启动 apache 就可以让它监听新的 IP。
2)更改路由器上的 Nat 规则以将流量转发到此 IP:
3)在辅助路由表中创建一个新的默认路由,将该表命名为“apache”:
echo "1 apache" >> /etc/iproute2/rt_tables
4) 通过本地路由器向该表添加默认路由。
ip route add default via 192.168.0.1 dev eth0 table apache
5)最后,您需要一条规则来定义哪些流量应该使用 apache 路由表。
ip rule add from 192.168.0.7 table apache
192.168.0.7 是辅助 IP,Apache 是唯一使用它的进程,此规则应仅匹配离开 Apache 以响应 Web 请求的流量。这将确保只有该特定流量将使用新的路由表,并且不会干扰您的 VPN 流量或其当前的路由行为。
请注意,ip
命令在重启后不会保留。要使它们保留,请将它们添加到您的接口脚本中,以便在每次笔记本电脑重启时运行。
PS:保留我的旧答案并将其作为新答案,因为这是一个非常不同的解决方案。
答案2
管理 2 条默认路由并让一些流量通过一条路由,一些流量通过另一条路由是一件非常麻烦的事情,我建议您尽可能避免这种情况。如果您不想通过 VPN 访问互联网,那么您的设置可以大大简化,从而解决问题。您真的需要通过 VPN 访问互联网吗?另外,10.132.1.5 的意义何在?我不明白为什么您要使用它来路由到 10.132.1.x 中的其他主机?您在该子网 10.132.1.x 中已经有一个 IP,应该可以直接连接。
因此,如果您不想通过 VPN 访问互联网,并且不需要通过 10.32.1.5 进行路由,您可以将路由表简化为:
default via 192.168.0.1 dev eth0 proto static metric 100
10.132.1.0/24 dev tun0 proto kernel scope link src 10.132.1.6
169.254.0.0/16 dev eth0 scope link metric 1000
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.6 metric 100
这也将解决 Apache 问题。为什么只有这些路线?首先:
10.132.1.0/24 dev tun0 proto kernel scope link src 10.132.1.6
应该是到达 VPN 另一端所有主机所需的唯一路由。由于此路由匹配 10.232.1.0 - 10.232.1.254,如果 VPN 网络上有其他 10.xxx 地址,您可以将路由扩展至 10.0.0.0/8 如果您不明白 /8 /24 位的含义,我强烈建议您阅读IP后面的“斜线”是什么?或者谷歌搜索“CIDR 表示法”。将使 /32 /1 位更有意义。
这些旧路由组合在一起定义了您通过 VPN 的默认路由
0.0.0.0/1 via 10.132.1.5 dev tun0
128.0.0.0/1 via 10.132.1.5 dev tun0
将其分成两条路线(一条用于互联网的前半部分,第二条覆盖其余部分)意味着它们具有更高的优先级,因为它们比默认路线更具体:
default via 192.168.0.1 dev eth0 proto static metric 100
那么问题是您现在需要明确添加更具体的路由,以强制流量通过本地路由器(192.16.8.0.1)。
123.4.5.6 via 192.168.0.1 dev eth0
234.5.6.7 via 192.168.0.1 dev eth0
如果没有通过 VPN 的默认路由,则不需要这些路由。如果您确实需要通过 10.232.1.5 路由流量,并且需要保留一组默认路由,我建议使用路由规则而不是覆盖默认路由。路由规则更灵活,但通常的做法是将源 IP 与默认网关匹配,因此来自 VPN IP(10.1.232.6)的所有流量都会通过 VPN 默认路由,而来自本地 IP(192.168.0.6)的所有流量都会使用您的 ISP 作为默认路由。请参阅https://unix.stackexchange.com/questions/22770/two-interfaces-two-addresses-two-gateways以获得关于如何执行此操作的指南。
答案3
只需告诉 apache 监听多个 IP 地址。
我认为您会希望在您的配置中包含这些行。
Listen 192.168.0.6:80
Listen 10.132.1.6:80
这告诉 apache 在每个 IP 地址上“绑定”到端口 80。如果您使用虚拟主机,您还必须将这些行添加到其配置中。
边注
如果您没有使用,我建议在eth0
VPN 服务器上使用静态 IP。
如果您无法在 VPN 上配置静态 IP,您可以采取一些变通方法。一种方法是Listen
连接到 VPN 后生成相关条目。或者,也许有一个使用主机名的干净解决方案(如果您有 DNS 服务器)。