中国と韓国のパケットを完全シャットアウトする方法 for linux

clayfish2008-05-25


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

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

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

#!/usr/bin/env ruby
require "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"
end

def 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)
    end
  end
  filter_cidrs
end

main

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

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

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

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