Open Resolver 問題というのがある。ネットワークの通信はip address で行われるが、それでは数字の羅列なので人が理解できない。だからその数字列をわかりやすい登録したアルファベット文字列(ドメインネーム)と対応させて、通信するシステムがDNSなのだ。だから利用者はDNSサーバにまずアクセスしてip address を取得して、そのip address で相手先に接続するのだ。全てのip address とドメインネームの対応表を1つのDNS サーバが受けもつなんてことはありえない。ヒエラルキーがあって、下のレベルで解決できるときは、上のDNSに問い合わせることがないようになっている。最上位のDNSサーバは全世界で7台、そのうちの1台は日本のどっかにあると昔聞いたが、最近はどうなんだろ?設置している場所は秘密だ。ここが攻撃されるとネットがとまっちゃうからな。
なので、下位のDNSサーバは無数にあるのだ。このDNSサーバは要求があるとすぐ答えてくれるが、1台のDNSサーバがどこからの要求にも応じると、大量の要求が押し付けられてそのサーバが止まってしまう。このような大量のパケットを受けて答えるわけにはいかないので、普通、どんなDNSサーバも自分のとこだけ と応じる範囲を限定している。しかし、この限定ができていないルータ・サーバがあるわけで、これを Open Resolver 問題という。広く誰から(Open)の要求でもドメインネームとip address の対応を解決(Resolve)してあげますよというわけだ。
このDNSサーバがインターネットに直接接続していて、自由に問い合わせを受け付けるようになっていると、大量の問い合わせが合った場合、自分で解決できない要求は、より上位のDNSサーバに問い合わせに行くし、本来の自分のサブネットからの問い合わせに答えることができなくなってしまう。ウイルスがこれを利用して大量のDNS要求パケットを送りだすのがDos攻撃というわけだ。ウイルスが特定のサブネットを使えなくしてしまうのだ。だから、これをチェックするサイトが作られている。オープンリゾルバ確認サイトなんかだ。しかし、当然ながらイントラネット内のプライベート・アドレスのDNSサーバには対応していない。
問題は、このようなルータがイントラネットにあって、そのイントラネット内にウイルスに感染したPCがあってこのルータを標的にしたときだ。このルータの下のサブネットはルータが一杯一杯なので、なかなかネットに繋がらないことになる。さらにこのルータは上流のDNSサーバに無駄な大量の問い合わせを行うので、イントラネット全体のスピードが落ちてしまう。外には全く影響がない。自分のとこだけが被害を被るわけだ。
どうやら、この問題が発生したようだ。つらいのは、ルータを自由に導入していいとしていて、だれがどのip address (もちろん privateだ)を使っているのか把握できていないことだ。企業ではなく大学だからな。ユーザが勝手に導入したルータがopen resolver 問題を解決できていないとするとーーちょっと前のルータ(無線AP)はデフォルトでは対策されていない――そして、どっかのPCが Dos攻撃ウイルスを持っていて、このルータを攻撃しているらしいのだ。
☆ open resolver 問題を抱えているルータを排除する。
☆ ウイルス感染PCを探しだす
が対策なのだが、ルータのip address がわからない。よわった。感染しているPCを探すのはもっと大変だ。
もしip address がわかったら nslookup で調べる方法。
問題のルータのWAN 側で使っている ip address がわかったとき、そして
192.168.123.123 だったとする。
$ nslookup #と入力すると >プロンプトになるから
> server 192.168.123.123 #と入力すると
Default server: 192.168.123.123
Address: 192.168.123.123#53
> set type=ANY #と入力し
> google.com #googleを解いてもらうと
;; connection timed out; no servers could be reached
>
となったら、ルータの外からDNSの問い合せがあっても答えないということ
になる。これが正常。
もし下記のように google.com のip address が帰ってきたらオープンリゾ
ルバになっているということだ。
ルータの下(内部)から、同じことを行うと
$ nslookup #と入力すると >プロンプトになるから
> server 1192.168.123.123 #と入力すると
Default server: 192.168.123.123
Address: 192.168.123.123#53
> set type=ANY #と入力し
> google.com #googleを解いてもらうと
Non-authoritative answer:
Name: google.com
Address: 216.58.220.238
google.com nameserver = ns4.google.com.
略
ns1.google.com internet address = 216.239.32.10
>
となってgoogle のip address を解いてくれる。つまり、ルータの内部から
はDNS問い合せに応じていることになる。(もし、こうでなかったら、この
ルータの下ではインターネット接続ができないから、動いているルータなん
だらこうならないわけがない)。
> プロンプトの後に exit と入力して nslookup を終了する。
dig を使う場合
$ dig @192.168.123.123 google.com ANY
; <<>> DiG 9.8.3-P1 <<>> @192.168.123.123 google.com ANY
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER< ;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 4
;; QUESTION SECTION:
;google.com. IN ANY
;; ANSWER SECTION:
google.com. 211 IN A 216.58.220.238
google.com. 5715 IN NS ns4.google.com.
略
ns3.google.com. 5714 IN A 216.239.36.10
ns1.google.com. 5714 IN A 216.239.32.10
;; Query time: 57 msec
;; SERVER: 192.168.246.67#53(192.168.246.67)
;; WHEN: Tue Oct 27 14:16:05 2015
;; MSG SIZE rcvd: 378
$
だったら問い合わせに答えたということになる。
$ dig @192.168.123.123 google.com ANY
; < <>> DiG 9.8.3-P1 < <>> @192.168.123.123 google.com ANY
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
$
はDNS問い合わせに答えなかった場合だ。
ip address がわかってないと大変だ。WinでEXPing.exe 使って、そのセグメントで利用されているip address を探し、そのほとんどがパソコンかプリンタなんだけど、上記のコマンドを打って見る。なんてやってられないな。
スクリプトを作って…. どっかにないかな?面倒だ。
教えてもらった。検索範囲を192.168.100.0. のネットだとすると
#!/bin/sh
for i in `seq 1 253`
do
echo “dig @192.168.100.$i google.com”
echo “dig @192.168.100.$i google.com” >> result
dig +time=3 +trie=1 @192.168.100.$i google.com >> result
done
をMacのターミナルで実行すると、
$ for i in `seq 1 253`
> do
> echo “dig @192.168.100.$i google.com”
> echo “dig @192.168.100.$i google.com” >> result
> dig +time=3 +trie=1 @192.168.100.$i google.com >> result
> done
で止まるから エンターキーを押すと
dig @192.168.100.1 google.com
dig @192.168.100.2 google.com
….
dig @192.168.100.253 google.com
$
と約3秒ごとに、対象ip address を1つづつ増加させてdig を実行していく。
結果はデスクトップに result という名前のファイルで保存される。
dig @192.168.100.55 google.com
; < <>> DiG 9.8.3-P1 < <>> +time=3 +trie=1 @192.168.100.55 google.com
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
とあれば192.168.100.55はDNSをやってないよ。
dig @192.168.100.56 google.com
; < <>> DiG 9.8.3-P1 < <>> +time=3 +trie=1 @192.168.100.56 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER< <- opcode: QUERY, status: NOERROR, id: 25178 ;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 299 IN A 173.194.117.225 google.com. 299 IN A 173.194.117.227 google.com. 299 IN A 173.194.117.224 google.com. 299 IN A 173.194.117.230 google.com. 299 IN A 173.194.117.232 google.com. 299 IN A 173.194.117.229 google.com. 299 IN A 173.194.117.226 google.com. 299 IN A 173.194.117.228 google.com. 299 IN A 173.194.117.231 google.com. 299 IN A 173.194.117.233 google.com. 299 IN A 173.194.117.238 ;; Query time: 59 msec ;; SERVER: 192.168.100.56#53(192.168.100.56) ;; WHEN: Thu Oct 29 15:04:04 2015 ;; MSG SIZE rcvd: 204
とあれば192.168.100.56はDNSをやっているよというわけだ。
ルータのWAN側のネットで実施すれば、オープンリゾルバになっているルータの検出ができるわけだ。ルータのした(内側)ではDNSサービスを行うのが当然だからDNSサービスをやっているという応答で問題ないが、同じip address のルータがWAN側からアクセスしてDNSをやっているとうのはopen resolver でまずいわけだ。
dig +time=3 +trie=1 @192.168.100.$i google.com
—–
のようにオプションを指定すると、タイムアウト3秒で1回のみ試行となり、調査の時間が短縮できる(一般的なデフォルトはタイムアウト5秒の3回試行だ)。
相手側が重くなっていると応答に時間がかかることがあるので、タイムアウトは少し長めがいい。
—–
こんなのでいけますよ。
#!/bin/sh
for i in `seq 11 39`
do
for j in 2 5 7
do
for k in `seq 1 100`
do
echo “dig @10.$i.$j.$k http://www.yahoo.co.jp”
echo “dig @10.$i.$j.$k http://www.yahoo.co.jp” >> result
dig +time=3 +trie=1 @10.$i.$j.$k http://www.yahoo.co.jp >> result
done
done
done
ありがとね。参考にして、このブログをかきました。