cloretsblackのテクニカルノート

言葉の意味はよくわからんがとにかくすごい自信だ

技術書典5に参加してきました

技術書典5に参加してきました。

今回は「BashOSSで作る常設パケットレコーダー」を頒布しました。

f:id:cloretsblack:20181009213924j:plain

ふとったなあ、僕。。

実は過去に発表した1作目2作目ではパケットキャプチャを取り上げて解説していても、実際のネットワークではなく、サーバ内のプロセス間通信やシミュレータ上の動作確認に使用するという少々トリッキーな使い方を紹介していました。 ですので、今回はやっと実際のネットワークでパケットキャプチャを使ったトラブルシューティングを行うという、今までの遠回りを正道に戻すと言う位置づけの作品になっております。ご質問等はTwitter等でお寄せいただいてかまいませんので、是非感想などお聞かせいただければ大変励みになります。

今回は1万人を越えるエンジニアがご来場されたと言う事でしたが、立地の良かった前回よりも売り上げは落ちました。黒ブラの実力不足もさることながら、 やはり、パケットキャプチャ本に足を止めてくださる方はまだまだ少ないなと感じました。 パケットキャプチャの認知度が低いということは技術のマーケットが狭いと言う事ですので、何らかの方法でもっとアピールできないか考えてみる事にします。

今回の「BashOSSで作る常設パケットレコーダー」はスクリプトベースの簡単な仕組みながら、継続的に動作させる事のできるパケットレコーダーの解説とパケットキャプチャ装置設置の際のポイントや実際のトラブルシューティングの流れなど実践的な内容です。 以下のページにてお買い求めいただけますのでよろしくお願いします。

develup-japan.co.jp

ギンギラギンにさりげなくTCPコネクションを可視化してみた

私は普段、ネットワークを運用する人々のためにどうやったらネットワークをよりよく可視化出来るか、みたいな事を考えているわけなんですが、何をトチ狂ったのか、いっそのことアートっぽくしてみたら良いんじゃないかという思い付きを得てしまったので、形にしてみました。

一般的に、スイッチのアクセスインジケータはフレームの通過をLEDランプで可視化しています。同じノリでTCPの各種フラグを可視化してみたら、「なんか今日はRST多いなー?」とか「SYN多くね?サービス落ちてんの?」みたいなことがなんとなく分かるんじゃないかと思ったわけなのです。

フラグにそれぞれ色を割り当てて、パケットが通過するたびにLEDを光らせてみたいと思います。 「Crystal Signal Pi」 というRaspberryPiを使ってマルチカラーLEDを光らせるキットが販売されていたので使ってみました。

今回使用した「Crystal Signal Pi」 にはWEBサーバが用意されており、curlで色や光り方を指定して信号を送るとLEDがパカパカ光る仕組みになっています。 パケットキャプチャとして取得したデータをPythonでフラグだけ抽出し、フラグに応じてcurlを送る事にします。 継続的にパケットを取得する仕組みには、ソナーマンを使います。

手前味噌で大変恐縮ですが、ソナーマンは私、黒ブラが開発しておりますパケットレコーダー製品です。 継続的にパケットキャプチャを収集し、車のドライブレコーダーのように、障害が起きたその時にネットワークがどういう状態だったのかを後から検証できる大変便利な商品でございます。 コレを説明しだすと長くなりますので詳細は割愛します。 一応リンクだけ貼っておきます。 develup-japan.co.jp

スイッチはNETGEARのGS108Eを使用しました。実売5,000円前後でミラーリング機能が付いているので、非常に使い勝手が良いです。僕は大好きです。

さて以下のようにTCPフラグに応じて光らせる色を決めます。

SYN …青
SYN+ACK …白
ACK+PSH …緑
FIN+ACK …オレンジ
RST …赤

コネクションの開始と終了が青から赤に向かって見えると直感的に理解しやすいと思います。 なお、ACK+PSHフラグは大量に出現するので、初回の3回のみ光らせるという制限を入れています。

コードは以下の通りです。 /capture/cap/以下のパケットキャプチャファイルを連続して読み込み、LEDを光らせていきます。

import dpkt
import os.path
import glob

