夜を除いて一日中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を使用することは適切なオプションではありません。私は本当にどんな提案も簡潔にします。事前に、そして私の質問を読むのをわざわざしてくれてありがとう
Facebookを実際にブロックすることになると、 this および that の質問を参照していると思います。
そこでは議論されていないことが2つあります。
Facebookに向かうすべてのパケットに文字列www.facebook.com
が含まれていると想定するのは遠慮がちです。リンクされた質問では、文字列facebook.com
のみが使用されていることに注意してください。最強のアプローチではありませんが、これはFacebookをブロックする公的に受け入れられる方法のようですので、それを行っても大丈夫です。
ルールがブロックしないドメイン名を解決した後、コンピューターは先に進み、FacebookへのTCP接続を開きます。TCPハンドシェイクには文字列www.facebook.com
であるため、ルールによってこれが妨げられることはありません。結局のところ、トラフィックは、ルール-m state --state related,established -j ACCEPT
によって受け入れられる可能性が非常に高くなります。
次のシーンショットは、私の(デフォルトの)OpenWRTフィルターテーブルを示しています。ここでは、どのチェーンでも、2番目のルールが前述のrelated,established
ルールであることがはっきりとわかります。成功したTCPハンドシェイクと組み合わせて、Facebookとの間のデータトラフィックについてルールが評価されることはありません。
この一般的な-j ACCEPT
の前にルールを挿入する必要があります。
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.
あなたの例といくつかのグーグルに基づいて、これは私のために働いたものです:
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
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でこのルールを削除します