wifi scan

とある日、電話がかかってきた。コールセンターの者ですが、光回線に繋がっているモデムの 無料交換を行っています。現行のスピードを大幅にアップして1Gになります。無料ですので、 この機会に是非交換をお勧めします。

後で、地区の担当者からお電話を差し上げますので、ご都合の宜しい時をご相談ください。 家屋内に担当者が入って、10分ぐらい作業をしますので、その立ち合いをお願いします。

へー、スピード競争に負けないように、対抗手段に出たのか。無料なら付き合ってあげてもいいな。(ちょっと期待)

1時間ぐらいして、担当者と言う女性から電話があった。へー、女性もこういう分野に進出してるんかと思って話を聞いていると、今は何処のプロバイダーを使ってます? 月額幾ら払ってます? と、どうでもいい事を聞いてくる。おかしーなあと思って、いたぶりモード発令。

回線を乗り換えると安くなるって、アピールしてるよ。電話で話していると齟齬があるから、取り合えず資料請求。数日して資料到着。

プロバイダーは、数社の中から選べます。1年目は幾らで、2年目は幾らでって具合に、新規加盟を勧誘する資料。読んで欲しくない部分は、欄外に小さいフォントでしかも地と同じような色で書いてある。若者だって読めないぞ。

数日して、資料は届きましたかって電話あり。即断り。断る理由を教えてくださいって言うから、読むなって言う資料を送ってくるって失礼じゃん。ごめんくださいませって言って強制断。

すかさず電話があったけど、留守番電話で対抗。恨みの一言でも残していくかと思ったら、それはなかった。

忘れた頃にまた電話。お話するのは無駄になりますからって、強制断。

防災無線で、年金の還付金詐欺や保険料の返還の詐欺電話が多数かかってきています。怪しい電話は家人に相談してください。留守番電話にして、電話に出ないでくださいって、日夜放送してる。

オイラーみたいに、電話を強制断出来ない(心優しい)人は、留守番電話で居留守するのが一番ですよ。

wifi tools

Windowsに wifi analyzerってのが有った。Unix系に相当品は有る?

FreeBSDのportsから探してみると、ピント外れが出てきた。

WiFimgr

Debianでapt-cacheに、wifiとかwirelessの検索語でも、これぐらいかなあ。

linssid - graphical wireless scanner
wavemon - Wireless Device Monitoring Application
wicd-cli - wired and wireless network manager - scriptable console client

wifi analyzer

上のようにざっと見した限りでは、アナライザーは無いようだ。Unix陣営はWindowsに負けているな。リナのもっぱらの話題は、いかに日本語入力が出来るかに終始してるみたいで、そんな所まで知恵が回らないんだな。

ならば作ってやろう。折角Windows7を潰してDebianを入れたのだから。とは言え、Debianが動く事に満足しちゃって、Debianはさっぱり使っていない。前回作った、ポータブルOpenBSDのUSBを差し込んだままで、OpenBSDしか動かしていないのさ。

オイラーのOpenBSDと言えば、早々とXは諦めて、CUI世界に引き籠っている。端末上で動かす、アナライザーを作ってみよう。

アナライザーと言うより、何とかstatだな。リナでは、iwlistってコマンドが有ったので、何とかにiwを割り当てて、iwstatってコマンド名にしよう。(と、Matzさん風に、最初に名前を決めましたよ。)

主言語は何にする? 流行りのPythonなんてのは、いの一番に却下します。unixに合うのは、昔からのshellさ。

ifconfigで出て来るデータからsedで必要な物を抽出するか。必要な物って何があるんだろう。 自分がスペアナ(電波の可視化装置)の画面を見せられた時、一番の注目は信号強度だな。次はその周波数。それから、その電波は誰が出してるの? この3点だろう。

sedで3つのデータを引き出すって、頭が痛い事ですよ。awkの方がよっぽど楽そうなんで、それを使う事にしよう。

そうすると、最初はawkのスクリプトと格闘。次はそのデータをパイプに流して整形表示って事になるな。データを都度ifconfigで引いてくるのは無駄なんで、一度LOGを取り、それをダミーデータとして、処理スクリプトを書こう。それが出来たら、永久ループにして、永遠とログするなり、10回スキャンして終了するなり、後はご自由にって事にしよう。

スクリプトを書いて、それを実行。修正してまた実行と言う、開発サイクルが待っている。 シェルスクリプト開発環境って何処かにないかな? Pythonなら腐る程あるんだけどね。

