我有一个完美的Apache服务器,直到我连接到VPN,然后所有连接到服务器超时。
现在到我的理解问题是tun0成为默认的输出接口,因此Apache将混淆如何发送数据包,所以我试图解决它使用控制组通过标记数据包出去从Apache和redirect他们通过eth0像在这个真棒苏答复 ,但它不工作后,我的Ubuntu操作系统升级到16.04版本。 这是我的networking图:
这里是我的networking细节:
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 PtP: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)
我做了进一步的testing,发现如果我添加这个路由规则:
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而不是我的IP VPN 10.132.1.6 。
所以我想控制组的解决scheme工作,但不是与Apache和传入的数据包正在接收成功的Apache,但没有什么是出去的。
我怎样才能configurationApache使用eth0输出数据包,而不是tun0 ?
所以你需要两个默认的网关; 那么做到这一点的方式是与路线规则:
1)添加一个辅助IP到eth0 – 即192.168.1.7,然后重新启动apache(听起来像你的configuration是listen 0.0.0.0:80所以你只需要重新启动apache来让它监听新的IP。
2)更改您的路由器上的NAT规则,以防止stream量到这个IP:
3)在辅助路由表中创build一个新的默认路由让名称为'apache':
echo "1 apache" >> /etc/iproute2/rt_tables
4)通过本地路由器添加一个默认路由到这个表。
ip route add default via 192.168.0.1 dev eth0 table apache
5)最后,你需要一个规则来定义哪些stream量应该使用Apache路由表。
ip rule add from 192.168.0.7 table apache
192.168.0.7是一个辅助IP,Apache是唯一使用它的进程,这个规则应该只匹配离开apache的stream量来响应web请求。 这将确保只有特定的stream量将使用新的路由表,并且不会混淆您的VPNstream量或其当前的路由行为。
请注意,重启后, ip命令不会持续。 为了使它们持久化,将它们添加到接口的脚本中,以便在每次笔记本电脑重新启动时运行。
PS离开我的旧答案,并作为一个新的答案,因为这是非常不同的解决scheme。
pipe理2个默认路由,并获得一些stream量通过一个和另一个去通过另一个是一个很大的痛苦,我会build议你避免它,如果可能的话。 如果你不想通过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如果在vpnnetworking上有其他的10.xxx地址,你可以把路由扩展到10.0.0.0/8如果你不明白/ 8/24位是什么意思,build议你阅读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
把它分成两个路由(一个用于上网,第二个用于覆盖其他networking)意味着它们具有更高的优先级,因为它们比默认路由更具体:
default via 192.168.0.1 dev eth0 proto static metric 100
现在的问题是,现在需要明确添加更具体的路由,以通过本地路由器强制stream量(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路由stream量,并且需要保留一组默认路由,我build议使用路由规则而不是覆盖默认路由。 路由规则更加灵活,但通常情况下,如何将源IP与默认网关相匹配,因此来自VPN IP(10.1.232.6)的所有stream量都将与VPN默认路由和所有来自本地IP(192.168.1)的stream量相关联。 0.6)使用你的ISP作为默认路由。 请参阅https://unix.stackexchange.com/questions/22770/two-interfaces-two-addresses-two-gateway关于如何做到这一点的指南。
我想你会想要在你的configuration中有这些行。
Listen 192.168.0.6:80 Listen 10.132.1.6:80
这告诉apache'绑定'到每个IP地址上的端口80。 如果您使用的是虚拟主机,则还必须将这些行添加到其configuration中。
如果你不使用,我build议在eth0和VPN服务器上使用静态IP。
如果您无法在VPN上configuration静态IP,则可以执行解决方法。 可以在连接到VPN后生成相关的Listen条目。 或者,也许有一个干净的解决scheme,使用主机名(如果你有一个DNS服务器)。