iptablesルールはインターネットアクセスのブロックを解除し、3600秒後に再度ブロックします。

iptablesルールはインターネットアクセスのブロックを解除し、3600秒後に再度ブロックします。

私は息子の端末から時々インターネットにアクセスできるようにするためにこれを行います(デフォルトでは無効になっています)。

./unblockinternet.sh
<enter password>

次のスクリプトを使用してください。

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

1時間後にネットワークを自動的に再ブロックするにはどうすればよいですか?(すでに再起動後にユーザーに対して再ブロックしていますが、son3600秒後もブロックしたいと思います。)

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"

組み合わせることができますやるそしてブロックする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時間待機します。

答え2

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と、rootとして認証するように求められます。

答え3

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/0hash:net型のコレクションに追加することは不可能であるため、2つの項目が必要です。optionsを追加してタイムアウトをカスタマイズすることもできます。timeout SECONDS

IPv6を使用している場合は、フラグを使用して別のipsetを作成し、iptablesfamily inet6ルールを追加してから、ブロック解除スクリプトからセットに追加します。::/18000::/1

関連情報