割当国のデータは 2024/10/07 に更新しました
IPアドレスの所有者を調べるサービスは IPひろば が有名で、割当国のみならず所有者(プロバイダ)の情報まで得られて便利なのですが、Webサーバーやメールサーバーと連携して使うには少々敷居が高い・・・そんなわけで、IPアドレスの割当国を割り出すだけの軽快なアプリケーションサービス(DNSサーバー)を作ってみました。
わざわざこのサイトに御訪問いただかなくても、お手持ちのパソコンに標準で備わっている NSLOOKUP コマンドを利用して以下の2つのことが出来ます。
某国のアドレスかどうか知る
当サーバーの固定IPアドレス 118.243.37.27 が日本(JP)かどうかを判定したい場合には、IPアドレスの下位から逆に繋げたものに国コードを付けて呼び出します。 Windows でしたら DOS窓(コマンドプロンプト)を開いて以下のように NSLOOKUP してみましょう。
NSLOOKUP > 27.37.243.118.jp.cc.wariate.jp
上のように 127.0.0.2 と正引きされて表示されるはずです。 では今度は JP のところを アメリカ(US)にして同じように叩いてみましょう。
NSLOOKUP > 27.37.243.118.us.cc.wariate.jp
*** UnKnown can't find 27.37.243.118.us.cc.wariate.jp: Non-existent domain > EXIT
になりましたか? アメリカ(US)のアドレスでないので、こんな風なエラーになります。 正引きに成功して何らかのアドレスが引けたならば、その国のもの、失敗したらその国ではない、という単純な動作です。
IPアドレスを逆から打たないといけないなんてマンドクサイと言われそうですが、RBL(DNSBL)もこれと同じように IP アドレス逆打ちするそうなので、これがこの業界の標準ぽいです。 RBL(DNSBL)として参照するリストの代わりとして利用することが出来ます。
たとえば、SendMail のブラックリストに使用する場合には、sendmailの.mcファイルに FEATURE(dnsbl,`jp.cc.wariate.jp')dnl と設定すると、日本のメールサーバーから届くメールは全て遮断されます・・・ってここのコピペですが・・・
私は SendMail 使ったことないので詳しいこと分からないのですが 「us.cc.wariate.jp」と書くとアメリカからのものを拒絶するようになると思います。
実際のところでは日本とかアメリカのメールを拒絶しては話にならないので、あなたが拒絶したい国を指定します。 この国とあの国と・・・と複数の指定も多分できるかと思いますので、あとはテキトーに応用して下さい。
Webサーバーに Apache を使ってる人は、mod_access_rbl というモジュールと併用することで、特定の国のIPアドレスを拒絶したりできるようになるようです。 「deny via jp.cc.wariate.jp」って書くと日本のIPアドレスからの接続を deny(拒絶) するようになるみたいで、詳しくは rblの中の人の説明文 をお読み下さいませ。
国コードの一覧は 国別コードトップレベルドメイン を見て下さい。
どこの国のアドレスか知る
DNS の TXT レコードで国コードを返します。 TCP プロトコルじゃなくて UDP プロトコルで動作するので超軽いです。
同じく Windows の DOS 窓(コマンドプロンプト)から以下のように試せます。
NSLOOKUP > set type=txt > 27.37.243.118.cc.wariate.jp 27.37.243.118.cc.wariate.jp text = "JP" > EXIT
検索レコード種別を TXT にして、先ほど同様に IP アドレス(逆順)を繋げて呼び出すだけです。 日本(JP)というテキストが返ってくると思います。
超軽い UDP で国コードを取得できるんで、サーバーや各種システムの中に取り込んでも、回線やルーター負荷は無視できるレベル(普段の正引き処理と変わらない)でしょう。
メール受信時にクエリーを投げてヘッダーに情報を追加する~という仕組みがメールサーバー側で作れると、クライアントのメーラーで国を元に自動仕訳させたり~と便利になりますね、誰か詳しい方、応用のほどお願いします。
DNS クライアントの作り方は、この人の説明 が分かりやすいように思います。 .NET 向けの DNS クライアントは DNS Client Library for .NET というフリーライブラリが良さそうです。 下の「試してみる」も、これを用いて作ってます。
試してみる
いっぱい試してみる
ご注意・その他
上の「試してみる」でも使用している国コードを割り出す部分の関数(VB.NET)は ソース公開しておきます ので自由にお使い下さい。 (ホスト名を正引きした結果が複数あっても1つ目を強制採用したりと手抜きしてますが)
ASP.NET で JP からのみ接続を受け付けるサンプルも ソース公開 しときます。
元ネタとなるデータベースの更新は月曜未明に行っています。 更新が成功すると、本ページの右上の「割当国のデータは~に取得しました」の日付に反映されます cc.wariate.jp ドメインの SOA レコード serial 値も併せて更新されます。(上位8桁が更新年月日を示します)
システムに組み込んで利用される場合には、最初に SOA レコードを参照し更新年月日が最近かどうか(経路でSOAレコードがキャッシュされる関係もあるので概ね2週間以内かどうか)を確認する動作にすると完璧と思います。(本サーバー自身もキャッシュされたSOAレコードを引いて右上の日付を出していますので、実際には更新がかかっていも日付が古いままってこともありますが)
数週間にわたって更新失敗してる(更新日が変わらない)風でしたら、自動更新タスクがコケてる可能性が高いので、発見された方はメールで知らせて下さると幸いです。
サブドメイン名「cc」は CountryCode の略です。
御意見・御要望・クレーム諸々は support.wariate@gmail.com までお気軽に
ログは記録しておりませんが、ルーターのセッション数から憶測するに、少なくとも数百のサイト様に御利用いただいているぽい感じです。
since 2010/03/02
すべてのHTTPリクエストに対して ステータスコード:200 を返すだけのWEBサイト暫定稼働中
日付から祝日判定できるDNSサービス準備中