2016年10月27日木曜日

国別IP割り当てリスト(CIDR.txt)の作り方

CentOS7でいろいろ作業がしにくくなった昨今、皆様いかがお過ごしでしょうか。

 以前より某サイト様から 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版   オライリージャパン 
DNS & BIND 第5版   オライリージャパン


いじょ。

2016年9月21日水曜日

http(port 80)のセッション数をリアルタイムで監視したい

Webサーバーのセッション数の上限が低いせいで表示が重たいのでは?
と思ったので監視用にshellを作ってみた。

オプションはvmstat風。
 中身はnetstat -pantu と ps -eaf してるだけなのでroot権限で実行するのが望ましい。



[注意]
eth0に設定された ip_addr:80 のセッションしかカウントしません。
SSL証明書は手前で解決しているため。


[実行結果]
[root99@ ~/bin]# ./http_sess_counter.sh
error: Not Arg!
   ./http_sess_counter.sh WaitTime(s) Count
   example: ./http_sess_counter.sh 5
   example: ./http_sess_counter.sh 60 1440


[root99@ ~/bin]# ./http_sess_counter.sh  60 30
TIME_WAIT       FIN_WAIT2       ESTABLISHED     LAST_ACK        CLOSE_WAIT      TOTAL_SESS      HTTPD_CNT       DATE
    143              18              51               1               1             214              44         20XX/mm/dd 18:37:08


[Shell Source: http_sess_counter.sh ]



いじょ。

.