各キャリアのIPアドレス帯域一覧テキストファイルの形式を変更

以前より公開している audocomoSoftBankY!mobileIPアドレス帯域一覧テキストファイルの形式を一部変更&新たなファイルを作成しました。
以下変更箇所です。

  1. maskのバイナリ値を行末尾に追加
  2. i-modeだけ、mail用が最初に来ていたのでWebの後に変更
  3. Web/Mail/PCVを別ファイルにしたものを作成開始
  4. KDDIスマートフォンの(Web)IPアドレス帯域を追加
  5. 各タイトルに、ソースURLを追記
  6. コメント行の行頭にある「#」記号の後ろに半角空白を挿入

大きい変更は、maskのバイナリ値を追加したことと、Web/Mail/PCVを別ファイルにしたものも作成するようにしたことです。
また、auezweb)については、2011年秋冬モデル以降の機種分についてはさらに別ファイル(ezweb_web_ip2.txt)にしています。

SoftBankスマートフォン/iPhone

上記ファイルはタブ区切りのテキストファイルで、全て

[IP/MASK]\t[IP]\t[MASK]\t[IP(Binary)]\t[MASK(Binary)]\n

の形式で1行につき1つの帯域が記載されています。

たとえばWebサイトにアクセスしてきた docomoケータイが、公表されたIPアドレス帯域内であるかどうかを調べるには、

sub is_real_docomo_keitai
{
  my $is_real_ip = 0;

  my $ip_file = 'imode_web_ip-compact.txt';

  my $addr_bin = sprintf "%08b"x4, split /\./, $ENV{REMOTE_ADDR};

  open ( IPF, $ip_file ) or die("can't open file: $!");
  while ( <IPF> ) {
    next if ( /^#/ );
    next if ( /^\n$/ );
    chomp;
    my ($ipmask, $ip, $mask, $ip_bin, $mask_bin) = split( /\t/ );
    my $network_bin = $mask_bin & $addr_bin;
    if ( $ip eq &get_network_address($network_bin) ) {
      $is_real_ip = 1;
      last;
    }
  }
  close ( IPF );

  return $is_real_ip;
}

sub get_network_address
{
  my $ip_bin = shift;
  return join '.', map { oct "0b$_" } $ip_bin=~/(\d{8})(\d{8})(\d{8})(\d{8})/;
}

のように調べます。


ところでスマートフォンIPアドレス帯域をチェックすることって実際あるんでしょうか?