- 締切済み
ファイアウォールとしてping of deathの設定をしたいです
ファイアウォールとしてping of deathの設定をしたいのですが、どのように記述したらよいでしょうか? 1秒間に1回 バースト5にし、ログをとり、破棄したいです。 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j LOG --log-prefix "ping-death" iptables -A INPUT -p icmp --icmp-type echo-request -j DROP これでよろしいのでしょうか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
#5です。 自分もちょっと混乱しています^ ^;; 少なくとも#4でちょっと誤りと補足があります。 Ping of DeathはIPヘッダ20バイト+ICMPヘッダ8バイトを引いた65,507がIPパケットの最大なのに それ以上のICMPデータをつけたICMPパケットを送ることが出来ることで フラグメントオフセット値+サイズで16ビット値のオーバーフローを狙うものでした。 自分も試していないので(通常のpingだと65,508バイト以上が送れない)ちょっとわかりませんが、 確かにデータサイズはIPパケット長以上になるかもしれませんが、 実際には0xffffが入るのではないでしょうか? #65,507バイトの正常なPingも止まってしまいますが... もともと勘違いしているかもしれません。 すみません、もうちょっと調べてみます。
#4補足より >65,535バイト以上のICMPエコーは、設定できないようですが。。 > IPヘッダーのパケット長は16ビットで表現しているので最大値が65,535なのです。 つまり、IPパケットの最大値が65,535バイトということになり、 それより大きいICMPパケットというのは存在しないということですね。 Ping of Death攻撃自体が、IPヘッダ20バイトを引いた65,507より大きなICMPパケット(65,508~65,535バイト) によってクラッシュが引き起こされる可能性があるといった攻撃になります。
#3補足より ># Fragment(外部からのフラグメントしたパケットはログをとり、破棄する) > 単純にフラグメントされたパケットを破棄してしまっては、 フラグメントされた通常のパケットもdropされてしまいます。 やはりICMPのパケット長チェックが妥当なような気がしますが...。
補足
kanop_98さんに紹介して頂いたアドレスを見ると、 http://www.geocities.co.jp/SiliconValley-Cupertino/5128/500_compu/iptables-extension.html#3.4 85 バイトよりでかい ping のパケットを破棄する場合、 iptables -A INPUT -p icmp --icmp-type echo-request -m length\ --length 85:0xffff -j DROP --length length[:length] 値あるいは範囲でもいい(混在も可) 値の最小値は 0 最大値は 65535 とありましたが、最大値は 65535 ということは、 >ping of death は65,535(データ部65,507)バイト以上のICMPエコーに対する脆弱性からくるものなので とあるので、65,535バイト以上のICMPエコーは、設定できないようですが。。
#2補足より >結局、いろいろなサイトを参考に下記のようにしてみました。いかがでしょうか? > ># Ping of death >iptables -N ping-death >iptables -A ping-death -m limit --limit 1/s -j ACCEPT >iptables -A ping-death -j LOG --log-prefix "### Ping of death ###" >iptables -A ping-death -j DROP >iptables -A INPUT -i ppp0 -p icmp --icmp-type echo-request -j ping-death >iptables -A FORWARD -i ppp0 -p icmp --icmp-type echo-request -j ping-death > このルールだと、1秒間に5回以上のType8のicmpは止めれますが、(ping floodには対応できる) Ping of Deathはフラグメント化されたIPパケットになるので、対応できないのではないでしょうか? (断片パケットはicmpパケットとして認識されない) やはりLength指定でパケットサイズを見るしか無いかと思います。
補足
そしたら、下記のような設定があったのですが、いかがですか? # Fragment(外部からのフラグメントしたパケットはログをとり、破棄する) iptables -N fragment iptables -A fragment -j LOG --log-prefix "### Fragment ###" iptables -A fragment -j DROP iptables -A INPUT -f -i ppp0 -j fragment iptables -A FORWARD -f -i ppp0 -j fragment http://www.kkoba.com/linuxrouter/iptables.shtml
その後気づいたのですが、そもそもping of Deathを引っかけるなら 「length」モジュールでパケット長をある程度指定すればいいのではないでしょうか? 例はこちら http://www.geocities.co.jp/SiliconValley-Cupertino/5128/500_compu/iptables-extension.html#3.4 で、#1補足より >>-m limitに「--limit-burst 5」が足りないですね。 > >デフォルトが5なので、記述しなくていいのではないでしょうか? > ありゃりゃ、その通りです。すみませんでした。 >1秒ごとに10個のicmpパケットが届いた場合、最初は5個のパケットを受け取り、 > マッチするのは「1秒間に5個のecho-request(type 8)のICMPパケットが来た場合」 かと思います。 >RETURN やiptables -N を使用して設定している人もいるのですが、 >いまいち使い方が分からないのですが、教えて頂けますか? > 自分もそれほど詳しくないので、参考サイトを記載させていただきます。 で、まずはmanでしょうか。 http://www.linux.or.jp/JM/html/iptables/man8/iptables.8.html 設定については、こことかはどうでしょうか? http://tlec.linux.or.jp/docs/iptables.html
補足
>「length」モジュールでパケット長をある程度指定すればいいのではないでしょうか? ますます混乱しそうなのでやめときます。 結局、いろいろなサイトを参考に下記のようにしてみました。いかがでしょうか? # Ping of death iptables -N ping-death iptables -A ping-death -m limit --limit 1/s -j ACCEPT iptables -A ping-death -j LOG --log-prefix "### Ping of death ###" iptables -A ping-death -j DROP iptables -A INPUT -i ppp0 -p icmp --icmp-type echo-request -j ping-death iptables -A FORWARD -i ppp0 -p icmp --icmp-type echo-request -j ping-death
#@IT会議室でも同じ質問が出ていましたが...^ ^; >1秒間に1回 バースト5にし > ということであれば、 -m limitに「--limit-burst 5」が足りないですね。 しかも"ACCEPT"になっているようですが...。 厳密にはping of death は65,535(データ部65,507)バイト以上のICMPエコーに対する脆弱性からくるものなので このルールでは違うものも引っかかる可能性がありますね。 (少なくともping of deathは引っかかるので大丈夫ですが)
補足
>-m limitに「--limit-burst 5」が足りないですね。 デフォルトが5なので、記述しなくていいのではないでしょうか? >しかも"ACCEPT"になっているようですが...。 あ、すみません。デフォルトポリシーは、 iptables -P INPUT DROP になっています。 上記の私の記述では、 1秒ごとに10個のicmpパケットが届いた場合、最初は5個のパケットを受け取り、その後、1秒ごとにバーストが1個づつ回復し、パケットを1個づつ受け取るように設定され、その通過したパケットのログをとった上で、破棄する というふうになっていますでしょうか? 通常はどのように記述するのが一番、良いですか? RETURN やiptables -N を使用して設定している人もいるのですが、いまいち使い方が分からないのですが、教えて頂けますか?
お礼
ご協力、ありがとうございました。 参考にさせて頂きます。