我在我儿子的终端上这样做,有时让他访问互联网(默认情况下禁用):
./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
到该集合中。