テックブログ

技術ネタ

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。。。見れなくなってしまった、寂しい。

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください