私は息子の端末からこれを行い、時々彼にインターネットアクセスを与えます(デフォルトでは無効になっています):
./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秒後にタイマーを追加する方法は?明らかに私は彼の端末で正確に正確にいないでしょう。
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"
unblockingとblockingを2行のスクリプトに組み合わせることができます:
#!/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
ブロッキングルールがすぐに削除されます。 1時間後に発生する復元をキューに入れます。
Systemdを使用している場合は、小さなユニットファイルを作成できます。たとえば、/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
と入力します。ルートとして認証するように求められます。
Ipsetを使用することもできます。これは少し複雑ですが、タイムアウトは完全にカーネルによって処理されます。 1つの利点は、キューに入れられたコマンドのキャンセルについて心配する必要なく、タイムアウトを更新できることです。
セットを作成し、対応する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のセットに追加できないため、2つのエントリが必要です。timeout SECONDS
オプションを追加して、ここでタイムアウトをカスタマイズすることもできます。)
IPv6を使用する場合は、フラグfamily inet6
を使用して別のipsetを作成し、それにiptablesルールを追加して、ブロック解除スクリプトで::/1
と8000::/1
をセットに追加します。