在 OpenWRT 中使用 Iptables 按天和小时阻止网站

在 OpenWRT 中使用 Iptables 按天和小时阻止网站

我想除了晚上以外全天屏蔽 Facebook。我想在我的基于 Linux 的路由器 OpenWRT 中实现它。我需要修改的存档是 /etc/firewall.user (或者至少我是这么认为的),我需要添加的命令类似于

iptables RULE -m time --timestart TIME --timestop TIME --days DAYS -j ACTION

其中规则应该类似于您用来阻止 Facebook 或任何其他网站的正常规则

iptables -t nat -I INPUT --sport 443 -m string \ --string www.facebook.com --algo bm -j REJECT

但出于某种原因,我仍然能够访问 Facebook。你有什么想法吗?我是否写错了一些命令?我添加的代码是:

iptables -t nat -I INPUT --sport 443 -m string \ --string www.facebook.com --algo bm -m time --timestart 1:00 --timestop 20:00 --days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j REJECT

而且它不起作用......

通常,为了阻止网站,我使用 OpenDNS,但有了它,我就不能允许人们在一天中的特定时间访问 Facebook,所以使用它不是一个好的选择。我真的很感激任何建议。预先感谢您费心阅读我的问题

答案1

您可能正在尝试使用本地时钟和内核,在使用timeiptables 模块时,假设日期和时间以 UTC 格式给出。

引用我的iptables手册页-m time

   time
       This matches if the packet arrival time/date is within a given range.
       All options are optional, but are ANDed when specified. All times are
       interpreted as UTC by default.

答案2

您可以创建一些 .sh 脚本,这些脚本将使用 crontab 执行。在 crontab 中:

00 9 * * *  /somedir/blockfun.sh
00 18 * * * /somedir/unblockfun.sh

并添加到 blockfun.sh 中,如下所示: iptables -A INPUT -m string --string "facebook.com" --algo kmp --to 65535 -j DROP,或者您希望如何阻止 URL

当然,在 unblock.sh 中删除此规则

答案3

我想你指的是当涉及到实际阻止 Facebook 时的问题。

有两件事没有在那里讨论。

  1. 假设每个发往 Facebook 的数据包都包含字符串 的可能性不大www.facebook.com。请注意,在链接的问题中仅facebook.com使用字符串。这不是最强的方法,但这似乎是公众可以接受的阻止 Facebook 的方法,所以你可以这样做。

  2. 解析您的规则未阻止的域名后,您的计算机将继续打开与 Facebook 的 TCP 连接。 TCP 握手不包含该字符串www.facebook.com,因此您的规则不会阻止这种情况。毕竟,流量只是被-m state --state related,established -j ACCEPT您很可能拥有的某些规则所接受。

    下面的截图显示了我的(默认)OpenWRT 过滤表,您可以在其中清楚地看到,对于任何链,第二条规则就是提到的related,established规则。与成功的 TCP 握手相结合,您的规则永远不会针对进出 Facebook 的任何数据流量进行评估。

    您必须在此 generic 之前注入您的规则-j ACCEPT

    过滤器表的 OpenWRT INPUT、FORWARD 和 OUTPUT 链

答案4

根据您的示例和一些谷歌搜索,这最终对我有用:

for website in facebook.com youtube.com; do

iptables -I FORWARD -p tcp --dport 80 -m string --string "$website"  --algo bm  -m time --timestart 00:00 --timestop 17:30 -j REJECT
iptables -I FORWARD -p tcp --dport 443 -m string --string "$website"  --algo bm  -m time --timestart 00:00 --timestop 17:30 -j REJECT

iptables -I FORWARD -p tcp --dport 80 -m string --string "$website"  --algo bm  -m time --timestart 18:30 --timestop 23:59 -j REJECT
iptables -I FORWARD -p tcp --dport 443 -m string --string "$website"  --algo bm  -m time --timestart 18:30 --timestop 23:59 -j REJECT

done

@Delfin 的建议存在一些问题:

  • 我的 openwrt 中没有安装一些 iptables 模块

    opkg 更新; opkg 安装 iptables-mod-filter

  • 使用 *filter 而不是 *nat 否则它会抱怨:(省略 -t nat 将规则直接放入 *filter 中)

The "nat" table is not intended for filtering, the use of DROP is therefore inhibited
  • 使用 FORWARD 代替 INPUT 队列

相关内容