iptables小ネタ
こんにちは、Qです。
今回は iptables の小ネタです。
DNSBLなど、外部のサービスが提供するブラックリストを
iptablesのルール作成に活用している人も多いと思います。
DNSBLの有名どころでは “Spamhaus” でしょうか。
https://www.spamhaus.org/drop/drop.lasso
2019年5月20日現在、761個のネットワークアドレスが登録されています。
こんなに大量のブラックリストは “iptables-restore”コマンドを使うと
サクッと設定できます、というお話です。
■ iptables-restoreコマンド
以下、CentOS6.xを例にすすめますが、”iptables-restore” コマンドは
iptablesサービスの起動スクリプトでも利用されているコマンドです。
興味がある人、暇を持て余してる人は、
起動スクリプト “/etc/init.d/iptables” を眺めてみることをお奨めします。
shellスクリプトの勉強にもなります。
iptablesの設定ファイルは下記のような書式で記述しますが、
“iptables-restore”コマンド は『”*filter” から “COMMIT” まで』を
データベースのトランザクションのように一気に処理してくれるので、
コマンドを叩いた瞬間に設定が完了します。
iptables設定ファイルの書式
-------------------------------------
*filter ← ココから
ルール1
ルール2
ルール3
・・・
・・・
・・・
COMMIT ← ココまで
-------------------------------------
■ iptables設定ファイルの作成
iptables設定ファイルは実際の運用では、更新頻度などに依って
ベース用とブラックリスト用に分けて管理するのが良いと思います。
・ベース用 : 更新頻度が低い (/etc/sysconfig/iptables)
・ブラックリスト用: 更新頻度が高い (/var/tmp/blacklist とか)
ベース用のiptables設定ファイルの作成方法には触れませんが、
所属のポリシー、個人的なポリシーに則て作成してくださいませ。
ここで一旦、iptablesコマンドオプションをサラッと復習しておきます。
「-I」:ルールを「挿入」します。
iptablesが稼働中でもルール番号を指定して自由に新しいルールを
「挿入」することができます。
ルール番号を指定しないときは暗黙的にルール番号「1」がセットされます。
つまり、新しいルールは展開されたルールの先頭に「挿入」されます。
「-A」:ルールを「追加」します。ルール番号の指定はできません。
新しいルールは展開されたルールの最後列に「追加」されます。
これを頭の片隅に置きつつ、ブラックリスト用の設定ファイルを作ってみます。
ここでは以下のような流れで作ります。
----------------------------------------------------------------------
①# echo "*filter" >> /var/tmp/blacklist
②# wget -q -O - http://www.spamhaus.org/drop/drop.lasso | \
awk '!/^;/{print "-I INPUT -j DROP -s "$1}' >> /var/tmp/blacklist
または
③# wget -q -O - http://www.spamhaus.org/drop/drop.lasso | \
awk '!/^;/{print "-A INPUT -j DROP -s "$1}' >> /var/tmp/blacklist
④# echo "COMMIT" >> /var/tmp/blacklist
———————————————————————-
① トランザクション宣言
②③ DROPルール書き出し
④ トランザクション確定
で、②と③です。
②はawkスクリプトの中で「-I」を指定してます。「挿入」ルールリストです。
----------------------------------------------------------------------
*filter
-I INPUT -j DROP -s 1.10.16.0/20
-I INPUT -j DROP -s 1.19.0.0/16
・・・・・
・・・・・
・・・・・
-I INPUT -j DROP -s 223.173.0.0/16
-I INPUT -j DROP -s 223.254.0.0/16
COMMIT
----------------------------------------------------------------------
③はawkスクリプトの中で「-A」を指定してます。「追加」ルールリストです。
----------------------------------------------------------------------
*filter
-A INPUT -j DROP -s 1.10.16.0/20
-A INPUT -j DROP -s 1.19.0.0/16
・・・・・
・・・・・
・・・・・
-A INPUT -j DROP -s 223.173.0.0/16
-A INPUT -j DROP -s 223.254.0.0/16
COMMIT
----------------------------------------------------------------------
②③の使い分けはベース設定のポリシーとルールに依るのですが、
参考までにベース設定が以下ようなときは②を利用するのが良いと思います。
----------------------------------------------------------------------
INPUTポリシー:DROP
公開ポートへANYからNEW接続:ACCEPT
----------------------------------------------------------------------
↓ ②ブラックリスト「挿入」
----------------------------------------------------------------------
INPUTポリシー:DROP
【 ココにDROPルールが「挿入」されます 】
公開ポートへANYからNEW接続:ACCEPT
----------------------------------------------------------------------
ルールにマッチした接続は公開ポートへ辿り着くことなく叩き落されます。
■ iptables起動
まずはベース用のiptables設定ファイルを使って起動します。
----------------------------------------------------------------------
# /etc/init.d/iptables start
# iptables -nL --line-number | head
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:21
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
7 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
8 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:161
----------------------------------------------------------------------
次に②で作成したブラックリスト用の設定を”iptables-restore”コマンドで
展開します。timeも計測してみます。
----------------------------------------------------------------------
# time iptables-restore --noflush /var/tmp/blacklist
real 0m0.005s ← 761個のルールが瞬殺です!
user 0m0.003s
sys 0m0.001s
# iptables -nL --line-number | head
Chain INPUT (policy DROP)
num target prot opt source destination
1 DROP all -- 223.254.0.0/16 0.0.0.0/0
2 DROP all -- 223.173.0.0/16 0.0.0.0/0
3 DROP all -- 223.169.0.0/16 0.0.0.0/0
4 DROP all -- 223.0.0.0/15 0.0.0.0/0
5 DROP all -- 221.132.192.0/18 0.0.0.0/0
6 DROP all -- 220.154.0.0/16 0.0.0.0/0
7 DROP all -- 216.137.176.0/20 0.0.0.0/0
8 DROP all -- 216.83.208.0/20 0.0.0.0/0
----------------------------------------------------------------------
左端の数字がルール番号になります。
ベースルールの先頭にブラックリストルールが「挿入」されたことがわかります。
ちなみに元の先頭は。。。758番目です。
----------------------------------------------------------------------
# iptables -nL --line-number | grep icmp
758 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
----------------------------------------------------------------------
“iptables-restore” コマンドのオプションの説明を忘れてました。
「–noflush」コイツ重要です。
「–noflush」を忘れると “iptables-restore” は稼働しているルールを
問答無用でフラッシュてしまいます。
「–noflush」を必ず付けてください。お願いします。
■ 運用開始
更新の有無に関わらずDNSBL提供リストを1日1回取得して反映するために
crontabに登録してます。
----------------------------------------------------------------------
0 0 * * * /etc/init.d/iptables restart; iptables-restore --noflush /var/tmp/blacklist
----------------------------------------------------------------------
もちろんshellスクリプトにまとめてもOKです。
最後にiptablesサービスは無効にしておきます。
無効にしておかないとリブート発生したとき等、ブラックリスト用の設定が
反映されない時間帯が発生してしまいます。
----------------------------------------------------------------------
# chkconfig iptables off
----------------------------------------------------------------------
それでは、今回はこの辺で終了します。
ひとりごと
Norse IPViking。。。見れなくなってしまった、寂しい。