web-dev-qa-db-ja.com

OpenWRTでIptablesを使用してWebサイトを日と時間でブロックする

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

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

ルールは、Facebookやその他のWebサイトをブロックするために使用する通常のルールのようなものにする必要があります

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を使用しますが、OpenDNSを使用すると、1日の特定の時間にFacebookにアクセスすることを許可できないため、OpenDNSを使用することは適切なオプションではありません。私は本当にどんな提案も簡潔にします。事前に、そして私の質問を読むのをわざわざしてくれてありがとう

2
DieDauphin

Facebookを実際にブロックすることになると、 this および that の質問を参照していると思います。

そこでは議論されていないことが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 and OUTPUT chains of the filter table

2
Bananguin

Iptablesのtimeモジュールを使用する場合、日付と時刻がUTCで指定されていると想定している場合は、ローカルタイムレコーダーとカーネルを使用しようとしている可能性があります。

-m timeに関する私のiptablesマニュアルページの引用:

   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
user140866

あなたの例といくつかのグーグルに基づいて、これは私のために働いたものです:

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によって提案されたものにはいくつかの問題がありました:

  • Openwrtにいくつかのiptablesモジュールをインストールしていませんでした

    opkgの更新; opkg install iptables-mod-filter

  • * natの代わりに* filterを使用すると、文句を言います:( -tnatを省略するとルールが* filterに直接配置されます)

The "nat" table is not intended for filtering, the use of DROP is therefore inhibited
  • iNPUTキューの代わりにFORWARDを使用する
1
Sims

Crontabで実行されるいくつかの.shスクリプトを作成できます。 crontabで:

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 DROP、またはURLをブロックする方法

そして原因のunblock.shでこのルールを削除します

1
Lev Bystritskiy