iptablesのお勉強


sshへの総当り攻撃をiptablesの2行で防ぐ方法 (blog@browncat.org)
http://blog.browncat.org/2007/07/sshiptables2.html

-A RH-Firewall-1-INPUT -p tcp –dport 22 -m state –state NEW -m recent –set –name SSH
-A RH-Firewall-1-INPUT -p tcp –dport 22 -m state –state NEW -m recent –update –seconds 60 –hitcount 8 –rttl –name SSH -j DROP

これは素敵な設定だ-!と思ったんですが、よく考えたら自分はiptables分からないマンだったので、これを機にきちんと調べてみました。

参考にしたのはこちらのサイト。

iptables の ipt_recent で ssh の brute force attack 対策
http://www2s.biglobe.ne.jp/~nuts/labo/inti/ipt_recent.html

Linux Certif – Man iptables(8)
http://www.linuxcertif.com/man/8/iptables/ja/

-A RH-Firewall-1-INPUT

-Aってのはappendコマンドで、RH-Firewall-1-INPUTというチェインルールに対してこれから設定を追加するという指定です。
ここで唐突に現れる「RH-Firewall-1-INPUT」はこちらのサイトに詳しく書かれています。

RH-Firewall-1-INPUTとは? | OKWave
http://okwave.jp/qa/q6986608.html

一応自由につけていいようですが、最終的にはINPUTやFORWARDに繋がるように記述する必要があると思います。

-p tcp

プロトコルの指定パラメータ。
ここではtcpです。

–dport 22

送信先ポート番号のパラメータ。
送信者にとっての「送信先」なので、こちらのサーバーのSSH(Port22)をふさぎたければこれで指定します。
–dport 1000:2000 みたく範囲指定もOK。

-m state

stateというモジュールを使いますよ、という指定。

–state NEW

前述のstateモジュールに対するパラメータで、新しい接続を開始した場合をマッチさせるのが「NEW」です。
他にも、INVALIDとかESTABLISHEDとかあります。

-m recent

recentモジュールを使いますよ、という指定。

–set –name SSH

SSHという名前のリストに対して、今までのルールを通過してきたIPをセットしますよ、という指定。
–nameを指定しないと「DEFAULT」という名前が使われるそうです。

–update

最新のリストを読み込みつつ、IPアドレスがリストにあるか調べます。
どのリストなのかは、その後の「–name SSH」で指定しています。
つまり、1行目の方で–setでセットしたものがあるかどうかのチェックですね。

–seconds 60 –hitcount 8

ほとんどの場合セットで使うと思うので、まとめて。

–secondsは指定された秒数の間に来ているかどうか調べます。
–hitcountはその秒数に指定回数以上受信しているか調べます。

–rttl

–setされた時と同じTTLの場合にマッチされます。
攻撃者と同じネットワークを使っている人がいた場合、たとえその人が無実でもIP的には攻撃者として認識されてしまうので、
TTLもチェックすれば誤認が減るよって事だと思います。

–name SSH

前述の通り、使うリストの名前です。

-j DROP

-jはジャンプの略。これまでのルールにすべて通ってきたパケットをどこに飛ばすのか、を書きます。
飛ばす先は、ユーザー定義のチェインルールか、ACCEPT、DROP、QUEUE、RETURNのいずれか、だそうです。
まぁ、ほとんどの場合はACCEPTとDROPでどうにかなると思います。

Leave a Comment