で、思い出したのはemacs。emacs shell script mode で、ググル様に聞いてみると、 シェルスクリプトモードのショートカットが便利過ぎるのでまとめてみたなんてのを紹介された。

そのうちで使うのは、C-x C-s と C-c C-xって組み合わせ。スクリプトを書いて(修正して)C-x C-s で保存。C-c C-x で、実行。(実行するスクリプトを聞いてくるんで、指定すると、画面が割れて、実行結果が出て来る。)

なお、初回はセーブしたら、別端末から、実行パーミションを与えておく事。

ob$ echo '#!/bin/sh' >hoge.sh
ob$ chmod 744 hoge.sh
ob$ emacs hoge.sh

あるいは、こんな風に始めても良い。最終的に、コマンドとして仕立てる場合、サフィックスの.shは除去するけど、作成途中では付けておく事。emacsは、サフィックスを見て、shellプログラムなんだなと、判断してるからだ。

#! /bin/sh

cat LOG | sed 's/ieee80211://' |
    awk '
    /dBm/{print($7, sprintf("%3d",$4), substr($6,1,5))}
    ' |
    sort -nr |
    head -n 4 |
    paste -d',,,' - - - - |
    sed 's/,/,  /g'

これが、作りかけのスクリプト。こいつを、C-c C-x すると、

-*- mode: compilation; default-directory: "~/" -*-
Comint started at Sat Apr 28 16:32:51

/home/sakae/iwstat.sh
-52dBm  36 88:57,  -61dBm   4 40:99,  -62dBm  36 98:f1,  -63dBm  36 98:f1

Comint finished at Sat Apr 28 16:32:51

こんな風に結果が出て来る。

80桁内に収めるって事で、強い局を4局分表示してる。(3つ組データをカンマ区切りで4局分)一つの組は、電界強度、チャンネル(周波数)、bssidの先頭付近のデータの順に並んでいる。

と、ここまで書いてBug発見。同じ局のデータが出てきてるじゃん。それは兎も角、スクリプトのあらましを、記憶が飛ばないうちに記しておく。

データを電界強度の順で並びかえ、4局分をheadで取り出し。pasteコマンドで行を合体。このコマンドは(複数の)ファイル名を受け付けるのがデフォだけど、ハイフン一つでstdinからの一行って意味になる。合体するとき、間に挟まれるのはデフォでタブ文字だ。これだと桁数を無駄に使うので、 合体文字をカンマにしていしてる。4つのデータの間には3つの空間が有るって事です。

本来なら、タブ文字を後で、他の文字にsedで変換するのがスマート。なんだけど、OpenBSDのsedは、タブ文字を受け付けてくれない(調べ方が悪いかも)そんな訳で、一旦カンマ文字で結合した後、適当にカンマスペースに変換してる。

#! /bin/sh
# wifi scan, show most strong 4 station's at a time
cnt=10
while [ $cnt -gt 0  ]; do
    ifconfig iwn0 scan | sed '/ieee80211:/d' |
    awk '
    /dBm/{print($7, sprintf("%3d",$4), substr($6,1,5))}
    ' |
    sort -nr |
    head -n 4 |
    paste -d',,,' - - - - |
    sed 's/,/,  /g'

    cnt=`expr $cnt - 1`
done

こちらが完成版。取り合えず10回スキャンして終了するようにした。ずっと監視したい場合は どうするか? whileの条件判定部分をtrueにする。中国人のように悠大な人は、カウンターの 値を9999999999とかにしちゃうかな。

昔、大英帝国が香港に駐留してた。そこを植民地にしたい帝国側は、中国側と交渉。中国側は、香港を差し上げる事は、勘弁してください。その代わり永久借用って事でどうでしょう。うん、それならそうしよう。でも永久っていつまでって区切りがないので、100年でどうでしょう。100年たら永久と同じ事ですよ。よし、わかった。そうしよう。

そして、1997年だったかに、繁栄した香港が中国に変換された。

下記、実行結果。

