我有一台运行Linux Mint 12的服务器,我希望始终保持与PPTP VPN的连接。 VPN服务器是非常可靠的,但它有时会下降,所以我只是想这样做,所以所有的互联网活动被禁用,如果VPN连接中断。
我也想找出一种方法来自动重新启动,但这不是一个大问题,因为这种情况很less发生。
我也想永远能够连接到我的局域网的盒子,不pipeVPN是否启动。
以下是我的ifconfig在正确连接VPN时的样子:
eth0 Link encap:Ethernet HWaddr 00:22:15:21:59:9a inet addr:192.168.0.171 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::222:15ff:fe21:599a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:37389 errors:0 dropped:0 overruns:0 frame:0 TX packets:29028 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:37781384 (37.7 MB) TX bytes:19281394 (19.2 MB) Interrupt:41 Base address:0x8000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1446 errors:0 dropped:0 overruns:0 frame:0 TX packets:1446 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:472178 (472.1 KB) TX bytes:472178 (472.1 KB) tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.10.11.10 PtP:10.10.11.9 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:14 errors:0 dropped:0 overruns:0 frame:0 TX packets:23 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:1368 (1.3 KB) TX bytes:1812 (1.8 KB)
这是我在其他地方发现的一个iptables脚本,似乎是为了解决这个问题,但是它阻止了所有的访问,但是我不确定我需要改变什么:
#!/bin/bash #Set variables IPT=/sbin/iptables VPN=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.` LAN=192.168.0.0/24 #Flush rules $IPT -F $IPT -X #Default policies and define chains $IPT -P OUTPUT DROP $IPT -P INPUT DROP $IPT -P FORWARD DROP #Allow input from LAN and tun0 ONLY $IPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT $IPT -A INPUT -i lo -j ACCEPT $IPT -A INPUT -i tun0 -m conntrack --ctstate NEW -j ACCEPT $IPT -A INPUT -s $LAN -m conntrack --ctstate NEW -j ACCEPT $IPT -A INPUT -j DROP #Allow output from lo and tun0 ONLY $IPT -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT $IPT -A OUTPUT -o tun0 -m conntrack --ctstate NEW -j ACCEPT $IPT -A OUTPUT -d $VPN -m conntrack --ctstate NEW -j ACCEPT $IPT -A OUTPUT -j DROP exit 0
谢谢你的帮助。
这些iptables规则不允许stream量到VPN服务器,所以VPN不能build立。 在最终的DROP规则之前,在OUTPUT链中需要以下规则,其中1.2.3.4是VPN服务器的IP地址。 这些允许TCP连接到端口1723(PPTP控制通道)和GRE数据包(数据通道)。
iptables --append OUTPUT --destination 1.2.3.4 --protocol tcp --dport 1723 --jump ACCEPT iptables --append OUTPUT --destination 1.2.3.4 --protocol gre --jump ACCEPT
有两种方法,基于路由和基于防火墙。
未连接到VPN的机器的典型路由表如下所示:
10.23.11.0/24 dev eth0 default via 10.23.11.1
第一条路由是在局域网上的主机,第二条路由将其他所有内容发送到默认网关。 当连接到VPN时,路由表看起来像这样(其中1.2.3.4是VPN服务器的公共IP,10.8.0.1是VPN服务器的私有IP):
10.23.11.0/24 dev eth0 1.2.3.4 via 10.23.11.1 default via 10.8.0.1
第一条路由是一样的,第三条路由是通过VPN发送的。 注意第二个规则:它说,到达VPN服务器的公共IP数据包应通过默认网关发送。 这样VPN客户端创build的隧道报文实际上到达服务器; 如果这条路由没有到位,VPN客户端创build的数据包将再次通过VPN发送,并且永远不会到达服务器。
现在,如果第三条路由被删除,那么去往VPN服务器的任何地方的数据包将不会有匹配的路由,所以主机将永远不会发送它们。 因此,当VPN没有连接时,我们希望路由表看起来像这样:
10.23.11.0/24 dev eth0 1.2.3.4 via 10.23.11.1
仍然可以到达局域网中的主机,并且仍然可以访问VPN服务器(因为我们需要能够启动VPN),但是其他一切都不会被路由出去。 获得这个设置可能有点棘手,特别是如果你使用DHCP。 Debian上的静态configuration会在/etc/network/interfaces中包含以下内容:
auto eth0 iface eth0 inet static address 10.23.11.10 netmask 255.255.255.0 up ip route add 1.2.3.4 via 10.23.11.1
请注意,没有gateway语句,因为这是安装默认路由。
这种方法的缺点是VPN服务器的非VPNstream量仍然是未encryption的。 如果您在VPN服务器上运行其他服务,并且需要确保它们受到保护,那么您将不得不使用防火墙方法。
编辑 :@JamesRyanbuild议,这种方法是脆弱的,因为可以自动或无意添加默认路由。 另一种方法是添加一个黑洞路由,这个路由会将stream量发送到某个地方,而不会进一步路由它。 但是,这将不会与自动添加的默认路由一起使用,因为它已经使用了最高优先级度量0.默认路由仍然需要删除,但是可以添加如下内容。
default via 127.255.255.255
这里的想法是除了VPN客户端创build的隧道stream量和去往LAN的stream量之外,阻止物理接口上的所有输出stream量。 允许VPN的stream量取决于使用的协议。 PPTP使用TCP端口1723作为控制通道, GRE作为实际通道。 OpenVPN使用UDP端口1194.防火墙规则如下所示:
iptables --append OUTPUT --out-interface eth0 --destination 10.23.11.0/24 --jump ACCEPT iptables --append OUTPUT --out-interface eth0 --destination 1.2.3.4 --protocol tcp --dport 1723 --jump ACCEPT iptables --append OUTPUT --out-interface eth0 --destination 1.2.3.4 --protocol gre --jump ACCEPT iptables --append OUTPUT --out-interface eth0 --jump REJECT
第一条规则接受局域网的stream量。 第二条和第三条规则接受到VPN服务器的VPNstream量。 第四条规则拒绝所有其他stream量离开物理接口。
如果您使用不在LAN上的DNS服务器,则可能需要接受的另一件事是DNS,因为VPN客户端可能需要执行DNS查找才能findVPN服务器。 在REJECT之前插入的以下规则将允许DNSstream量进入Google的公共DNS服务。
iptables --append OUTPUT --out-interface eth0 --destination 8.8.8.8 --protocol udp --dport 53 --jump ACCEPT
添加另一个具有较高度量标准的默认路由,指向空接口。 当VPN不可用的时候,第二条路线将会启动并阻止交通
这不是一个iptables queston – 你不需要iptables的。
只需设置默认路由,通过VPN,你就完成了。 当VPNclosures时,您还可以添加另一个具有更差的度量标准的默认路由。
你的局域网是直接连接的,所以它的优先级高于默认网关。