clayfish2008-05-25

サーバの sshftp のポートを開放していると中国と韓国からの訪問者が多くて困ります。
最初は地道にログを見て一人ずつIPアドレスでブロックしていたのですが、さすがに多すぎてお手上げ状態になってきたので色々調べてみました。

ようは中国と韓国の人々が使う可能性があるすべてのIPアドレスがわかればよいので、APNICを参照すればわかるかなーとか調べていたところ同じ事を考えている人がやっぱりいました。一番よさそうだったのがSPAM(スパム)の温床、中国・韓国からのアクセスを遮断

以下は、SPAM(スパム)の温床、中国・韓国からのアクセスを遮断の手順をrubyスクリプトにしたものです。手作業はいやですから。

#!/usr/bin/env rubyrequire "open-uri"IPTABLES="/sbin/iptables"APNIC\_URI\_ALLOCATED\_LISTS="ftp://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest"R\_CNKR = /^apnic\|(CN|KR)\|ipv4\|(.+)\|(.+)\|(.+)\|(.+)$/def main filters = make\_filter\_list system "#{IPTABLES} -D INPUT -p tcp -m state --state NEW -j DROPFILTER" system "#{IPTABLES} -F DROPFILTER" system "#{IPTABLES} -X DROPFILTER" system "#{IPTABLES} -F DROPFILTERED" system "#{IPTABLES} -X DROPFILTERED" system "#{IPTABLES} -N DROPFILTERED" system "#{IPTABLES} -N DROPFILTER" filters.each do |filter| system "#{IPTABLES} -A DROPFILTER -s #{filter} -j DROPFILTERED"end system "#{IPTABLES} -A DROPFILTER -j ACCEPT" system "#{IPTABLES} -A DROPFILTERED -j LOG --log-prefix 'Rej-TCP '" system "#{IPTABLES} -A DROPFILTERED -j DROP" system "#{IPTABLES} -A INPUT -p tcp -m state --state NEW -j DROPFILTER"enddef make\_filter\_list filter\_cidrs = [] masks = {} (10..24).each {|i| masks[2\*\*(32-i)] = i} open APNIC\_URI\_ALLOCATED\_LISTS do |f| f.each do |line| filter\_cidrs \<\< "#{$2}/#{masks[$3.to\_i]}" if R\_CNKR.match(line) endend filter\_cidrsendmain

このスクリプトは cron で定期的に iptables の設定を更新することを意図して記述してあります。
IPアドレスの割り当て状況は(完全に推測ですが)1ヶ月に1回程度更新すれば問題ないように思いますので、これを/etc/cron.monthly/1iptables_drop_ch_kr などというファイル名で保存しておけばよいでしょう。

iptablesの設定はここを参考にしました。iptablesは設定するたびに出来るようになった気がするのですが1週間もするときれいさっぱり忘れてしまいます。
cronの設定はここを参考にしました。cronの設定はあまり変更しないのでいつも忘れますね。

ネットワークセキュリティHacks 第2版 ―プロが使うテクニック & ツール 100+

ネットワークセキュリティHacks 第2版 ―プロが使うテクニック & ツール 100+