オープンリゾルバーチェッカー作り方 by Nginx + Mojolicious

オープンリゾルバ撲滅に向けて

イタズラしたい人はご遠慮ください。作り方を公開しておきます。

※ Nginx + Mojolicious の環境を前提としています。
apacheでも大丈夫です♪

■Mojoliciousの環境作成

 apt-get install perlbrew
 perlbrew init
 perlbrew install perl-5.16.3
 perlbrew install-cpanm
 cat ~/perl5/perlbrew/etc/bashrc >> ~/.bashrc
 sourc ~/.bashrc
 perlbrew use perl-5.16.3
 cpanm install Mojolicious
 cpanm install Net::DNS
 cpanm install IO::Socket::IP

■プログラム

 vi myapp.pl
 -----
 #!/usr/bin/env perl
 
 use Mojolicious::Lite;
 use Net::DNS;
 use Sys::Syslog;
 use IO::Socket::IP;
 
 # share 
 our %h_checkedFlag;
 
 # Documentation browser under "/perldoc"
 plugin 'PODRenderer';
 
 openlog("dnschk", 'ndelay,pid', 'user');
 my $res = Net::DNS::Resolver->new;
 $res->udp_timeout(1);
 $res->tcp_timeout(1);
 
 get '/check' =>sub {
   my $c = shift;
   my $flag = 0;
   #my $rAddr = $c->tx->remote_address;
   my $rAddr = $c->req->headers->header('X-Forwarded-For');
 
   # When the IP is same, stop 60 sec.
   if(time - $h_checkedFlag{$rAddr} < 60 ){$flag = 3;} 
  $h_checkedFlag{$rAddr} = time;
  if($rAddr =~ /[^.:0-9a-fA-F]+/) {
  $flag  = 2;
   $rAddr = '';
   }
   elsif(!$flag) {
     foreach my $vc (0..1) {
       $res->usevc($vc);
       $res->nameservers($rAddr);
       my $reply = $res->search("m.ROOT-SERVERS.NET");
       if ($reply) {
         foreach my $rr ($reply->answer) {
           next unless $rr->type eq "A";
           my $addr = $rr->address;
           $flag = 1;
           syslog('info', '%s,%s', $rAddr, $addr);
         }
       } else {
         syslog('info', 'query failed %s', $rAddr);
       }
     }
   }
   my $data = { ip => $rAddr, flag => $flag };
   $c->render(json => $data);
 };
 closelog;
 
 app->start;
-----

プログラムを起動する

morbo myapp.pl

■index.html

cd /var/www/vhost/dnschk.snowdrop.asia/
wget 'http://code.jquery.com/jquery-1.11.1.min.js'
vi index.html
------






 
   
 
------

■nginxの設定

vi /etc/nginx/conf.d/dnschk.snowdrop.asia.conf
-----
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Remote-Addr      $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    location /check {
       proxy_pass http://127.0.0.1:3000/check;
    }
-----

反映する

sudo /etc/init.d/nginx reload

オープンリゾルバーチェッカー by Nginx + Mojolicious

DNSのオープンリゾルバ問題が、最近世間を騒がせてますね!
そこで、自分の家は大丈夫かな?知らない間に、誰かに迷惑をかけてないかな?と、不安になっちゃう今日このごろ。そこで作っちゃいました!オープンリゾルバチェッカーです♪
そもそも、オープンリゾルバってなんだろう?
DNSというインターネットでは、知らずに使われている、でもとても大切でなくてはならない技術が、正しく設定されていない状態のことなのです。

インターネットの通信は、IPアドレスという数字の羅列を使ってパケット交換によって行われています。でも、いつもWebサイトを閲覧するときって、IPアドレス(http://192.168.0.1/ といった形式)で入力することはなかなか無いと思います。通常は、http://conoha.jp/ のように入力しますよね!でも、通信はIPアドレスで行われるんです。この conoha.jp からどうやってIPアドレスを知ることができるんでしょうか?

そう。DNSの機能が使われています!
コマンドプロンプトで、

nslookup conoha.jp

と、入力してEnterを押すと、ネームサーバと、conoha.jpに対するIPアドレスが帰ってきます。
この時、パソコンから、ネームサーバにIPアドレスを聞きにいったわけです。この行為がリゾルブとなります。

でも、このネームサーバは世界中の名前を知っているわけではありません。別の誰かに、代理で質問をしてくれています。
このあたりの仕組みは、専門書に譲るとして(´・ω・`)、この代理で誰かに質問をしてくれるという機能を正しく設定していないと問題が発生します!

世界にはいたずらをしてやろうという人がいらして、この代理で答えてくれるDNSサーバを見つけて、そのサーバに代理で質問をたくさんさせることで、世界中のDNSサーバに負荷をかけて正しく動かなくしてしまいます。
そうすると、http://conoha.jp/ とブラウザに入力しても、IPアドレスに変換してくれず、Webサイトも閲覧できない。。。ということになってしまいます。

で、最近、ブロードバンドルーターが正しく設定されていないために、気づかずにこの代理サーバの動作をしてしまい、悪意のある人に、自分のルータをつかわれて、誰かを攻撃してしまっているといった事が多発しています。

ここで、チェックツールです。このサイトから、閲覧した人のIPアドレスに対して、チェックしてくれるというものです。
※公式サイトはこちら→ http://www.openresolver.jp/

ここで注意ですが、チェックするわけですから、このサイトからページを利用した人にDNSの問い合わせをしてしまうので、その点はご了承ください。ルータやPCを落としてしまったり、誰かに害を与えたりってのはありませんから、ご安心ください(´艸`)

http://dnschk.snowdrop.asia/

※連続で実行できないようにしてあります
画面しょぼいです。気が向いたら綺麗にします。。。