以前より某サイト様から ACCEPT_COUNTRY で接続先を国単位で制限するiptables のshellを利用させて貰っていましたが、かなり大幅な更新があったようで、独自に機能追加している自分としては、またもや手を入れるはめになりました。
CIDRとは
IP Address=インターネットにおける使用者の住所ってことは大方の人がご存知だと思うんですが、プロバイダーのさらに上位の管理組織では国単位でIPアドレスの割り振りをしています。
各組織が公開している割り当てリストを実際に見るとこんな感じ。
# cat delegated-arin-extended-latest|grep "JP|ipv4"| head -10
arin|JP|ipv4|64.56.160.0|8192|20000321|allocated|aeff7d84c92f62a27ea05c2afe31f951
arin|JP|ipv4|170.105.0.0|65536|19940404|assigned|d1f7854cf92b0efd0e649f0a6c29921a
arin|JP|ipv4|199.103.103.0|256|19940625|assigned|629f9ff288afae0ad0a4b0b4123b80e3
arin|JP|ipv4|204.79.157.0|256|19941214|assigned|bbb16281966807d187b902dd9fcdbfd4
arin|JP|ipv4|204.79.158.0|256|19941214|assigned|bbb16281966807d187b902dd9fcdbfd4
arin|JP|ipv4|204.79.218.0|256|19941219|assigned|03c5127ab52527ee0ff75c768d49d461
arin|JP|ipv4|204.231.230.0|256|19950421|assigned|a28492c99368fed3ff029e96ade823c8
arin|JP|ipv4|204.231.251.0|256|19950421|assigned|0dddb111d7c3ff3c02b3d847a0fb6ffb
arin|JP|ipv4|204.231.252.0|256|19950421|assigned|0dddb111d7c3ff3c02b3d847a0fb6ffb
arin|JP|ipv4|206.3.0.0|8192|19950508|allocated|aeff7d84c92f62a27ea05c2afe31f951
例として1行目)
arin|JP|ipv4|64.56.160.0|8192
ここで実際に必要なのは、
64.56.160.0から8192個のIPアドレスはJP(Japan)に割り当てるよって情報だけです。
・それぞれ以下のURLからゲットできます。
wget http://ftp.apnic.net/stats/apnic/delegated-apnic-latest #APNIC
wget ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest #ARIN
wget http://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-latest #RIPE
wget http://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest #LACNIC
wget http://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest #AFRINIC
しかし、そのままでは使えない問題が!
iptables の指定方法ではサブネットマスクの単位で指定しなければならないのです。64.56.160.0から8192個 → 64.56.160.0/19
よって計算して変換します。
とは言え、別に簡単な話で下のように決まってる数値を置き換えればいいだけなので
計算しなくたって、32個の文字列の置き換えでも可能なわけです。
IPアドレスが1個の場合 →/32 ←ここから
IPアドレスが2個の場合 →/31
IPアドレスが4個の場合 →/30
IPアドレスが8個の場合 →/29
IPアドレスが16個の場合 →/28
IPアドレスが32個の場合 →/27
IPアドレスが64個の場合 →/26
IPアドレスが128個の場合 →/25
IPアドレスが256個の場合 →/24 ←ここまでがクラスC
IPアドレスが512個の場合 →/23 ←ここからクラスB
IPアドレスが1024個の場合 →/22
IPアドレスが2048個の場合 →/21
IPアドレスが4096個の場合 →/20
IPアドレスが8192個の場合 →/19
IPアドレスが16384個の場合 →/18
IPアドレスが32768個の場合 →/17
IPアドレスが65536個の場合 →/16
IPアドレスが131072個の場合 →/15 ←ここまでがクラスB
IPアドレスが262144個の場合 →/14 ←ここからクラスA
IPアドレスが524288個の場合 →/13
IPアドレスが1048576個の場合 →/12
IPアドレスが2097152個の場合 →/11
IPアドレスが4194304個の場合 →/10
IPアドレスが8388608個の場合 →/9
IPアドレスが16777216個の場合→/8
IPアドレスが33554432個の場合→/7
IPアドレスが67108864個の場合→/6
IPアドレスが134217728個の場合→/5
IPアドレスが268435456個の場合→/4
IPアドレスが536870912個の場合→/3
IPアドレスが1073741824個の場合→/2
IPアドレスが2147483648個の場合→/1
ほんとはクラスCまでで止めようと思ったんだけど、真に受けて本当に変換テーブル
書いちゃう人がいて「なんで途中までしか無いんだよヾ(*`Д´*)ノ」 とか言ってこない
とも限らないので頑張って書きました。
という訳で各組織からリストをちょっぱってきて
arin|JP|ipv4|64.56.160.0|8192|20000321|allocated|aeff7d84c92f62a27ea05c2afe31f951
arin|JP|ipv4|170.105.0.0|65536|19940404|assigned|d1f7854cf92b0efd0e649f0a6c29921a
arin|JP|ipv4|199.103.103.0|256|19940625|assigned|629f9ff288afae0ad0a4b0b4123b80e3
↓
JP 64.56.160.0/19
JP 170.105.0.0/16
JP 199.103.103.0/24
このような形に整形するスクリプトがこれです。
[root99@ /home/root99/bin]# cat ./make_cidr.sh
なんで "..........." て延々と表示してるかって言うと、Firewall内とか通信環境の悪いとこから実行した場合、パケットが長時間途切れて切断されちゃうからですね。
不要だと思ったら printf "." をコメントアウトしましょう。
DNS & BIND 第5版 オライリージャパン
いじょ。