我想除了晚上以外全天屏蔽 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
您可能正在尝试使用本地时钟和内核,在使用time
iptables 模块时,假设日期和时间以 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 时的问题。
有两件事没有在那里讨论。
假设每个发往 Facebook 的数据包都包含字符串 的可能性不大
www.facebook.com
。请注意,在链接的问题中仅facebook.com
使用字符串。这不是最强的方法,但这似乎是公众可以接受的阻止 Facebook 的方法,所以你可以这样做。解析您的规则未阻止的域名后,您的计算机将继续打开与 Facebook 的 TCP 连接。 TCP 握手不包含该字符串
www.facebook.com
,因此您的规则不会阻止这种情况。毕竟,流量只是被-m state --state related,established -j ACCEPT
您很可能拥有的某些规则所接受。下面的截图显示了我的(默认)OpenWRT 过滤表,您可以在其中清楚地看到,对于任何链,第二条规则就是提到的
related,established
规则。与成功的 TCP 握手相结合,您的规则永远不会针对进出 Facebook 的任何数据流量进行评估。您必须在此 generic 之前注入您的规则
-j ACCEPT
。
答案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 队列