file_list = sorted(glob.glob('/capture/cap/*.pcap'))
for filename in file_list:
    with open(filename, 'rb') as f:
        p = dpkt.pcap.Reader(f)
        counter = 0

        for ts,buf in p:
            eth = dpkt.ethernet.Ethernet(buf)
        #ipv4
            if type(eth.data) == dpkt.ip.IP:
                ip = eth.data
                if type(ip.data) == dpkt.tcp.TCP:
                    tcp = ip.data
                    fin_flag = int(( tcp.flags & dpkt.tcp.TH_FIN ) != 0)
                    syn_flag = int(( tcp.flags & dpkt.tcp.TH_SYN ) != 0)
                    rst_flag = int(( tcp.flags & dpkt.tcp.TH_RST ) != 0)
                    psh_flag = int(( tcp.flags & dpkt.tcp.TH_PUSH) != 0)
                    ack_flag = int(( tcp.flags & dpkt.tcp.TH_ACK ) != 0)
                    urg_flag = int(( tcp.flags & dpkt.tcp.TH_URG ) != 0)

                    curlcmd = ""

                    if syn_flag == 1 and ack_flag == 1:
                        curlcmd ="curl 'http://localhost:8080/ctrl/?color=50,200,255&mode=1&repeat=1&period=300'"

                    elif syn_flag == 1:
                        curlcmd ="curl 'http://localhost:8080/ctrl/?color=00,00,255&mode=1&repeat=1&period=300'"
                        counter = 0

                    elif ack_flag == 1 and psh_flag == 1 and counter < 3 :
                        curlcmd ="curl 'http://localhost:8080/ctrl/?color=00,255,20&mode=1&repeat=1&period=300'"
                        counter += 1

                    elif fin_flag == 1 and ack_flag == 1:
                        curlcmd ="curl 'http://localhost:8080/ctrl/?color=255,127,0&mode=1&repeat=1&period=300'"

                    elif rst_flag == 1:
                        curlcmd ="curl 'http://localhost:8080/ctrl/?color=255,00,00&mode=1&repeat=1&period=300'"

                    if curlcmd != "":
                       req = os.system(curlcmd)

パケットキャプチャからフラグを読み取る処理時間と、光らせる秒数を一律300msに設定している関係上、完全なリアルタイムにはなりませんでした。しかし、完全にリアルタイムである必要はなく、雰囲気が伝わればOKということであまり深く考えない事にします。楽しければ良い。

ビカビカ光るんだけども、いつものネットワークをさりげなく可視化してくれるシステムと言う事で、近藤真彦御大の「ギンギラギンにさりげなく」をバックミュージックにデモムービーを作りましたので、ご覧ください。

youtu.be

こんな動画を作ってる暇があったら技術書典の原稿を進めろというツッコミはご遠慮ください。本人は気にしておりますので。

技術書典に参加して「VMとコンテナで作るポータブルネットワークシミュレータ」を販売しました。

今回は「VMとコンテナで作るポータブルネットワークシミュレータ」を新刊として販売させていただきました。既刊の「パケットキャプチャで見てみよう MySQLデッドロック編」もまあまあ売れ、利益も出ました。 サークルチェックは、2週間前まで30だったのに、3日前あたりから急に増えててびっくりしました。最終的に140くらいになりました。

弊サークルの本はすべてPDFダウンロードなので、途中増刷に走ってもらい、30部在庫を追加して販売を続けましたが、やはり一日中続けるのは体力的にかなりツラく、鍛錬が必要だなと思いました。

PDFダウンロードで販売するという方針は、弊サークルの商品ラインナップがすべて、構築手法とその手順を紹介する「クックブック」であるため、構築に使用したコードをコピペできないようではクックブックの価値が半減するという考えに基づいています。(在庫リスクや製本、運搬コストを最小化できるという経済的な理由も大きいですが。)

弊サークルは出口近くでほとんどの方が通られる一角にブースを配置していただいたので、場所がものすごくよかったです。ラッキーでした。

しかし人目を引くPOPを用意できなかったため、もったいない事をしました。。

今回販売したネットワークシミュレータ本は、自分で作ってみるとよくわかる不具合(環境を持ち運びしづらい、VM on VMは重い)を解決するための方法を解説したものです。 この環境はハンズオンセミナーなどに適していると思うので、社内教育でも活用したいと考えています。

早速試してくださった方からお喜びの声が!励みになります。

前回の技術書典3から販売しているパケットキャプチャ本はMySQLデバッグを志向しており、アプリケーションエンジニアの方も少し興味をひかれていたようです。パケットキャプチャはよくわからないけど、MySQLデバッグでは困っている、という方もいましたが、やはりパケットキャプチャは敷居が高いようで、何か敷居を下げる良い方法はないかと考えています。どなたか良いアイデアがあれば教えてください。

