web-dev-qa-db-ja.com

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秒後にタイマーを追加する方法は?明らかに私は彼の端末で正確に正確にいないでしょう。

4
Basj

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"

unblockingblockingを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時間後に発生する復元をキューに入れます。

5
user4556274

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と入力します。ルートとして認証するように求められます。

4
meuh

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ルールを追加して、ブロック解除スクリプトで::/18000::/1をセットに追加します。

0
nomadictype