ob# ./iwstat.sh
-58dBm  36 88:57,  -62dBm   4 40:99,  -63dBm  36 98:f1,  -67dBm   4 00:1b
-53dBm   9 d8:c7,  -55dBm  36 88:57,  -62dBm  36 98:f1,  -65dBm   4 06:1b
-55dBm  36 88:57,  -62dBm  36 98:f1,  -72dBm 116 d8:c7,  -86dBm 100 5c:03
-53dBm   9 d8:c7,  -55dBm  36 88:57,  -59dBm   6 88:57,  -64dBm  36 98:f1
-56dBm  36 88:57,  -63dBm  36 98:f1,  -65dBm   4 06:1b,  -73dBm 116 d8:c7
-58dBm  36 88:57,  -64dBm  36 98:f1,  -74dBm 116 d8:c7,  -80dBm  11 36:76
-55dBm  36 88:57,  -62dBm  36 98:f1,  -65dBm   4 06:1b,  -72dBm 116 d8:c7
-53dBm   6 88:57,  -54dBm   9 d8:c7,  -55dBm  36 88:57,  -63dBm  36 98:f1
-49dBm   6 88:57,  -55dBm  36 88:57,  -62dBm  36 98:f1,  -73dBm 116 d8:c7
-53dBm   9 d8:c7,  -55dBm   6 88:57,  -56dBm  36 88:57,  -63dBm  36 98:f1

時間測定してみると、30秒かかっていたよ。カウンターを99999999にしたら、終了するまで、どんだけーー時間がかかるんだ?

強い電波を2.4Gと5G帯に放っている同一IDの局が居る。こやつのせいでwifiルーターを新調 するはめになったのさ。どこのメーカーかと問うと、東海電監えりあに本社がある会社です。

オイラーも昔、wifiが出始めの頃、このメーカーの親機とPCMCIAな子機がセットになったものを使っていたけど、親機がじきに壊れてしまった。それ以来、あのメーカーには良い印象を 持っていないのさ。

一回スキャンするのに、約3秒。時間がかかり過ぎるように思えるぞ。まてまて、無線屋さんなら、そんな早とちりはご法度です。スキャンするって事は、受信チャンネルを1にして電波が出てるか聞き耳をたてる。次はチャンネル2って具合に順繰りに調べる。(カーラジオなんかの、オートスキャンみたいな動き)

どれだけのチャンネルを調べるかと言うと、

バンド  ch番号      調査ch
-------------------------
2.4G    1-13ch     13ch分
5.2G    36-48ch     5ch
5.3G    52-64ch     5ch
5.6G    100-140ch   9ch

実質、13+5+5+9=32ch分を調べている。1chあたり、約100msって事で、妥当な値だろう。尚、5G帯は、番号が飛び飛びになっている。

ああ、この傍若無人な屋仮が使ってるwifiルーターは、ひょっとして外部アンテナを取り付けられるようになっていないかな。送信電力は電波法で最大13dBmだったかに規制されてる。ならば、パラボラアンテナを取り付けて、電波の放出先を絞るんだ。アンテナのゲインって馬鹿に出来ないからね。

その証拠に、宇宙からの微弱な電波を捉えるため、直径20mとかのパラボラアンテナが使われていたりする。アンテナ巡りが大好きな、あの人に聞いてみるまでもない。

オイラーは昔、悪い人に誘われて、1.2G帯の無線に手を出した事がある。あれぐらいの周波数になると、日本人の大発明の八木アンテナも難しい。で、どうするかと言うと、中華鍋ですよ。こやつをパラボラアンテナがわりに使うのさ。本当に好き者は、鍋を銀メッキするとか。表皮効果が、どうのこうのと講釈を垂れていたな。

doas

上記スクリプトは、root権限で実行しないと、値が表示されない。scanを実行出来るユーザーはrootに制限されてるから。じゃ、一般ユーザーはどうしたらいいの?

そりゃ、sudoいれておけば大丈夫。それってリナに毒されていないか。OpenBSDならではコマンドがデフォで用意されてるんだ。そのコマンド名は、doas。

このコマンドを使うには、doas.confを/etcに設定する必要がある。大丈夫、サンプルが置いてあるから、それをcpするだけでOK。

ob$ doas cat /etc/doas.conf
doas (sakae@ob.happy.net) password:
# $OpenBSD: doas.conf,v 1.1 2016/09/03 11:58:32 pirofti Exp $
# Configuration sample file for doas(1).
# See doas.conf(5) for syntax and examples.

# Non-exhaustive list of variables needed to build release(8) and ports(7)
#permit nopass setenv { \
#    FTPMODE PKG_CACHE PKG_PATH SM_PATH SSH_AUTH_SOCK \
#    DESTDIR DISTDIR FETCH_CMD FLAVOR GROUP MAKE MAKECONF \
#    MULTI_PACKAGES NOMAN OKAY_FILES OWNER PKG_DBDIR \
#    PKG_DESTDIR PKG_TMPDIR PORTSDIR RELEASEDIR SHARED_ONLY \
#    SUBPACKAGE WRKOBJDIR SUDO_PORT_V1 } :wsrc

# Allow wheel by default
permit keepenv :wheel

