我有一台运行 Linux Mint 12 的服务器,我想一直连接到 PPTP VPN。VPN 服务器非常可靠,但有时会掉线,所以我只想让它在 VPN 连接断开时禁用所有互联网活动。
我还想找出一种自动重启它的方法,但这不是什么大问题,因为这种情况很少发生。
我还希望始终能够从我的局域网连接到盒子,无论 VPN 是否启动。
这是正确连接 VPN 后我的 ifconfig 的样子:
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 P-t-P: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 规则不允许流量流向 VPN 服务器,因此无法建立 VPN。
OUTPUT
在最终规则之前的链中需要以下规则DROP
,其中 1.2.3.4 是 VPN 服务器的 IP 地址。这些允许 TCP 连接到端口 1723(PPTP 控制通道)和 GRE 数据包(数据通道)。有两种方法,基于路由和基于防火墙。
路由方式
未连接到 VPN 的机器的典型路由表如下所示:
第一条路由到 LAN 上的主机,第二条路由将其他所有内容发送到默认网关。当连接到 VPN 时,路由表看起来像这样(其中 1.2.3.4 是 VPN 服务器的公共 IP,10.8.0.1 是 VPN 服务器的私有 IP):
第一条路由相同,第三条路由通过 VPN 发送所有内容。但是请注意第二条规则:它表示要到达 VPN 服务器的公共 IP 数据包应该通过默认网关发送。这是为了让 VPN 客户端创建的隧道数据包真正到达服务器;如果这条路由没有到位,VPN 客户端创建的数据包将再次通过 VPN 发送,并且永远不会到达服务器。
现在,如果删除了第三条路由,那么发往 Internet 上除 VPN 服务器之外的任何地方的数据包将没有匹配的路由,因此主机永远不会将它们发送出去。因此我们希望在未连接 VPN 时路由表如下所示:
LAN 上的主机仍然可以访问,VPN 服务器仍然可以访问(因为我们需要能够启动 VPN),但是其他一切都不会被路由出去。虽然获得此设置可能有点棘手,特别是如果您使用的是 DHCP。但是,Debian 上的静态配置将涉及以下内容
/etc/network/interfaces
:请注意,没有
gateway
声明,因为这是安装默认路由的内容。这种方法的缺点是仍然允许未加密的非 VPN 流量流向 VPN 服务器。如果您在 VPN 服务器上运行其他服务并且需要确保它们受到保护,那么您将不得不使用防火墙方法。
编辑:@JamesRyan 建议这种方法很脆弱,因为可能会自动或意外添加默认路由。另一种方法是添加一条黑洞路由,它将流量发送到某个地方,而该路由不会进一步路由它。但是,这不适用于自动添加的默认路由,因为它已经使用了最高优先级度量标准 0。默认路由仍需要删除,但可以添加如下内容。
防火墙方式
这里的想法是阻止物理接口上的所有传出流量,除了 VPN 客户端创建的隧道流量和发往 LAN 的流量。允许 VPN 的流量取决于所使用的协议。PPTP 使用 TCP 端口 1723 作为控制通道,使用GRE作为实际隧道。OpenVPN 使用 UDP 端口 1194。防火墙规则如下所示:
第一条规则接受 LAN 的流量。第二条和第三条规则接受到 VPN 服务器的 VPN 流量。第四个规则拒绝离开物理接口的所有其他流量。
如果您使用不在 LAN 上的 DNS 服务器,您可能需要接受的另一件事是 DNS,因为 VPN 客户端可能需要执行 DNS 查找才能找到 VPN 服务器。在 之前插入的以下规则
REJECT
将允许 DNS 流量流向 Google 的公共 DNS 服务。添加另一个具有更高度量值的默认路由指向空接口。当 VPN 不可用时,第二条路由将启动并黑掉流量
这不是一个 iptables 问题——你不需要 iptables。
只需将默认路由设置为通过 VPN,就大功告成了。
当 VPN 关闭时,您还可以添加另一个使用更差指标的默认路由。您的 LAN 是直接连接的,因此它优先于默认网关。