読者です 読者をやめる 読者になる 読者になる

おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

WiresharkでApple AirPrintを覗き見するのだ(その1)

ときどき誤解されているフシがあるんですけど、私は技術的にはホントーにしょぼいんですよ。とくにここ数年は、「技術はもっと知ってる人にお願いする」ことに注力してたから。ということで今回もすげーしょぼいネタなので、間違えても鵜呑みにしないでくださいナ。

ということで今日は昨日の予告通り、WiresharkApple AirPrint を追いかけてみようって趣向と相成りました。

AirPrint のしくみ

AppleiOS 向けに提供しているソリューションに Apple AirPrint ってのがあります。これの仕様がみんなの見えるところに公開されてるかってのは知らないんですが*1、基本的にはこのエントリに解説されているとおり:

  • Bonjour (= Zeroconf) で次の条件に一致するサービスを検索する
    • _universal サブタイプに _ipp がある (= IPP がしゃべれる) こと
    • TXT レコードに URF の文字があること
  • 印刷ジョブは IPP で投げられる。ジョブの設定情報も。
  • iOS 4 の時点では URF というデータ形式は使われず、常に PDF で印刷される*2

というものです。

ここで肝心なのは、Bonjour の検索対象は「サービス」であって「プリンター」ではないということです。つまり、上記の条件を満たすものが、プリンター自体なのかそれ以外のものなのかは、iOS の側は知りませんし知る必要もありません。ですから、上記の問い合わせに答えられて PDF を IPP で直接受けられるプリンターがあれば、そのプリンターは AirPrint 対応ということになりますし、PC 側で適切なサーバーを動かして同じ条件を整えてあげれば、PC を経由してプリンターに印刷したり、あるいは PDF を受け取って適当な処理を行うこともできます。

そして、Linux (というか Ubuntu のあるバージョン……11.04 かな?……以降) の CUPS 印刷システムでプリンタ共有を ON にしておくと、この条件が自動的に満たされるんですね。ということで Ubuntu を踏み台にして iOS から印刷できますよと。

というのはもう既知なんで、別に Wireshark を持ち出す必要なんかゼロなんですけど、実はこんなプリンターが気になってるんですよねー。コイツが Linux から素直に使えるとは思えないので、当然パケットキャプチャして追っかけることになるのかなー、じゃあプロトコルがある程度分かってるもので練習しようかなーと、そんだけなのですね。

Wireshark のインストールと起動

これはさくさくっと:

$ sudo apt-get install wireshark

で終わり。あー簡単。

で、起動してみたら、「見ることができるポートないよーん」だって。おぅふ。

そっか、ethX とか wlanX とか直接さわりに行くのか、そりゃ権限足りないから無理だよな、じゃあ sudo で起動しちゃえ(マネすんなよ)、えいっ、っと:

$ sudo wireshark

したら、こんなふうに怒られた。

ふむふむ、root で起動するのヤバいから /usr/share/doc/wireshark-common/README.Debian 見なさいってか。はいそうしましょ。ということで見てみた。

I. Capturing packets with Wireshark/Tshark

   There are two ways of installing Wireshark/Tshark on Debian:

   I./a. Installing dumpcap without allowing non-root users to capture packets

      Only root user will be able to capture packets. It is advised to capture
      packets with the bundled dumpcap program as root and then run 
      Wireshark/Tshark as an ordinary user to analyze the captured logs. [2]

      This is the default on Debian systems.
      
...

はーい、デフォルトで推奨されてるやり方があるならそれ使いましょ。

ということで、うーん、要は↓のようにやってから (wlan0 なのはこのマシンが無線でつながってるから):

$ sudo dumpcap -i wlan0

適当にごにょごにょやって、/tmp 以下にできるログファイルを一般ユーザでも見られるように chmod o+r して、wireshark で開けばいいのかな……お、できたできた。

ここらへん、ホントーにこんなやり方で合ってるかどうか自信ないので、間違ってたら誰か教えてちょ。

Bonjour なやりとりを見てみよう

とりあえず wireshark を開けて dumpcap で取ったログをえいっと開くと、ごちゃごちゃっと出てきますね。

よくわかんないのでとりあえず MDNS なものだけ拾い読み。

すると、224.0.0.251 にガンガンリクエストが飛んでて、これが Bonjour のブロードキャストですよね。んでぽろぽろっと返信が来てて、例えばこの PC で共有設定にしてる Generic PCL 6/PCL XL を例に取ると:

ほらこんなふうに、さっきの条件を満たすようになってるわけですねー。

ので、私の手持ちの iOS 稼働デバイス *3 でこうやって見えるわけです。

と、時間切れ

おっと、今日のウチに公開できないので、続きはまた明日っ。

……よかった、明日別のネタをひり出さなくて済みますねwww

*1:当然私の前職を含むプリンターベンダーには公開されているはずですが、私はこういう NDA っぽい情報は自分が汚染wされないために避けてたので、どんな具合に公開されてたんだか知らないのです。

*2:iOS 5 ではどうだか調べてません。

*3:中古で買った iPhone 3GS にダミー SIM 差してるやつ。なんで iPod Touch にしなかったのは本人も謎。