iptables 规则解除互联网访问阻止,3600 秒后再次阻止

iptables 规则解除互联网访问阻止,3600 秒后再次阻止

我在我儿子的终端上这样做,有时让他访问互联网(默认情况下禁用):

./unblockinternet.sh
<enter password>

用这个脚本:

su -c "iptables -D OUTPUT -m owner --uid-owner son -j REJECT"

如何让它自动再次阻止网络,比如 1 小时后?(它已经在重新启动后再次为用户阻止它son,但我也想在 3600 秒后阻止它)

更准确地说,如何添加一个定时器在su -c "iptables -A OUTPUT -m owner --uid-owner son -j REJECT"3600秒后执行,而无需此时输入密码?显然我不会恰恰3600 秒后,他的终端出现了。

答案1

你可以使用at:

sudo at next hour -f myiptablesscript

哪里myiptablescript有禁用访问的命令,或者在一行上,例如

sudo at next hour -f /dev/stdin <<< "iptables -A OUTPUT -m owner --uid-owner son -j REJECT"

你可以结合解锁阻塞写成两行脚本:

#!/bin/bash
iptables -D OUTPUT -m owner --uid-owner son -j REJECT
at next hour -f /dev/stdin <<< "iptables -A OUTPUT -m owner --uid-owner son -j REJECT"

如果将此脚本保存为unblockinternet具有执行权限,则可以将其调用为

sudo ./unblockinternet

这将立即删除阻止规则;并排队一小时后恢复。

答案2

如果你有 systemd,你可以写一个小的 Unit 文件,比如/etc/systemd/system/unblockinternet.service持有

[Unit]
Description=unblock internet 1 hour
[Service]
Type=simple
ExecStartPre=/usr/sbin/iptables ...
ExecStart=/usr/bin/sleep 3600
ExecStop=/usr/bin/iptables ...

要启动它,请输入它systemctl restart unblockinternet,它会要求您以 root 身份进行身份验证。

答案3

您还可以使用 ipset。这稍微复杂一些,但是超时将完全由内核处理。优点之一是您可以更新超时,而不必担心取消任何排队的命令。

创建该集并添加相应的 iptables 规则:

ipset create son_allowed hash:net timeout 3600
iptables -A OUTPUT -m owner --uid-owner son -m set --match-set son_allowed dst -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner son -j REJECT

解除阻止脚本现在只需将所有 IP 添加到集合中:

ipset add son_allowed 0.0.0.0/1 -exist
ipset add son_allowed 128.0.0.0/1 -exist

(注意:遗憾的是0.0.0.0/0无法添加到 hash:net 类型的集合中,因此需要两个条目。您还可以通过添加选项来自定义超时timeout SECONDS。)

如果您使用 IPv6,请使用 flag 创建另一个 ipset family inet6,为其添加 iptables 规则,然后在取消阻止脚本中将::/1和添加8000::/1到该集合中。

相关内容