doas.confはrootしか読めないファイル。(先ほど、cpしといた)で、wheelユーザーのオイラーは、許可を貰っているんで、一時的にrootになって、同ファイルを読めたって訳。

このファイルの言う事には、wheelユーザーなら、現状の環境を使って、rootの権限(-u hoge-userとかも可)で、コマンドの実行をしても宜しいとな。

車輪の再発明と言うなかれ。セキュリティーに関するライブラリィーとかアプリは、外部のOSSは信用ならんて態度。余りにあほな実装に怒り心頭で、opensslを独自開発したのは、記憶に新しい。返す刀で、sudoも独自実装に走ったんだな。

LinSSID

今は亡きWindows7には、釣り用のwifiアナライザーが入っていた。確かInSSIDとか言う名前だったと思う。有名品で有料になってしまった。と言う事は、リナでも何とかSSIDと言う名前で、出ていないだろうか? 探すのは無料なんでやってみる。

debian:~$ apt-cache search ssid
dhcpcd5 - DHCPv4, IPv6RA and DHCPv6 client with IPv4LL support
forensics-all - Debian Forensics Environment - essential components (metapackage)
i3status - Generates a status line for dzen2, xmobar or i3bar
kismet-plugins - wireless sniffer and monitor - plugins
linssid - graphical wireless scanner
mdk3 - Wireless attack tool for IEEE 802.11 networks
missidentify - find win32 applications
suckless-tools - simple commands for minimalistic window managers
wpagui - graphical user interface for wpa_supplicant
xfce4-wavelan-plugin - wavelan status plugin for the Xfce4 panel
horst - Highly Optimized Radio Scanning Tool

色々出てきたけど、linssidってのが、怪しそうだなあ。頭に付いているlinってのが、いかにもって感じだ。入れてみるか。外れなら、直ぐに消せばいいんだから。

で、大当たりでしたよ。Windowsのそれを、そのまま移植しましたって感じ。debianはWindowsの代替品ですな。入れて良かったよ。

妄想

とまあ、普通の人が考えるアナライザーにお目にかかった。無線屋なら、もう少し発展したいな。

近頃のアマチュア無線用無線機は、高級機(何と100万円もする)だと、バンド(周波数帯)を、一望出来る機能が付いている。業界用語だと、ウォーターホールとか言ってるけどね。

時間の経過と共に、どの周波数で電波が出てるか一望できる。電波の強さは色で表すって具合で、いわば3次元表示。

例えば、 サンフランシスコの無線局が受信してるのを、Webから聞ける。色のついた画面が流れていくけど、黄色とか白の帯の所に局が居る。

wifiアナライザーも、こういう風にならないかね。横軸はチャンネル。電波が弱いチャンネルは、例えば青色、強いチャンネルは黄色表示するとか。一回スキャンしたら、色のバーを書く。 もう一回スキャンしたら、その下にバーを書く。こうすれば、時間の経過と共に、どのチャンネルが使われているか、一目瞭然。

この方法なら、一チャンネルに一文字を割り当てて、VGAなターミナルでも、それっぽく表示出来そう。

この方が、上で実装したiwstatより、遥かに良さそうだ。

凶器

上で作ったiwstat.shの実行ログを、Windows10側に入れたOpenBSDからsshでログインして、取ろうとしたんだ。が、哀れネットワークが切断されてしまったよ。どして?

思い当たるのは、相手側のNICがscanで占有されてしまって、sshへのサービスをブロックしてしまう事。そう思うなら、証拠を出せ。3秒考えて、pingすればいいじゃん。

ob6$ ping -i 1 xx.xx.xx.xx
PING xx.xx.xx.xx (xx.xx.xx.xx): 56 data bytes
64 bytes from xx.xx.xx.xx: icmp_seq=0 ttl=128 time=12.478 ms
64 bytes from xx.xx.xx.xx: icmp_seq=1 ttl=128 time=3.223 ms
64 bytes from xx.xx.xx.xx: icmp_seq=2 ttl=128 time=2.832 ms
64 bytes from xx.xx.xx.xx: icmp_seq=3 ttl=128 time=3.039 ms
64 bytes from xx.xx.xx.xx: icmp_seq=4 ttl=128 time=12.467 ms
64 bytes from xx.xx.xx.xx: icmp_seq=36 ttl=128 time=652.590 ms
64 bytes from xx.xx.xx.xx: icmp_seq=37 ttl=128 time=3.148 ms
64 bytes from xx.xx.xx.xx: icmp_seq=38 ttl=128 time=89.712 ms
64 bytes from xx.xx.xx.xx: icmp_seq=39 ttl=128 time=33.378 ms
64 bytes from xx.xx.xx.xx: icmp_seq=40 ttl=128 time=2.997 ms
64 bytes from xx.xx.xx.xx: icmp_seq=41 ttl=128 time=2.966 ms
64 bytes from xx.xx.xx.xx: icmp_seq=42 ttl=128 time=6.236 ms
^C
--- xx.xx.xx.xx ping statistics ---
43 packets transmitted, 12 packets received, 72.1% packet loss
round-trip min/avg/max/std-dev = 2.832/68.755/652.590/177.650 ms

