OpenWRTでIptablesを使用して曜日と時間でウェブサイトをブロックします。

OpenWRTでIptablesを使用して曜日と時間でウェブサイトをブロックします。

夜を除いて一日中Facebookをブロックしたいです。 LinuxベースのルーターOpenWRTに実装したいと思います。変更するアーカイブは/etc/firewall.user(または少なくとも私の考えではそう思う)で、追加するコマンドは次のとおりです。

iptables RULE -m time --timestart TIME --timestop TIME --days DAYS -j ACTION

ルールは、Facebookや他のウェブサイトをブロックするために使用する一般的なルールと似ている必要があります。

iptables -t nat -I INPUT --sport 443 -m string \ --string www.facebook.com --algo bm -j REJECT

しかし、何らかの理由でまだFacebookにアクセスできます。どんなアイデアがありますか?私はいくつかの命令を間違って書きましたか?私が追加したコードは次のとおりです。

iptables -t nat -I INPUT --sport 443 -m string \ --string www.facebook.com --algo bm -m time --timestart 1:00 --timestop 20:00 --days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j REJECT

そしてそれはうまくいきません...

通常、WebサイトをブロックするためにOpenDNSを使用しますが、これを使用すると、1日の特定の時間に人々がFacebookにアクセスすることを許可できないため、これを使用するのは良い選択ではありません。どんなアドバイスでも本当に感謝します。私の質問を読んでくれてありがとう。

答え1

timeおそらく、iptablesモジュールを使用するときに日付と時刻がUTC形式で提供されていると仮定するローカルクロックとカーネルを使用しようとしています。

私のiptablesマニュアルページを引用すると、次のようになります-m time

   time
       This matches if the packet arrival time/date is within a given range.
       All options are optional, but are ANDed when specified. All times are
       interpreted as UTC by default.

答え2

crontabを使用して実行するいくつかの.shスクリプトを作成できます。クローンタブから:

00 9 * * *  /somedir/blockfun.sh
00 18 * * * /somedir/unblockfun.sh

次のように blockfun.sh に追加するか、 iptables -A INPUT -m string --string "facebook.com" --algo kmp --to 65535 -j DROPURL をブロックする方法を追加します。

もちろん、unblock.shからこのルールを削除してください。

答え3

私の考えでは、あなたが言っていると思います。これそしてそれ実際にFacebookをブロックすると問題が発生します。

そこで議論されていない2つのことがあります。

  1. Facebookに送信されたすべてのパケットに文字列が含まれている可能性はほとんどありませんwww.facebook.com。リンクされた質問にはfacebook.com文字列のみが使用されます。これは最も強力な方法ではありませんが、公に許可されているFacebookのブロック方法のようです。

  2. ルールによってブロックされていないドメイン名を確認した後も、コンピュータはFacebookへのTCP接続を引き続き開きます。 TCPハンドシェイクにはこの文字列は含まれていないため、ルールはwww.facebook.comこれを防ぎません。結局のところ、トラフィックは-m state --state related,established -j ACCEPTあなたが持っている可能性が最も高い特定の規則によってのみ許可されます。

    以下のスクリーンショットは、私の(デフォルト)OpenWRTフィルタテーブルを示しています。ここでは、すべてのチェーンについて2番目の規則が言及されていることを明確に見ることができますrelated,established。成功したTCPハンドシェイクと組み合わせると、Facebookからの着信および発信データトラフィックのルールは評価されません。

    このジェネリックの前にルールを挿入する必要があります-j ACCEPT

    フィルタテーブル用のOpenWRT INPUT、FORWARD、およびOUTPUTチェーン

答え4

あなたの例とインターネット検索に基づいて、これが私に役立ちました。

for website in facebook.com youtube.com; do

iptables -I FORWARD -p tcp --dport 80 -m string --string "$website"  --algo bm  -m time --timestart 00:00 --timestop 17:30 -j REJECT
iptables -I FORWARD -p tcp --dport 443 -m string --string "$website"  --algo bm  -m time --timestart 00:00 --timestop 17:30 -j REJECT

iptables -I FORWARD -p tcp --dport 80 -m string --string "$website"  --algo bm  -m time --timestart 18:30 --timestop 23:59 -j REJECT
iptables -I FORWARD -p tcp --dport 443 -m string --string "$website"  --algo bm  -m time --timestart 18:30 --timestop 23:59 -j REJECT

done

@Delfinの提案にはいくつかの問題があります。

  • いくつかのiptablesモジュールが私のopenwrtにインストールされていません。

    opkgアップデート; opkg インストール iptables-mod-filter

  • *natの代わりに*filterを使用してください。それ以外の場合は、次のように文句を言います。 (ルールを*filterに直接入れるには、-t natを省略します。)

The "nat" table is not intended for filtering, the use of DROP is therefore inhibited
  • INPUTキューの代わりにFORWARDを使用してください。

関連情報