OpenWRT利用iptables禁用URL

1. 背景

工作期间难免手贱,点开一些视频网站什么的,还有bt下载网站什么的,这很影响效率,为了避免这种现象,决定在OpenWRT的iptables上做点文章。


2. 实现步骤

设计思路

  • iptables有filter模块,添加的iptables条目,可以对关键字匹配的URL进行过滤
  • 若需要过滤的URL比较多,因此添加iptables的条目也会一样多,这样可能会影响正常的上网,因此考虑使用ipset配置iptables进行过滤
  • 利用Linux的定时任务进行开关,工作日期间进行限制访问,周末不限制访问。(考虑过使用iptables 的定时功能,但是--days选项无法识别)

软件安装

缺省情况下,OpenWRT没有安装相关的模块,ipset模块生效需要重启路由器。

1
2
3
4
opkg remove dnsmasq
opkg install dnsmasq-full
opkg install ipset
opkg install iptables-mod-filter

IPv4 URL禁用

修改/etc/dnsmasq.conf,最后添加conf-dir=/etc/dnsmasq.d,然后新建/etc/dnsmasq.d目录,切换到该目录并添加配置文件

1
2
3
4
echo "conf-dir=/etc/dnsmasq.d">>/etc/dnsmasq.conf
mkdir /etc/dnsmasq.d
cd /etc/dnsmasq.d
touch block.conf

创建一个ipset,禁用URL接触出的IP地址存储在该ipset中。鉴于ipset保存在内存中,所在在开机启动脚本/etc/rc.local也加入ipset创建的命令。

1
ipset -N block iphash

添加需要禁用的URL到/etc/dnsmasq.d/block.conf,例如如下。添加其他URL格式类似。

1
2
3
4
server=/youku.com/127.0.0.1#53
ipset=/youku.com/block
server=/baidu.com/127.0.0.1#53
ipset=/baidu.com/block

修改完毕后,重启dnsmasq服务,配置文件生效

1
/etc/init.d/dnsmasq restart

禁止转发ipset中匹配的IPv4。执行动作REJECT,如果为DROP终端还会发包,增加路由器处理负担。

1
iptables -I FORWARD -m set --match-set block dst -j REJECT

IPv6 URL禁用

ipset不支持IPv6,因此只能通过ip6tables禁用URL了,例如如下

1
2
3
ip6tables -I FORWARD -m string --string "youtube.com" --algo kmp -j REJECT
ip6tables -I FORWARD -m string --string "neu6.edu.cn" --algo kmp -j REJECT
ip6tables -I FORWARD -m string --string "byr.cn" --algo kmp -j REJECT

时间段设置

将相关的命令写入一个脚本中,脚本一定要添加执行权限!然后利用Linux的定时任务执行,禁用URL脚本如下

/root/Scripts/blockURL.sh

1
2
3
4
5
6
7
8
#!/bin/sh
##IPv4
iptables -I FORWARD -m set --match-set block dst -p tcp --dport 80 -j REJECT

##IPv6
ip6tables -I FORWARD -m string --string "youtube.com" --algo kmp -j REJECT
ip6tables -I FORWARD -m string --string "neu6.edu.cn" --algo kmp -j REJECT
ip6tables -I FORWARD -m string --string "byr.cn" --algo kmp -j REJECT

解除禁用URL脚本如下

/root/Scripts/unblockURL.sh

1
2
3
4
5
6
7
8
#!/bin/sh
##IPv4
iptables -D FORWARD -m set --match-set block dst -p tcp --dport 80 -j REJECT

##IPv6
ip6tables -D FORWARD -m string --string "youtube.com" --algo kmp -j REJECT
ip6tables -D FORWARD -m string --string "neu6.edu.cn" --algo kmp -j REJECT
ip6tables -D FORWARD -m string --string "byr.cn" --algo kmp -j REJECT

定时任务,周一到周五的9点启动URL禁用脚本,18点启动解除URL禁用脚本

1
2
3
##block
0 9 * * 1-5 sh /root/Scripts/blockURL.sh
0 18 * * 1-5 sh /root/Scripts/unblockURL.sh

3. 拓展

  • IPv6是否可以使用ipset?
  • 使用iptables的时间模块进行限制

4. 参考