pingを、-i 1 で、1秒間隔で発する。seq=4 あたりで、iwstat.shを起動。これでNICが 占有されて、応答出来ず。やがて、seq=36 あたりで、iwstat.shが終了して、正常に復する事となった。

rootの横暴である。ちょっとは、NICを休ませて、その間は下々の者たちにNICを解放(使わせて)あげよう。

iwstat.shのループの中に、例えば sleep 2 ぐらいを入れるといいかな。rootが3秒占有、下々が2秒使うっていう配分。

ob6$ ping -i 1 xx.xx.xx.xx
PING xx.xx.xx.xx (xx.xx.xx.xx): 56 data bytes
64 bytes from xx.xx.xx.xx: icmp_seq=0 ttl=128 time=12.571 ms
64 bytes from xx.xx.xx.xx: icmp_seq=1 ttl=128 time=12.657 ms
64 bytes from xx.xx.xx.xx: icmp_seq=2 ttl=128 time=5.606 ms
64 bytes from xx.xx.xx.xx: icmp_seq=3 ttl=128 time=3.328 ms
64 bytes from xx.xx.xx.xx: icmp_seq=8 ttl=128 time=64.836 ms
64 bytes from xx.xx.xx.xx: icmp_seq=13 ttl=128 time=66.663 ms
64 bytes from xx.xx.xx.xx: icmp_seq=18 ttl=128 time=97.010 ms
64 bytes from xx.xx.xx.xx: icmp_seq=23 ttl=128 time=106.144 ms
64 bytes from xx.xx.xx.xx: icmp_seq=28 ttl=128 time=25.539 ms
64 bytes from xx.xx.xx.xx: icmp_seq=33 ttl=128 time=37.724 ms
64 bytes from xx.xx.xx.xx: icmp_seq=38 ttl=128 time=60.619 ms
64 bytes from xx.xx.xx.xx: icmp_seq=43 ttl=128 time=78.691 ms
64 bytes from xx.xx.xx.xx: icmp_seq=44 ttl=128 time=5.565 ms
64 bytes from xx.xx.xx.xx: icmp_seq=49 ttl=128 time=5.569 ms
64 bytes from xx.xx.xx.xx: icmp_seq=54 ttl=128 time=38.952 ms
64 bytes from xx.xx.xx.xx: icmp_seq=55 ttl=128 time=3.677 ms
^C
--- xx.xx.xx.xx ping statistics ---
56 packets transmitted, 16 packets received, 71.4% packet loss
round-trip min/avg/max/std-dev = 3.328/39.072/106.144/34.274 ms

やはり、4秒過ぎあたりで、iwstat.shを起動。途切れ途切れで下々の者にサービスが 回ってくるけど、これぐらいの解放時間じゃ、甚大な被害が有るなあ。

まあ、絶対神のrootのやる事には、逆らえません。神は偉大なり。

61 packets transmitted, 61 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 2.575/6.614/22.293/5.101 ms

ちなみに、上記の統計は、無負荷のマシンへのping。やはりwifiを経由しての通路は ばらつくのね。

sort

気になったので、sortの挙動を調べておく。まずは単位無し

ob6$ sort hoge
-12
-44
-5
-57
13
3
ob6$ sort -n hoge
-57
-44
-12
-5
3
13

今度は、単位付き

ob6$ sort  hoge
-12dBm
-44dBm
-57dBm
-5dBm
13dBm
3dBm
ob6$ sort -n hoge
-57dBm
-44dBm
-12dBm
-5dBm
3dBm
13dBm

そういうのは、スクリプトを書く前に、調べておくものだろうに。ごもっとも。

OpenBSD in VMware

6.3 amd64を気分を変えて、vmwareに入れてみた。ちゃんとXが使えるように、xenodmなGUIの ログイン画面を起動するように設定。

初回の起動で、ファームウェア intelってのが入った模様。次回からは、startxで起動させてる。