技術書典の大きなメリットの一つに作者と読者の距離が近いというものがあります。 クックブックの通りに作ってみたけど、うまく動かない、ここをこう変えてみたいけど、どうすればいいのか?など、著者にもよると思うのですが、黒ブラ的にはそういったフィードバックは大歓迎ですので、どんどんお寄せいただければできる限りお答えし、あわよくば次のネタにしたいと思います。

最後に、会場を用意してくださった技術書典スタッフの方々、スポンサーの皆様に感謝申し上げます。 当日各ブースには水分補給のためのメルカリ水が! お心遣い、大変ありがたかったです。

f:id:cloretsblack:20180425195554j:plain

なお、ダウンロード販売も用意しておりますので、よろしければぜひご購入ください!

develup-japan.co.jp

develup-japan.co.jp

4/22 技術書典4に新刊出します

告知です。
4/22 秋葉原UDX アキバ・スクエアで開催される技術書典4に参加します。 サークルDevelup お‐01ブースでお待ちしています!

今回は「VMとコンテナで作るポータブルネットワークシミュレーター」という本を出す予定です。

f:id:cloretsblack:20180410225042p:plain

コマンド、プロトコル仕様の確認、検証作業などに便利なネットワークシミュレータを、VMベースで、コンテナを用いて軽量に作り込んでしまおうという企画です。
コレが実現できれば検証環境を引き継いだり、学習をはじめとする情報共有もスムーズになるかも、というアイデアです。 サンプルとしてソフトウェアルータを用いたマルチパスBGPの構築と、障害試験、パケットキャプチャによる解析手法をご紹介します。

黒ブラの年末年始がたっぷり詰まっていますので、お買い得のはずです!

ぜひご来場いただき、お手にとっていただければと思います。 よろしくお願いします!

技術書典3で同人誌を販売しました。オンライン販売もあります。

先日ブログにて告知させていただいたとおり、10/22の技術書典3で「パケットキャプチャで見てみよう MySQLデッドロック編」を販売させていただきました。

今回のイベント参加でやったこと、感じたことなどを少し書き留めておきたいと思います。

f:id:cloretsblack:20171029145448j:plain

御礼

台風の中、足を運んでくださり、また本をご購入いただいた皆様、ありがとうございました。すばらしい運営をしてくださったイベント関係者の皆様、売り子をお願いした友人にも感謝致します。

技術書を書くということ

技術書を書くのは初めてだったのですが、参考書は色々読んできたので、どういうものを作ればよいかはある程度頭の中にありました。テーマが「パケットキャプチャ」なので、手元で色々できる環境が便利だと思い、クックブックとして作りこんでいくことに決めました。
実際の執筆期間は3ヶ月くらいでしょうか。勤務先の仕事もバタバタしていましたので、早めに仕上げてゆっくり修正するペース配分でした。今回は環境をそのままVMとしてダウンロードさせようかとも思ったのですが、容量の関係で現実的でなくなったため、Dockerを採用して環境を配布する事にしました。このあたりについては、かつてハンズオンセミナーを開催した際に学んだノウハウが非常に役に立ちました。
執筆ツールはGoogleDocsです。勤務先で昼休みとかにもちょっとずつ書きました。他の参加者の製作記録を読むと、表記ゆれなどを防ぐための仕組みがあったり、Gitを使ったりと、非常にカッコいい感じだったので次回は真似するかもしれないです。
今回最も苦労したのはMySQLデッドロックを意図的に発生させるWEBアプリケーションを作った所です。本の中ではほとんど一瞬で流されている箇所ですが、通常そのような目的を持った実装例があまりないこともあり、すこし試行錯誤を行った部分でもあります。

値決め

今回は一部1000円で販売しました。企業として参加していたこともあり、事前のサークルチェックなどでの数字を元に経済合理性を考慮したうえで設定させていただきました。直前のチェック数で30とかだったので、やっぱりマイナージャンルは厳しいよなぁと思いました。あと、経済的に余裕のない学生さんを対象に、「学生証を提示してくれれば半額キャンペーン」とかやっても喜ばれたかも。。?この辺は次回検討します。

配布形態

今回はダウンロード販売のみとし、A4のカラーコピーにQRコードを印刷し、100枚ほど用意しました。安いカラーコピー屋を探し、結局自宅近くのダイソーで一枚30円で刷りました。印刷屋さんに出さなかったのは滞留在庫のリスクと製本コストを許容できなかったためです。

売ってみた感想

