强制通过VPN上网,VPN断线就断网

渗透测试最忌VPN不稳定,扫描器或sqlmap之类的正开着跑,突然VPN就断了,立马会暴露本地真实IP地址,隔两天你就会收到顺丰快递。。。

要解决这种麻烦情况,最好是设置所有流量只能通过VPN出去,一旦VPN断线流量无法通过本地网络出去。经过测试,利用系统自带的防火墙就可以达到这个目的,Windows用自带的防火墙即可,Linux可使用iptables进行设置。

Windows防火墙设置

需要分三步对防火墙进行设置:

  1. 默认阻止所有出口流量
  2. 在本地连接上设置允许通向VPN服务器的出口流量
  3. 允许所有流量通过vpn链接出去

阻止所有出口流量

首先打开防火墙高级设置,选择左侧菜单防火墙设置,右键 -> 属性,分别在Domain、Private、Public三个tab页中,设置出站连接(Outbound Connections)为禁止(Block)。这样会默认阻止所有出站流量。

NJLvB_win-firewall-1.png

允许通向VPN服务器的流量

出站规则(Outbound Rules)点击右键,新建规则,规则类型选择自定义

mKqNr_win-firewall-2.png

程序、协议和端口选项不需要修改,直接点一下步,到Scope页,远程IP地址中选择新增IP地址,将VPN服务器的IP地址加入:

HcVUm_win-firewall-3.png

添加VPN服务器后,下一步到Action,选择允许连接

AIgpm_win-firewall-4.png

后面不需要修改什么东西,最后添加一个名字即可,我这里命名为Allow traffic to vpn server

允许流量通过vpn链接出去

与上一步类似,新建出站规则,在Scope页面,IP地址设置保持默认不变。然后Interface types选择自定义:

xftJP_win-firewall-5.png

在interface types中,选择Remote access,这是VPN链接的类型,这里表示所有通过VPN链接的流量都放行。

lbNUR_win-firewall-6.png

后面Action也选择Allow the connection

AIgpm_win-firewall-4.png

后面设置保持默认,最后添加一个名字即可,我这里命名为Allow traffic through VPN

Linux iptables设置

与windows原理一样,也是分三部:

允许通向VPN服务器的流量

1
2
iptables -A OUTPUT -d 14.14.14.14 -j ACCEPT
iptables -A OUTPUT -d 14.14.14.15 -j ACCEPT

14.14.14.14和14.14.14.15即为VPN服务器的地址

允许流量通过vpn链接出去

1
iptables -A OUTPUT -o ppp0 -j ACCEPT

其中ppp0为VPN拨号成功后,新建的本地虚拟网卡,我测试用的l2tp协议,如果是其他协议,名字可能不同,可能是tun0

阻止所有出口流量

1
iptables -A OUTPUT -j DROP

禁止所有出口流量

综合起来iptables命令即为:

1
2
3
4
5
6
iptables -F
iptables -X
iptables -A OUTPUT -d 14.14.14.14 -j ACCEPT
iptables -A OUTPUT -d 14.14.14.15 -j ACCEPT
iptables -A OUTPUT -o ppp0 -j ACCEPT
iptables -A OUTPUT -j DROP

结语

这样设置后,不连VPN本地所有流量都不能出去,连接VPN是可以成功的,VPN连接成功后所有流量可以走VPN出去,可以正常上网。而且就算VPN突然断线,也不会有本地流量泄露。