A4カラーコピー一枚ッペラがそこそこのペースで1000円札と交換されていく様は結構気持ちがよかったです。売り子をしてくれた友人曰く、「えっ、これ売れんの?」と衝撃を受けていたみたいです。今回、友人がホワイトボードに絵を描いてくれました。技術書典3のイベントイラストに描かれている女性の顔がガイコツになっています。ひそかに黄金バットを思い出しましたw

https://techbookfest.org/assets/tbf03/images/top.png

当初見本誌を用意せず、目次だけ貼り出していた(すっかり忘れていた)のですが、実際にやってみて、見本誌の存在は重要だと思いました。特にダウンロード販売では、購入者の立場的にもあったほうが良いのは間違いないです。 ちなみに、販売ブースに見本誌がないことを知った知り合いの方が、当日コンビニで印刷してきてくださったので、後半からは見本誌をおいた状態で販売する事ができました。 前半と後半を比較すると、明らかに購入する人が増えました。セールストークもしやすいので、ノウハウとして見本誌は超重要だと分かりました。

具体的には、

  1. ブースの前で視線を送っている人に「見本誌、読んでってくださーい!」と声をかける。
  2. 本を手にとって、パラパラ見て本を戻す時に「パケットキャプチャとかお仕事で使われますか?」等と話しかける
  3. 具体的なユースケースが聞ければ、適宜参考になりそうなTipsやコメントをする

…というような感じで楽しく会話しつつ、最終的には執筆コストもまあまあ回収したので、初めてにしては上出来だったのではないかと思います。

宣伝

イベント前に勉強会でLTとかして宣伝しました。勉強会で知って来てくださった方もいらっしゃいましたので、そこそこ宣伝効果があったかもしれません。苦労の大部分を台風が吹き飛ばした気もしますが。。
宣伝といえば、イベント前に別件でTwitterがバズり、黒ブラのプロフィール画面と固定ツイートが非常に多くの方に閲覧されていたようです。しかし同人誌の告知をしていた固定ツイートのインプレッションが29700で、ふぁぼ(いいね)が衝撃の97、実に0.32%。バズる前に告知していた時点からほとんど増えていないという悲しい現実を見てしまいました。
なんか広告って難しいなぁ。(小並感)

オンライン販売について

以下のサイトでPaypal決済にてオンライン販売を行っております。 地方の方や台風で当日来られなかった方もいらっしゃるようなので、ぜひお買い求めください。

develup-japan.co.jp

決済やダウンロードに問題が発生した場合は上記サイトのコンタクトページかTwitterでご連絡ください。

NetOpsCoding#5 × ネットワークプログラマビリティ勉強会#13でLTしました。

以下に資料を公開しました。

www.slideshare.net

5分のLTだったので簡潔な内容ですが、黒ブラの職場で実際に起きたことをネタにしてみました。たぶん運用現場ではあるあるネタではないかと思います。

ぶっちゃけユーザー企業の情シスとしては、対応開始から原因究明+暫定対応まで、約1時間というタイムは悪くないと思っています。
この環境は障害対応時間をなるべく削減したいと願い、政治的にもかなり大ナタを振るった結果なので、いざ同様の環境を作ろうとすると、なかなか難しい部分もあると思います。

もしご興味があれば、コメントなどいただけると励みになります。
Twitterでもリプライやメンションいただければ反応しますのでよろしくお願いします。

同人誌出します

f:id:cloretsblack:20170930172608p:plain:w300
同人誌表紙

前回の投稿で、少し予告っぽく書いていたのですが、来る10/22(日)技術書典3 (会場:秋葉原UDX)において、パケットキャプチャの応用例とお手元で動作する環境を構築するためのクックブックを頒布します。

WEBシステムにおいて、データアクセスはアプリとインフラが入り混じる領域ではないかと思います。この領域におけるエラートラップと監視という課題に対し、データベースのコネクションをソケット経由にする事でパケットキャプチャというネットワークのデバッグ手法を応用する事ができます。
今回は例としてデータベースへのCRUDと内部エラー(デッドロック)をパケットキャプチャで解析してみました。また、エラーの検知から警告へ繋げる一連のシステムについても実装例を紹介しています。

ちなみに今回一番時間がかかったのはデッドロックを人為的に発生させるWEBアプリケーションの開発です(笑)

現時点でサークルチェック数が12と、非常に不安を掻き立てられていますが、何事も経験だと思いますので、とにかくやってみようと考えています。
配布はPDFですので、品切れはありません。
是非「い07企」ブースへお立ち寄りくださればありがたく思います。

techbookfest.org