helloworlds

not a noun, it's a verb

【VR】Oculus GoをPCへミラーリングさせる(無線)

先日Oculus Goが家に届きました!

私が購入したのは、これ。

www.oculus.com

64GBの方を選びました。 俗に言うスタンドアローンというVR機器になるようです。

カートに入れて、購入完了して数時間で発送しますね!というメールがきました。 大体到着まで5日間ほどで手元に届きました。

「けっこうはやいな!」

中身を見てみるとけっこうシンプルにまとまっていました。 メガネを日頃かけている方でも安心。 メガネをかけている人用のアクセサリーみたいなのも付いていて、 スマホのアプリからOculusの設定をする時に、装着ムービーも丁寧に紹介されていました。

(※ わかりやすいように、画像を載せようかと思っていたのですが、この記事では割愛します。が、その分丁寧に書いてくつもりです! また、後日画像を掲載させていくかもしれません。合わせて詳細も追記していければと思います。)

ここから、"PCへのミラーリング"について順をおって説明します。 今回は以下の記事を参考にさせて頂きました!さっそく先人の方に感謝...!!

Oculus Goの画面をPCにWirelessでミラーリング表示する

準備

まず、色々準備が必要です。 すんなりいけば大丈夫ですが、私はある設定で少し詰まりました... スマホアプリの開発を経験されている方はけっこうすんなりいきそう...

では、まず環境から。 あくまで私の環境ですので、他の環境では試していません。随時、自分にあった環境の設定方法をググる必要があるかもしれません。

環境: Windows10 (デスクトップPC) ブラウザ: Chrome

1. スマホアプリと連携

iPhoneならApp Storeで、AndroidならPlayストアOculusというアプリをダウンロード。

ログインを行い(アカウントを作成する必要があります)、手順に従って連携完了まで行う。

1-2. 開発者モードにする

ミラーリングするにしても、Unityで開発を行うにしても Oculusに対して開発者モードに設定する必要があります。

まず、以下のURLへ移動しログインします。

https://dashboard.oculus.com

そうすると、「新しい団体の作成」という画面が表示されるかと思います。 任意の団体名を記入し、送信し、完了させます。

完了すると以下の画面が出てくるかと思います。

f:id:o21o21:20180531111157p:plain

一旦これでOKです。

スマホアプリに戻ります。

画面下部メニューの"設定" -> 接続しているOculus(シリアルナンバー付)をタップ

-> ”・・・その他の設定” -> "開発者モード" -> スイッチを"有効化" (青色にする)

これで完了です。

2. Android Studioをインストール

続いては、PCの方です。

色々調べてみると、ミラーリングするだけだったらadbコマンド (Android Debug Bridge)が使用できていれば問題なさそうです。 なので、既にAndroidの開発などをされている方は、不要かもしれません。 ここでは将来的にUnityでOculus Goを開発することを目的にしたいので、一気にAndroid Studioをインストールします。

公式: Android Studio概要

以下のURLに行って、ダウンロードします。

Download Android Studio and SDK Tools  |  Android Developers

f:id:o21o21:20180531114053p:plain

  1. ダウンロードした.exeを開きます。
  2. 特に指定がなければ全部デフォルトでインストール&Nextボタン押下で大丈夫です
  3. 全てのインストールが完了すると、Android Studioを起動します
  4. ウィンドウ下部にある、Configure -> SDK Manager を選択
  5. 左メニューAndroid SDKを押下し、タブSDK Platformを選択。
  6. API Level19以上のものにチェックを入れます
  7. タブSDK Toolsを押下し、LLDBGoogle USB Driverにもチェックを入れます
  8. ウィンドウ下部のOKを押下し、Component Installerが開かれインストールが開始されます

ここまでできたらウィンドウを閉じて大丈夫です。

3. adbコマンドを試す

Android StudioをインストールしてSDKもインストールできれば、 Windowsコマンドプロンプトadbコマンドが使用できているでしょう。

ここで、付属していたUSBケーブルとPCを接続します!

私の場合はここでadbコマンドが使用できず、 "’adb’は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません"

と、出力...

「なんでやあああああぁぁ!!!」

とか言いながらググりました。

結果、環境変数のPATHが通っていないことが判明。 いつもやってんのに... 普段Windowsあんまり使わないから見落としてた。 (私の場合は早期に環境変数に気づきましたが、PATHがさらに間違っていたから時間とりましたww)

もしコマンドが使用できないなら、コントロールパネルを開いて、 システムとセキュリティ -> システム -> 左メニューのシステムの詳細設定 -> 詳細設定タブ環境変数(N) -> 環境変数PATHを選択して編集 -> 新規

ここで私は2つPATHに対して新規で追加。

C:\Users\ユーザ名\AppData\Local\Android\Sdk\platform-tools
C:\Program Files(x86)\Android\android-sdk\platform-tools

ちゃんとPATHがは自分で確認してください!! 上記のpathを参考にエクスプローラーからポチポチしていけば確認できかと思います。

そして、いざコマンド実行。

> adb devices
List of devices attached
xxxxxxxxxxxxxxxxxx        unauthorized

「NOOOOOOOOOぉぉぉぉぉ〜〜〜!!!」

なんか権限ないですやん...

まあ、ただadbコマンドは使用できていてOculusは認識しているっぽい。

ふむふむ

ってことは、どっかで権限を有効にしてやるかんじかなと、またググる

本来?というかAndroid端末であればどうやらUSBデバッグの許可の取り消しなるオプションがあるらしい。 ただ今回はOculusさんだぞ...

「どこを探してもない.... おおおおおおおおおお」

ってなってたらオキュラスのレンズから光が見えた!!!!www

USBデバッグの許可は、Oculusの画面から許可してあげる でしたwww

すげえバカでしたが、まあよしとする。

一応なのですが、adbサービスの再起動として、以下のコマンドを実行させます。

# 停止
> adb kill-server

# 起動
> adb start-server

ということで、もう一度デバイスの確認実行。

> adb devices

List of devices attached
xxxxxxxxxxxxxxxxxx        device

OK。

続いてOculusのIPを調べる。 無線LANなのでwlan数値を指定します。 ちなみにeth0は有線。

> adb shell ip addr show wlan0

出力された情報のinetの横にIPが確認できるかと思います。 おそらく192.168.xx.xxみたいに出てるかな?

adbでportを開放

portを開いていきます。 portの範囲は、5555~5585の範囲で奇数を指定したほうがよさそうです。 こちらがadb の仕組みです。

今回は公式で紹介されている通り5555で試します。

> adb tcpip 5555

これでUSBを介して、port5555でTCP/IP 接続をlistenするようにOculusを設定しました。

ここで、PCに接続しているOculusをUSBケーブルを抜きます

※ 接続切れている場合は、adb connect <IP>:5555 で接続にトライしてみてください。

Vysorの設定

ここまできたら、あとはVysor(バイザー)のインストールと設定のみです。

Vysorとは、ブラウザChromeで動くアプリケーションです。 スマホ画面をパソコンへミラーリングさせるアプリのようです。わたくし初見でした。

まず、ブラウザにインストールします。

Vysor - Chrome ウェブストア

すると、chrome://apps/ に追加されていると思います。

起動させます。

起動させたウィンドウ上部にOculusの接続が確認できていればOKです。 もし、確認できていなければ、Settingsの上にあるConnectボタンを押下。

コマンドプロンプトで確認したIPとportを指定して接続します。

これでOculus Goを開始すればミラーリングできているかと思います!!!!!

f:id:o21o21:20180601001606p:plain

自分では見えねえよってかんじですがww

Discordの画面共有で友人にみせてあげましたww

当人いわく、「画面見れてるよ!!! ただお前ほどの感動はない」

とのことでしたwww

やはりVRで見れないので、購入してVR体験してもいいかもしれませんね!!

次回は、Unityでのプロジェクト環境構築&作成考えています。

以上.

【Grafana】Grafanaとは?簡単に調べてみた

今回はGrafanaについて記事を書きました。

まだ、私自身初心者ですので入門編という内容になります。

(どんなツールなの?ってかんじなので、内容は薄めです。)

f:id:o21o21:20190215112536p:plain

こちら、公式サイトです。

grafana.com

Grafanaとは??

いきなり公式ページより引用します。

Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data driven culture.

和訳すると、

Grafanaを使用すると、どこに格納されているかに関係なく、メトリクスのクエリ、視覚化、警告、および理解を行うことができます。ダッシュボードを作成し、調査し、そしてチームと共有し、データ駆動型の文化を育みます。

どうやらKibanaのような視覚化されたダッシュボードがイメージできるかと思います。

メトリクスなのでAWSのCloudwatchとかもイメージできますね。

では、そうしたサービスからの差別化(特徴)はどういったものがあるのでしょうか。

公式で紹介されている特徴を簡単にまとめていきたいと思います。

特徴

主な特徴は以下の6つが挙げられています。

  • Visualize
  • Alert
  • Unify
  • Open
  • Extend
  • Collaborate

簡単に視覚化ができること。ダッシュボードを見てみると、非常に中二病... じゃなくて、キレイな見た目をしています。個人的には、シンプルな見た目をしていると思います。

タブメニューや日付系がまとまっており、ゴチャゴチャしていないのもいいと思います。

もちろん、アラート機能もあってSlackなどのツールに通知を送信することも可能です。

AWSのCloudwatchやZabbixなどのデータソースを統一することができます。

その他プラグインが用意されていて、基本的になんでも実現しそうなツールであることがわかりましたw

どうやらAWSの料金も視覚化できるようです。

オープンソースなので基本無料。また、Grafana Cloudという有料のサービスもあって、現時点(2019.2)、スタンダードで$49/monthで利用可能なようです。

Grafana Cloudの方は、Grafana自体の安定性を保証してくれるようです。

24x7x365って書いてあるので、24時間365日Grafanaの面倒をも見てくれるようです。 用途によっては、かなり安く利用できる方なのではって思ってしましました。

Grafana Cloud: A fast, fully managed metrics platform | Grafana Labs

デモ

以下、公式にあるライブデモです。導入する前に確認してみるといいかもしれません。

play.grafana.org

ドキュメント

docs.grafana.org

ドキュメントに導入方法が載っています。

かなり簡単にインストールできるので1日で体感も可能ですね!

設定

ここでは設定の説明は割愛。

けっこう記事が出てくるのググればたくさん出てくることがわかりました。

公式にはリバースプロキシがある場合の設定なども載っていたので安心ですね!

http://blog.serverworks.co.jp/tech/2016/03/11/play-with-grafana-1/

あとは、チームや個人の意向によって構成が変わってくるので、いろいろ試してみてといったところでしょうか笑

以上.

【AWS】EC2&EBS メモ

EC2 (Amazon Elastic Compute Cloud)

参考と引用: Amazon EC2 とは - Amazon Elastic Compute Cloud

セキュリティグループ、IPの種類(EIP)は記述しない。

インスタンスとAMI

Amazonマシンイメージ(AMI) は、ソフトウェア構成を記録したテンプレート。

f:id:o21o21:20190207092927p:plain:h250:w250

インスタンス

1つのAMIから複数の異なるタイプのインスタンスを起動できる。

インスタンスタイプとは、本質的に、インスタンスに使用されるホストコンピュータのハードウェアを決定するもの。 インスタンスタイプは、インスタンス上で実行するアプリケーションやソフトウェアに必要なメモリの量と処理能力に応じて選択する。

インスタンスの一覧は以下。(インスタンスファミリーによる特徴も記載あり)

インスタンスタイプ - Amazon EC2 (仮想サーバー) | AWS

AWSアカウントでは、稼働できるインスタンスの数に制限がある

オンデマンドインスタンスの実行はインスタンスファミリーをまたいで最大で合計 20 個、リザーブインスタンスの購入は 20 個に制限されます。

インスタンスストレージ

インスタンスのルートデバイスには、インスタンスの起動に使用されるイメージが含まれる。

インスタンスストアボリュームと呼ばれるローカルストレージボリュームを含むことができて、 これはブロックデバイスマッピングによって起動時に設定できる。

しかし、マウントして使用することは可能だが、インスタンスが停止、失敗、終了するとボリュームのデータは失われる。 なので、一時データとして使用するのが最適である。永続的なデータは、S3かEBSボリュームに格納する必要がある。

AMI

AWSは、一般的な用途のためのソフトウェア設定を含む多くのAMIを公開している。

また、自身でAMIを作成することも可能である。

Webサーバー、関連する静的/動的コンテンツ(コード)は、AMIに含まれる。 新しいインスタンスをすばやく起動させるためには最適である。

すべてのAMIは以下からなる。

リージョン(region)とアベイラビリティゾーン(AZ)

f:id:o21o21:20190207111145p:plain:h250:w450

インスタンスを起動するときは、同じリージョン内にあるAMIを選択する。 別リージョンで起動させたい場合は、AMIを使用したいリージョンにコピーして使用することができる。

※ リージョン間でのデータ転送は料金がかかる。また、各AWSサービスにとって、グローバルサービスなのか、リージョン内サービスなのかは重要になってくる。

AZは、us-east-1aなどと表記される。

あるAWSアカウントのAZはap-northeast-1aで、別のAWSアカウントもap-northeast-1aだっとしても、 ap-northeast-1aは同じ場所にない場合もある。

こうしたアカウント間でのAZを調整したい場合、AZ IDを使用する必要がある。

最新のリージョンは随時変更されるので以下で確認。

AWS グローバルインフラストラクチャ | AWS

ルートデバイスボリューム

インスタンスを起動するときは、ルートデバイスボリュームに格納されているイメージを使用してインスタンスがブートされます。

引用: Amazon EC2 ルートデバイスボリューム - Amazon Elastic Compute Cloud

EC2サービスの開発当初はInstance-store backed(ルートデバイスinstance store)がすべてのAMIで採用されていたが、 EBS導入後(2009年後半)、AMIから起動されるインスタンスのルートデバイスが、EBSスナップショットから作成されるEBSスナップショットボリュームであるということになる。

現在、両方の方法を選択可能だが、推奨されるのは高速に起動できるEBS-backedになる。

インスタンスストア

インスタンスストアをルートデバイスに使用するインスタンスでは自動的に、インスタンスストアボリュームを利用できるようになり、そのボリュームの 1 つがルートデバイスボリュームとなります。

引用: Amazon EC2 ルートデバイスボリューム - Amazon Elastic Compute Cloud

インスタンスストアボリュームは、ホストコンピュータに物理的に接続されているディスクからストレージにアクセスする。

終了したり、障害がおきたインスタンスストアのインスタンスはバックアップできない。 スナップショット機能もないし他のEC2に付け替えもできないので、インスタンスストアのデータは複数のAZに分散させておくことが重要である。

  • 再起動(reboot)では消えない!

EBS

Amazon EBS をルートデバイスに使用するインスタンスには自動的に、Amazon EBS ボリュームがアタッチされます。Amazon EBS Backed インスタンスを起動するときに、AMI で参照されている Amazon EBS スナップショットごとに 1 つの Amazon EBS ボリュームが作成されます。

引用: Amazon EC2 ルートデバイスボリューム - Amazon Elastic Compute Cloud

EBSボリュームは、1つのインスタンスからデタッチして別のインスタンスにアタッチすることができる。

再起動後は、アタッチされているボリュームに格納されているデータに影響はない。

また、停止している時、デバッグなどの目的で別のインスタンスにルートボリュームをアタッチできる。

f:id:o21o21:20190207133232p:plain:h250:w350

サイズが最大16TiBで以下のタイプでボリュームを作成できる。

複数のボリュームを同じインスタンスにアタッチ可能。(1度に1つ)

ボリュームの詳細は以下公式ページで確認。

Amazon EBS ボリュームの種類 - Amazon Elastic Compute Cloud

aws.amazon.com

また、クラメソさんからもここに用途などかいてある。(2017年情報)

簡単に、以下の特徴がある。

タイプ 説明
gp2 起動ボリューム、低レイテンシを要求するアプリケーション、開発・テスト環境
io1 I/O性能に依存するNoSQLデータベースやリレーショナルデータベース
st1 ビッグデータ、DWH、ログデータ処理
sc1 スキャンする頻度が低いデータ
マグネティック データアクセス頻度が低い

EBS最適化ありの場合、通常のネットワークとは別にEBSが専用帯域を確保することになる。

EMS最適化をサポートしているインスタンスタイプ一覧。

(最大帯域幅(Mbps), 最大スループット(MB/秒, 128KB I/O), 最大IOPS(16KB I/O))

Amazon EBS – 最適化インスタンス - Amazon Elastic Compute Cloud

バースト

バーストとは、通常は低負荷だが一時的に高性能を出すこと。

バーストを使用するにあたって想定する場合は以下。

ベースライン性能以下の利用時にクレジットが蓄積され、バースト時に貯めたクレジットを消費する。

また、T2 Unlimitedというオプションを使用することで、バースト状態を維持継続することもできる。

f:id:o21o21:20190208102640p:plain:h250:w150

新しいT2 Unlimited – バーストを超え、高い性能を発揮 | Amazon Web Services ブログ

EC2の購入オプション

  • オンデマンド

スタンダードな時間課金型インスタンス

1年間または3年間の利用予約をすることで、割引がされる。

リザーブドインスタンス(RI)- Amazon EC2 | AWS

使われていないインスタンスに入札して格安利用

最大90%程度の大幅なコストカットが見込める

  • Dedicated Host

専用の物理サーバー

過去記事

o21o21.hatenablog.jp

【TCP/IP】マスタリングTCP/IP メモ

マスタリング TCP/IP 入門編(第5版)

マスタリングTCP/IP 入門編 第5版

o21o21.hatenablog.jp

ネットワーク基礎知識

スタンドアロンからネットワーク利用へ

従来、コンピュータは単体で使われていた。その利用形態を スタンドアロン という。

しかし、コンピュータが進化するにつれ複数で利用されるようになる。

コンピュータネットワークを、LANWAN などに分類することができる。

  • LAN

1つの建物や会社など、限られた狭い地域でのネットワーク

  • WAN

都市など、離れた地域のコンピュータやLAN同士を接続したネットワーク

初期のコンピュータネットワークは、プライベートなネットワークを構成していたが、 公共ネットワークとしてインターネットが利用されるようになる。

コンピュータとネットワーク発展の7つの段階

  • バッチ処理(Batch Processing) 1950年代
  • タイムシェアリングシステム(TSS) 1960年代
  • コンピュータ間通信 1970年代
  • コンピュータネットワークの登場 1980年代
  • インターネットの普及 1990年代
  • インターネット技術中心の時代 2000年代
  • 「単につなぐ」時代から「安全につなぐ」時代へ 2010年代

プロトコルとは

さまざまなプロトコルを体系的にまとめたものを、ネットワークアーキテクチャ ということがある。

現在は大きくの機器でTCP/IPが利用できるが、Novel社のIPX/SPX、Apple社のAppleTalkIBM社のSNAなどTCP/IP以外のネットワークアーキテクチャを利用した機器や環境もある。 また、LANで使用されていたIPX、SPXといったプロトコルもあります。

プロトコルが必要な理由

プロトコルは、コンピュータ同士がネットワークを利用して通信するために決められた 約束ごと という意味になる。

メーカーやOSが異なるコンピュータ同士でも、同じプロトコルを使えば互いに通信することができる。 つまり、両者(異なるコンピュータ、メーカーなど)は、同じプロトコルを理解し、処理しなければならないことになります。

パケット(Packet)交換

パケット交換 とは、大きなデータをパケットと呼ばれる単位に分割して送信する方法。

f:id:o21o21:20190129171823p:plain:h250:w350

大きなデータをいくつかのパケットに分ける場合、元のデータのどの部分だったのかを示す番号が書き込まれる。 受け取り側は、この番号を調べることで、小分けされていたデータから元のデータへと組み立てることが可能となる。

通信プロトコルでは、ヘッダ に書き込まれる情報や、その情報がをどのように処理するかを定めている。 つまり、コンピュータはプロトコルに従って、ヘッダを作成したり、ヘッダ内部を解読して処理を行っている。

プロトコルはどこの誰が決めたことが疑問ですが、これついては割愛する。 より詳しく知りたい場合は、ISO(国際標準化機構)やOSIIETFなどと調べればわかりそうです。 とりあえず、現状世界共通で標準化されているということです。

OSI参照モデル

機能 機能イメージ
7 アプリケーション層 特定のアプリケーションに特化したプロトコル
6 プレゼンテーション層 機器固有のデータフォーマットと、ネットワーク共通のデータフォーマットの交換 文字列や画像、音声などの情報の多い表現の違いを吸収。
5 セッション層 通信の管理。コネクションの確率/切断。 いつ切断して、いくつ張る?
4 トランスポート層 両端ノード間のデータ転送の管理。信頼性の提供。 データに抜けがないか
3 ネットワーク層 アドレスの管理と経路の選択。 どの経路で宛先まで届ける?
2 データリンク層 直接接続された機器間でのデータフレームの識別と転送。 フレームとビット列の変換
1 物理層 0と1を電圧の高低や光の点滅を変換。 ビット列と信号の変換

セッション層はコネクションを確立するタイミングやデータを転送するタイミングの管理をしているだけで、 実際にデータを転送する機能はありません。そして、トランスポート層では、データ転送の信頼性を保証する役割をもっています。 なので、実際データを相手に届ける処理は、ネットワーク層ということになります。

(しかし、TCP/IPでは、ネットワーク層トランスポート層が一緒に働くことでパケットを送信することになる。 理由は、データが途中で消失したり、順番が入れ替わったりする可能性があるからである。)

通信方式

ネットワークのデータの配送には、大きく コネクション型コネクションレス に分けることができる。

  • コネクション型

データの送信を開始する前に、送信ホストと受信ホスト間での回線を接続する。

コネクションの確立や切断処理はない。 なので、受信する側は、データを受け取ってないかどうかを常に確認する必要がある。

パケット交換について

現在のネットワークでは、大きく2つの 通信方法 が利用されています。

1つは、回線交換 です。

回線交換では、交換器 がデータの中継処理を行う。コンピュータは、交換機に接続され、交換期間は複数の通信回線で接続される。 1度コネクションが確立されると、コネクションが切断されるまで、その回線は占領される。 問題は、複数のコンピュータを接続し、相互にデータのやり取りを行おうとすると、特定のコンピュータが回線を占領してしまうことである。

そこで、回線に接続しているコンピュータが送信するデータを、複数の小包 に分けて、転送の順番を待つ行列に並べる方法が考え出された。

これを パケット交換 という。

小包みというのは、パケット のことで、細分化される。それぞれのパケットには、ヘッダ があり、そこには自分のアドレスや送信先のアドレスが書き込まれているので、 効率的にデータの送受信を行うことができる。

パケット交換では、ルーター(パケット交換機) によって通信回路が結ばれる。 ルーターの中には、バッファ と呼ばれる記憶領域がある。流れてきたパケットは、バッファに格納される。 パケット交換の場合、コンピュータやルーター間には通常 1つの回線 しかなく共有利用されるため、 ネットワークの混雑度によってパケットの到着間隔が左右される。

アドレスとは

通信の送信元と送信先は、アドレス によって特定される。

コンピュータ通信では、MACアドレスIPアドレスポート番号 などが利用される。電話では、電話番号がアドレスにあたる。 アドレスは通常、ユニーク(唯一) でなければならない。

アドレスは、その総数が多くなると階層性をとらなければなりません。

コンピュータ通信において、MACアドレスIPアドレスは、両方とも唯一性はあるものの、階層性はIPアドレスのみにある。

MACアドレスは、ネットワークインターフェイスカードごとに製造者識別子と製造者内の製品番号、製品のごとの連番が付けられている。 ユニークではあるが、どのネットワークインターフェイスカードが、世界中のどこで使用されるかは特定する手段はない。

なので、IPアドレスが必要になると考えることが可能です。

IPアドレスは、ネットワーク部ホスト部 という部分から構成されている。

f:id:o21o21:20190129171601p:plain

こうすることで階層性が成り立ち、組織やグループなどに接続しやすいようになっている。 また、MACアドレス転送表 を、IPアドレス経路制御表(ルーティングテーブル) を元にして通過点では行き先を特定していく。

ネットワークの構成要素

リピーター

リピーター は、OSI参照モデルの第1層物理層で、ネットワークを延長する機器 である。

ケーブル上を流れてきた電気や光の信号を受信し、増幅や波形の整形などする。 また、通信媒体を変換できるリピーターも存在する。同軸ケーブル光ファイバーの間の信号を変換する。

ブリッジ / レイヤ2スイッチ

ブリッジ は、OSI参照モデルの第2層データリンク層で、ネットワーク同士を接続する装置 である。

ルーター / レイヤ3スイッチ

ルーター は、OSI参照モデルの第3層ネットワーク層で、ネットワークとネットワークを接続して。パケットを中継する装置のこと である。

ルーターは、ネットワーク層のアドレスで処理を行う。(TP/IPであれば、IPアドレスになる) また、ルーターはネットワークの負荷も仕切ったり、セキュリティ機能も備えてたりする。

レイヤ4-7スイッチ

レイヤ4-7スイッチ は、OSI参照モデルトランスポート層〜アプリケーション層の情報に基いて配送処理を行う

イメージしやすいのは、ロードバランサーである。 負荷分散や音声通話のような即応性が求められる通信を優先したり、不正なアクセス防止のためのファイアウォールなどで利用される。

ゲートウェイ

ゲートウェイ は、OSI参照モデルトランスポート層〜アプリケーション層の階層で、データを交換して中継する装置のこと である。

レイヤ4-7スイッチのようにパケットを処理しデータの中継だけでなく、データを変換する役割があります。 (特にインターネットの電子メールと携帯電話の電子メールの交換するサービスは有名である。)

携帯電話による通信

一般的に携帯電話に電源を入れると、最寄りの 基地局 と通信が行われる。基地局には、契約しているキャリアの携帯電話用アンテナが設置されている。 基地局に集められた情報が エッジ(局舎) に集約され、エッジ間の基幹ネットワークに接続されているという構成は、インターネット接続と同様である。

TCP/IP 基礎知識

インターネットとは、全世界を接続しているコンピュータネットワークのこと。 インターネットのプロトコルといえばTCP/IP で、TCP/IPといえば インターネットプロトコル である。

f:id:o21o21:20190206115422p:plain:h250:w450

書籍や記事によって、TCP/IP階層モデルは4つだったり5つだったりすることもあるでしょう。 ここでは、4つに分けてモデルの図を書きました。

ネットワークインターフェイス

実際、最下位層には物理的にデータを転送してくれるハードを置いているす。このハードとは、電話回線やイーサネットのこと。(物理層)

ネットワークインターフェイス は、イーサネットなどのデータリンクを利用して通信するためのインターフェイスとなる階層である。

つまり、NICを動かすデバイスドライバとして考えても問題ない。

インターネット層

インターネット層 では、IPプロトコル が使用される。

IPプロトコルは、IPアドレスを元にパケットを転送する。

インターネット層トランスポート層 は、一般にホストOSに組み込まれていることを想定している。 よって、インターネットに接続されるすべてのホストやルーターは、必ずIPの機能を実装しなkればならない。

トランスポート層

トランスポート層 の最も重要な役割は、アプリケーションプログラム間の通信を実現すること。

コンピュータでは、複数のプログラムが同時に処理されているのは当たり前です。なので、どのプログラムが通信しているかを識別する必要があります。 アプリケーションのプログラムの識別には、ポート番号 があります。

アプリケーション層

(OSI参照モデルのセッション層,プレゼンテーション層,アプリケーション層は)アプリケーションプログラムの中で実現される。

パケットヘッダ

f:id:o21o21:20190206115101p:plain:h250:w350

各階層では、送信されるデータに対して、ヘッダ という情報が付与される。 その階層で必要とされる情報が組み込まれるので(送信元,送信先など)、プロトコルのための情報ということ。

例えば、トランスポート層ではTCPヘッダが付与され、インターネット層でIPヘッダが付与されるといった具合です。

データリンク

データリンク というとOSI参照モデルデータリンク層を指す場合もあるが、具体的な通信手段(イーサネット無線LANなど) を指してこの用語使う場合もある。

データリンク層プロトコルは、通信媒体で直接接続された機器k何で通信するための仕様を定めている。 通信媒体は、以下のようなものがある。

また、スイッチやブリッジ、リピーターが機器間で中継する場合もある。

実際に機器間の通信を行う場合、データリンク層物理層がともに必要になる。 データは2進数の0と1で表現されるが、実際の通信媒体でやり取りされるのは電圧の変化や光の点滅、電波の強弱など。 この2進数を変換させるのは、物理層の仕事になる。データリンク層は、単なる0と1の列でなく、フレーム というかたまりにまとめて相手の機器に伝える。

データリンクは、ネットワークの 最小単位 といってもいい。 インターネットによる通信は、細かくみるとデータリンクが集まったデータリンクの集合体とみることができる。 例えば、1つのリピーターを介して2つのケーブルで接続したとき(2つのデータリンクは)、 ネットワーク層からみると1つのネットワークで、物理層からみると2つのセグメント。

イーサネット

現在もっとも普及しているのが、Ethernet(イーサネット) である。

もともとは、Xerix社と旧DEC社が考案した通信方式で、Ethernet命名された。 その後、IEEE802.3委員会によって規格化され、フレームのフォーマットが異なる。なので、802.3Ethernetは、IEEE802.3委員会で規格化された方を指す。

制御の仕組みが単純まため、NICデバイスドライバが作りやすいという特徴がある。 LANの普及期に他のNICより安価で販売されていたことも、普及した理由の1つである。

Ethernetには、通信ケーブルや速度の違う多くの種類が存在する。

例、10BASE5

  • 10 -> 伝送速度
  • 5 -> 媒体

無線通信

無線通信ではk電波や赤外線、レーザー光線などで利用する。(ケーブルは不要)

以下、無線通信の種類。

分類 通信距離 規格化団体など 技術名称
短距離無線 数m 個別 RF-ID
無線PAN 10m前後 IEEE802.15 Bluetooth
無線LAN 100m前後 IEEE802.11 Wi-Fi
無線MAN 数km〜100km IEEE802.16,IEEE802.20 WiMAX
無線RAN 200km〜700km IEEE802.22
無線WAN - GSM,CDMA2000,W-CDMA 3G,LTE,4G

無線LAN IEEE802.11

IEEE802.11 は、無線LANプロトコル物理層とデータリンクリンク層の一部(MAC層)を定義した規格。

f:id:o21o21:20190206115140p:plain:h250:w550

VPN (Virtual Private Network)

IPネットワーク(インターネット)VPNを構築します。

MPLS は、ラベルと呼ばれる情報をIPパケットに付加して通信を制御します。 このラベルを、顧客ごとに異なるように設定し、MPLS網を通過するさいに、このラベルで宛先の判断を行う。 これにより、複数の顧客のVPNを1つのMPLS網上で区別し、保護されて閉じた形のプライベートなネットワークとして利用する。

IPプロトコル

TCP/IPの要 インターネット層。主に IPとICMP という2つのプロトコルから構成される。

OSI参照モデルネットワーク層に相当する。 終点ノード間の通信を実現する (end-to-end) ことが役割である。 データリンクを超えた通信をするためには、ネットワーク層が必要である。

※ ホスト(IPが付けられた機器)とルーター(IPが付けられていて経路制御を行う機器)を合わせて、ノード という。

2つのブロードキャスト

ローカルブロードキャスト とは、自分が属しているリンク内のブロードキャストのこと。

ダイレクトブロードキャスト とは、異なるIPネットワークへのブロードキャストには、ダイレクトブロードキャストアドレスを指定。

プライベートアドレス

インターネットの急速な普及により、IPアドレスが不足している。 そこで、すべてのルーターやホストにユニークなIPアドレスを割り当てることをやめて、必要なところに必要なだけ割り振るということにした。 しかし、個々のネットワークで好きなIPアドレスを割り振っていては、問題を引き起こす可能性がある。

そこで、プライベートアドレス が誕生した。

以下、プライベートアドレスの範囲。

範囲 クラス
10.0.0.0 〜 10.255.255.255 10/8 クラスA
172.16.0.0 〜 172.31.255.255 172.16/12 クラスB
192.168.0.0 〜 192.168.255.255 192.168/16 クラスC

この範囲外のIPアドレスは、グローバルIPアドレス になる。

プライベートIPアドレスは、当初、インターネットとの接続を考えない ネットワークで利用されていたが、 グローバルIPアドレスとプライベートIPアドレス間でアドレス交換をする NAT技術 が誕生した。

MTU

最大転送単位 (MTU) は、データリンクによって異なる。

IPはデータリンクの上位層にあって、データリンクのMTUの大きさに左右されることなく利用できなければならない。

参考

  • 引用: マスタリングTCP/IP 入門編 第5版

【Kali Linux】初期設定メモ

試した環境: version 2018.4

ホストとVirtualboxの仮想環境でのクリップボードの共有

  1. Virtualboxの対象環境を選択し、設定メニューを開く
  2. 一般 -> 高度 タブ -> クリップボードの共有 -> 自分の共有したい方法を選択

f:id:o21o21:20190201141502p:plain:h350:w550

KaliLinuxのTerminalでコピペ

上記の設定を行ってから(ホストのクリップボードの共有しないなら不要)、以下の設定をする。

  1. Terminalを起動
  2. Terminalタブ -> Preferences
  3. 左のメニューShortcuts -> Edit
  4. CopyPasteの項目で、実際入力して設定する

例えば、macならCopy: ⌘command + c にも設定可能

f:id:o21o21:20190201180514p:plain

それでも、効かない場合、Virtualboxの設定を見直す。

ホストキーの組み合わせを、右の⌘commandに設定する。

f:id:o21o21:20190201180354p:plain:h350:w450

再起動

  1. ウィンドウ右上のアイコン(↓)をクリック
  2. 電源マークを押して、Restartで再起動

f:id:o21o21:20190201135935p:plain

デスクトップ画像変更

  1. デスクトップの適当なところで右クリック
  2. Change Background
  3. デスクトップとロック画面を選んで、画像の変更

(デフォルトで何枚かwallpaper用は用意されていました。)

時間の設定

ターミナルで設定する方はこちら↓

 1. 日付時間確認
# date
2. コマンド実行
# dpkg-reconfigure tzdata
3. 設定ウィンドウが展開されるので、`Asia` Enterし、`Tokyo`Enter 
4. 再度dateコマンドで確認
# date
Fri Feb  1 14:07:05 JST 2019

設定UIから設定する方はこちら↓

f:id:o21o21:20190201181259p:plain

日本語&JSキーに対応させる

私の場合、ラップトップは英字なのでキーの操作で困ることはないのですが、 JSキー(日本語配列)の場合、キーの操作で不都合が起こるかと思います。

私は設定してないので、以下の記事を参考にしてみて下さい。

Kali Linux 2018.4 導入と日本語化 | セキュリティ | DoRuby

【TCP/IP】チェックサムを計算していく

今回は、ちょっとした計算をしようかと思います。

ということで、IPチェックサムについて取り上げてみようかと思います。

TCP/IPについて学んでいる時にチェックサムという単語をみかけていて、 その時は読み飛ばしていましたが、気になって仕方がないので記事にしてみました。

ず~~~っと気になっていると、なんだか落ち着かないときってありますよねw

では、さっそくみていきます。

チェックサムとは?

16bitで構成されていて、IPヘッダが壊れていないかをチェックするために存在します。

簡単にいうと、IPプロトコルで通信されている時に、エラーのチェックをする方法といったところでしょう。

ここまでならわかります。

ただ、調べてみると以下のような言葉で説明されているのをよくみます。

チェックサムというのはエラー・チェックの方法の1つで、チェック範囲の値をすべて足し算し、その結果の値と足し算するとすべてのビットが1になるような値を設定します(これを1の補数といいます)。受信した側は、同じ演算を行ってみて、結果が正しくなければエラーが発生したと判断するわけです

引用: パケットを正しく届けるために用意されたIPの機能(第7回) | 日経 xTECH(クロステック)

わたしはここで「どういうこと?」ってなりました。

だって、TCP/IP勉強している最中に言われても、完全に理解しているわけじゃないからよく頭に入ってこなinn...ww

けっこう読み飛ばしてしまう原因なのかと思っておりますw

このチェックサムについて、どうやらなにかを計算するということはわかりました。

「なにを計算するの? どうやって計算するの?」

これを引き続きみていきます。

なにを計算するの?

まず、チェックサムといっても、IPヘッダにもTCPヘッダにも含まれているものです。

IP、TCPUDPにおいて計算方法は同じなので、ここではまとめてチェックサムといいます。

チェックサムの対象は、以下のようになっています。

  • IP -> IPヘッダ部
  • TCP -> データ全体
  • UDP -> データ全体(計算しなくてもよいが、計算することを推奨している)

IPがIPヘッダ部分だけを計算対象とするのは、ルータでIPパケットの分割が行なわれると、 すべてのデータが揃わないので、チェックサムの計算ができなくなるためです。

どうやって計算する?

ここからが頭をよく使って理解していくところです。

さきほども書いたように、どれも計算方法は同じです。

先に具体的な計算方法の解説を書こうと思ったのですが、 先に例として以下の記事(見出し: tcpdumpの出力)でも使用したパケットで計算してみようかと思います。

o21o21.hatenablog.jp

長くなるので、読み飛ばしたい方は、補数とは?を読んで計算方法だけ読んでください。

実際に計算してみる

ここにtcpdumpで出力したパケットがあります。

4500 0034 5125 4000 ff06 0821 0a00 0abb
0a00 03c3 1f36 b702 2e7d 893b 223b 4fd8
8011 00e6 22a4 0000 0101 080a 6aa2 79cb
4b56 71d1

見る限りIPv4のパケットですね。

このパケットの出力から見てみると、IPヘッダとTCPヘッダに含まれる情報が出力されています。

今回は、IPヘッダの計算をしてみようかと思うので、そこだけ抜き出します。

4500 0034 5125 4000 ff06 0821 0a00 0abb
0a00 03c3

チェックサムのフィールドは、0821にあたります。

なので、0821は除外して計算します。

便利な計算サイト(16進数計算機)があるので、一気に足します。

4500 + 0034 + 5125 + 4000 + ff06 + 0a00 + 0abb + 0a00 + 03c3
= 1f7dd

1f7ddと答えが出ました。

これを2進数に変換します。

これも変換サイトがあるので活用します。

2進数に変換すると、11111011111011101になります。これを4bitずつに分けて、16bitの区切りにします。

1 1111 0111 1101 1101

余った今回でいうと1を残りの16bitで区切った2進数と足します。 (計算サイト)

1 + 1111 0111 1101 1101 = 1111011111011110

答えは、1111011111011110になりました。

こちらを4bitずつに区切ります。そして、bitを反転させます。

1111 0111 1101 1110
↓
0000 1000 0010 0001

反転させた2進数(0000 1000 0010 0001)を、16進数に変換します。

すると、821と変換できました。

この821は、計算するときに除外したチェックサムのパケット0821と同等だとわかります。

今回は2進数にしたとき、最初の4bitが0000なので、16進数にしたとき0が抜けていますが、まあ同等です。

と、このようにしてチェックサムを計算できました。

さて、このように計算してきた仕組みをこれから順をおってみていきたいと思います。

補数とは

この記事を書くにあたって、以下の記事を参考させてもらいました。本当にわかりやすく理解しやすかったです。

補数表現とは?1の補数と2の補数の違いと計算方法まとめ | サービス | プロエンジニア

また、これから進数が出てくるの、2進数や16進数についてわからん!という方は、以下の過去記事を参考にしてみてください。

o21o21.hatenablog.jp

補数とは、

ある基数法において、ある自然数 a に足したとき桁が1つ上がる(桁が1つ増える)数のうち最も小さい数をいう。

引用: 補数 - Wikipedia

また、こうして説明されている記事もあったりします。

マイナスがついた数字を、マイナスを使わずに表現する数のこと。

いきなり補数という言葉が出てきました。

実際、数字を使っていった方がわかりやすいと思うのでまず手始めにこんな計算から。

例えば、10の補数で考えてみます。

10の補数で、6と言われたら、4補数になります。

簡単ですね!なんか、お店でお会計するときに1980円だとして、小銭を使おうと2000円と80円出すとお釣りは100円になる、なんかこれに似ていますね。

このレジの例でいくと、10進数で考えて計算しています。

もう少し、砕いていきます。

(※ ここから^を累乗として表します。)

元の桁が1980で4桁です。これは、10^4で、10000です。

10進数の10の補数ということにすると、1980の補数は、8020になるよってかんじです。

# 10進数の10の補数で表現
1980の補数は、8020 : (10^4 = 10000)

このことを、補数といいます。

元の数(1980)と、補数(8020)を足した場合に桁が上がりが発生する数のうち最小の数です。」

そして、補数には、減基数という考え方もあります。

これは、

元の数(1980)と、補数(8020)を足した場合に桁が上がりが発生しない数のうち最大の数が補数になる。」という考え方です。

つまり、1980が元の数ということであれば、8019が補数ということです。

引き算が使えない?

上で、「マイナスを使わずに表現できるのが補数」と書きました。 これはいったいどういうことなのでしょうか。

当たり前といっちゃあ、当たり前なのですが、コンピュータのなかでは0 or 1ですべてが表現されています。

ということは、マイナスなんて使用することはできないのです。

なんか、コンピュータだから引き算くらい当たり前にできるよね!ってかんじのイメージが強いですが、 そんなことはありません。電卓アプリを使っていても、結局内部では0/1で表現されていることになりますからね!

ということで、登場するのがやはり補数ということになります。

補数を使うことはわかったのですが、マイナスを表現するには、どうしたらいいのでしょうか。

また、簡単な計算でイメージを掴みます。

こんな計算があったとします。

1280 - 131 = 1149

そして、以下のように考えます。

# まず、最大桁数1280があって、4桁であると認識します
10 ^ 4 = 10,000

# 131の補数
10000 - 131 = 9869

# 元の1280と、131の補数を足します
1280 + 9869 = 11149

答えは、11149とでました。

そして、先頭の1を取り除きます。すると、1149になりました。 見事、1280 - 131の答えが求まりました。これは常に成り立つ式になります。

ここまでくると、最初にとりあえずやってみたチェックサム計算の仕組みがなんとなーく結びついてきたのではないしょうか!

そして、今やってきたようなことをまとめて、10進数の「10の補数」と「9の補数」という概念でした。(「n進数」の補数)

一般的なのは、2進数の「1の補数」と「2の補数」という概念です。

これからそれををみていきたいと思います。

2進数の「1の補数」と「2の補数」

まず、1の補数からみていきましょう。

1の補数

2進数の1の補数は、減基数をつかった補数です。

なので、n ^ m - 1ということになります。(n進数、元の数の桁数m桁)

さっそく計算していきます。

今回はこの2進数、1001001 をつかって計算していきます。

# 公式にあてはめてみる
2^7 - 1 = 127

# 127を2進数に変換
1111111

# 補数を求める
1111111 - 1001001 = 0110110

求められた2進数は、0110110です。

これを反転(否定という言い方もする?)します。

0110110
↓
1001001

1001001は、元の数ですね!

なんと、実は元の数を反転するだけで、答えを求めることができます。

2の補数

2進数の1の補数の場合は、基数をつかった補数です。 なので、2進数の元の数と補数を足すと、桁上りしまよーということですね。

なので、-1はしないので、n ^ mということになりますね。(n進数、元の数の桁数m桁)

あとは、1の補数のときと同じです。パッとやっていきます。

さっきと同様に2進数、1001001 をつかいますー。

2^7 = 128
10000000 - 1001001 = 0110111

求められた数字は、0110111です。

あれ、これは1の補数のときに求めた数に対して、1を足しただけ?...

1の補数: 0110110

2の補数: 0110111

うん、そうみたいですw

つまり、こちらも簡単に求めるには、元の数を0/1を入れ替える(反転させる)、そして、1を足す

ただそれだけでした。でも、一応計算式を知っていた方が今後応用は効くかと思います。

まとめ

これで大体一番最初にやった計算の意味がつかめたでしょうか。

① 最初にパケットから、IPヘッダの内容を抜き出す

これは、IPヘッダのチェックサムを計算するからですね。

チェックサム以外の16進数を16bitずつ足していく

2進数でも計算できないことはないですが、パケットが16進数なので16進数に頭を変換させます。

③ 2で計算した16進数の答えを2進数に変換します。

④ 16bitを超える(桁上がった)bitと、16bitで区切れた値を足す

16bitずつ足していったので、桁を超える部分は16bitで区切る

⑤ 1の補数にする

4で求めた2進数を反転させます。

⑥ 反転させた2進数を16進数に変換します

もとは、パケット(16進数)だったので、これで最初除外していた値と照らし合わせることができます。

以上.

参考

もっと詳しくチェックサムについて知りたい方は以下のページにアクセスしてみてください。 チェックサムIETFが発行している、技術仕様が日本語訳で載っています。

www5d.biglobe.ne.jp

【TCP/IP】tcpdumpの出力からTCP/IP再入門!

今回は、主にTCP/IPの分野の基礎を固めていければと思い記事にしました。

再入門みたいなかんじです!

本題に入る前に

まず、TCP/IPの説明に入る前に、前提知識として知っておくことがあります。

ネットワーク系の技術書なんかでは当たり前に出てくる2進数や10進数などといった数字の理解についてです。 私自身、プログラムを書く上でそんなに意識して勉強したことがありませんでしたので、 今回は再入門ということで、tcpdump というコマンドを使って、TCP/IPプロトコルなどネットワークの基礎をまとめてみようかと思います。

ただ単に読むだけでは眠くなってしまうので、tcpdumpコマンドで実際確認してみることで、少しでも理解が進むようにしてみますw

(できればEC2とかで動いているWEBアプリとかローカルで開発しているWEBアプリなんかがあるといい..)

「なんか難しそう...」 とか 「数学っぽくて嫌い...」なんて言う方に、よりわかりやすく書いていけばと思うのでよろしくお願いします!w (詳しく説明というよりか、シンプルに要点のみ説明できたらと思います。)

では、さっそく数字の話からしていきます。

進数

ここでは、プログラミング及び、ネットワークを理解していくにあたって最低限必要な 2進数、10進数、16進数 をみていきます。

最初に「どうして進数を知る必要があるの?」ということですが、 まず言えるのが、「この世界において bit で表現されている」ことを認識する必要があります。

bit自体はITに関わっていれば聞いたことはあるかと思います。

では、どうしてbitなのか?ということだが、bit は、コンピュータの中で扱う 最小単位 であることです。

bit は、binary digit の略です。

お、binaryなんてコードを書く人は避けては通れない用語ですね。この bi は、ラテン語bi-が由来です。 例えば、自転車、bicycleという単語があるが、これは 2輪車 のことを示します。2つの ということが大事な点ですね。

つまり、2進数 にもこうした語源から関わってくるのですね〜。なるほどなるほどと。

bitは最小単位であるといいました。コンピュータでは、すべてのデータはbitのonとoffで表現されています。それを数値化することが目的です。

2進数 (binary digit)

2進数 は、数字の 0と1 の2つを使って表現します。

人間がよく表現するならば、10進数を使用しています。(0〜9の10種類の数字を使用していますね。例えば、1,980円でも1と0以外に8と9を使用していますね。)

よく簡単な例として挙げられるのは、電源のonとoffですね。電気の電源とかかな? offが0で、onが1として解釈するのが簡単でいいですね、みたいな。

しかし、コンピュータの中ではそうはいきません。(実際そのonとoffなんだけれども)

23などは2進数でどうやって表現するのでしょう?

2 -> 103 -> 114 -> 1005 -> 101

なんだか規則性がありそうです。そして、桁が増していきそうな気がしますね。

数値が大きくなるにつれて、桁も増すのですがコンピュータの記憶領域に準ずるかたちになります。

つまり、8桁 になります。

言い換えると、1bit を8つ並べた 8bit1byte として扱うことになります。

これは0という1bitで表現可能な数を記憶するにしても、1byte(8bit)を必要することになります。

例を示します。

1001という 2進数 で表現された数字があります。これを 10進数(いつも我々が見慣れている数字)で表現するにはどうしたらいいでしょうか?

2進数から10進数などに変換してくれる便利なサイトがあります。

2進数、8進数、10進数、16進数相互変換ツール

こうしたサイトを利用するのが普段なら便利でいいでしょう。このサイトの2進数の入力フォームに1001と入力すれば、10進数のフォームに9と出てくるので、答えは9だとすぐわかります。

が、一応仕組みというか考え方も学んだ方がいいでしょうw

こちらの表を見てください。

23 22 21 20
1 0 0 1

^は、べき乗、*は、乗算

2進数の1001は、4桁なので、べき乗する数が、0,1,2,3と4つと位が上がっています。 なので、上記の表のように表します。

2^3は、1なので、8 = 1 * 8

2^2は、0なので、0 = 0 * 0

2^1は、0なので、0 = 0 * 0

2^0は、1なので、1 = 1 * 1

ここまでくればわかりましたね。この答えを足すと9になります。なので、1001は、9を表現しています。

そして、これを理解できていれば、2進数から10進数への変換はできることになります。

10進数 (decimal number)

10進数 については、2進数がわかれば特に覚えることはないでしょう。

上記でも記述した通り、 0〜9 の数字で表現するのが10進数です。

人間が理解するのに容易なのが、10進数ですね。

16進数 (hexadecimal number)

これまで数字の0〜9までで表現してきました。

これで十分な気もしますがw、16進数 は、0〜9に加えて アルファベットのA〜F を使用して表現します。

なんかアルファベットって... と、思うかもしれませんが、どういうふうに位が増えていくのかに注目すればなんら難しいことはありません。

以下のように位が増していきます。

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

これは、10進数にすると以下のように表現されていることになります。

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

0〜9はそのまま表現できますね。そして、A〜Fはそのまま10〜15を表現しています。

そして、16進数なので、16がくるタイミングで桁上りします。なので、16進数において10進数の16を表現するには、10とします。

16進数も2進数で学んだ計算式で考えると理解しやすいかと思います。

161 160
1 0

16^1は、1なので、16 = 1 * 16

16^0は、0なので、0 = 0 * 0

電卓が必要ですが、アルファベットが入っても同様に考えればおk!

163 162 161 160
1 f 3 6

fは、15ですね。

なので、1*4096 + 15*256 + 3*16 + 6*1 = 7990 ということになります。

bit

bit とは、「0 or 1を表す1桁の 」(= 1bit)のこと。

よくあるOS 32bit or 64bit??

単純に考えて、64bit版を選択するのが良いとされる。

  • 32bit = 2x32 = 4,294,967,296
  • 64bit = 2x64 = 18,446,744,073,709,551,616

記憶装置のメモリの制限が設けられているのが主な違いになる。

32bit版は、約3.5GBまでしか使用できないという制限がある。64bit版の方はというと、約128GBまで使用できる。また、ハードディスクの方も同様に制限がある。

TCP

tcpdump

それでは、tcpdump をインストールしてみましょう。

AmazonLinuxであれば、yumでインストールできます。 macはたしか入っていたと思います。そうでなければ、$ brew install tcpdumpとかでやってみてください。

インストールが完了できたら $ tcpdump -hで確認してみましょう。

以下のような出力できたら大丈夫です。

tcpdump version tcpdump version 4.9.2 -- Apple version 83.200.2
libpcap version 1.8.1 -- Apple version 79.200.4
LibreSSL 2.2.7
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
        [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
        [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
        [ -Q in|out|inout ]
        [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
        [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
        [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -g ] [ -k ] [ -o ] [ -P ] [ -Q met[ --time-zone-offset offset ]
        [ -Z user ] [ expression ]

たくさんオプションがあると思いますが、ここでは一部を扱います。

用途によって(出力したい目的など)、使用するオプションが違うと思います。随時、ググって自分固定のオプションを見つけるといいかもしれませんね!

さて、さっそくコマンドを実行します。

tcpdump コマンドは、スーパーユーザー になる必要があります。

これは、以下の記事でも紹介した通り、プロミス・キャストモード を利用するためです。

スーパーユーザーになる($sudo su -)か、sudoをつけて実行します。

そして、さっきやった進数がさっそく活用できるので、まずコマンドを実行してみます。

$ (sudo ) tcpdump -X

開発しているWebアプリなどがあれば、空いているportを指定してtcpdumpするのが一番良いですが、ローカルでそのまま実行していも構いません。 その代わり、以下のtcpdump出力例にそぐわないパケットを拾ってしまうことが多いので、 推奨はEC2インスタンスtcpdumpをインストールして、稼働しているWEBページにアクセスして出力させるのが好ましいです...

-Xオプションは、パケットの内容を16進数で出力してくれます。

バアーーーっとパケットが出力されたら、Ctr+cで出力をストップします。

tcpdumpの出力

では、出力を見てみましょう。

4500 0034 5125 4000 ff06 0821 0a00 0abb
0a00 03c3 1f36 b702 2e7d 893b 223b 4fd8
8011 00e6 22a4 0000 0101 080a 6aa2 79cb
4b56 71d1

私が実行したときのパケットのかたまりです。みなさんも、値は違えど4文字ずつの同じような文字列が出力されたと思います。

これは16進数で表現されているので、人間でも読み解くことが可能です。

まずは、上記の出力を例に、表にまとめてみました。

項目 bit 説明
バージョン 4 4bit IPv4, IPv6(の場合は"6")
IHL(ヘッダ長) 5 4bit 32bit単位、32x5=160bit=20byte
ToS 00 8bit 優先度
パケット長 0034 16bit 52byte(10進数で)
識別子 5125 16bit フラグメント時に使用されるランダムな値
フラグなど 4000 16bit フラグ,フラグメントオフセット
TTL ff 8bit パケットの寿命64(Linuxデフォルト64)
プロトコル番号 06 8bit TCP=06, UDP=17
チェックサム 0821 16bit IPヘッダーのみ
送信元IP 0a00 0abb 32bit 10.0.10.187
送信先IP 0a00 03c3 32bit 10.0.3.195
送信元port 1f36 16bit 7990 (10進数で)
送信先port b702 16bit 46850 (10進数で)
シーケンス番号 2e7d 893b 32bit
ACK番号 223b 4fd8 32bit
データオフセット 8 4bit 32bit単位、32bitx8=256bit=32byte
コントロールビット 011 12bit ACK/FIN (予約領域を含む: 内コントロールフラグ6bit)
ウィンドウサイズ 00e6 16bit 230 (10進数で)
チェックサム 22a4 16bit 疑似ヘッダー含むチェックサム
緊急ポインタ 0000 16bit
オプション(NOP) 0101 080a 可変
タイムスタンプ(TSval) 6aa2 79cb 16bit
タイムスタンプ(TSecr) 4b56 71d1 16bit

16進数ですので、10進数の変換するとport番号などが隠れていることがわかります。

たくさんの項目がありますが、順をおってみていきます。

IPv4IPv6(バージョン)

今回は、4と出力されています。

この4は、IPv4 を示しています。

IPv4 は、32bit で構成されているので、232で約43億個のアドレスを保有しているよーってことになります。

IPv6 は、128bit で構成されているので、2128で約340澗(かん)個のアドレスを保有しているよーってことになります。

桁が違うので、IPv6は世界の人々、一人一人に割り当てたとしても0.00000001%くらいにしかならないのです。 ほぼ無限に近い(無限に近いって言い方もへんだけど)数ですw

ここで、重要なのは表記についてです。

IPv4 IPv6
表記例 192.168.0.1 2001:0db8:1234:0088:90ab:cdef:0000:0000
bit 32bitを8bitずつ4つのフィールドになる 128bitを16bitずつにして、": (コロン)"で区切って8つのフィールドになる

パッと見、IPv6の方は抵抗がある方もいるかもしれませんが、ここでは進数について勉強したので大丈夫でしょう。 なんら考え方は変わりません。

にしても、IPv6は長い...

ということで、省略表記も存在します。上記の例から省略すると、

2001:db8:1234:88:90ab:cdef::

みたいになります。

特に難しいことはなく、各フィールドの0始まりなら0を省略できることと、0が連続している場合、:に省略できることくらいわかっていれば大体問題ないでしょう。::は1つのIPに1度だけです。

そして、もう1つ重要なのは 構成 です。

ネットワーク部とホスト部

IPv4 は、ネットワーク部ホスト部 によって構成されています。

こんなかんじです。

f:id:o21o21:20190129171601p:plain

この例では、ネットワーク部とホスト部の区切りが2つあるのですが、これは、IPアドレスによって 異なります

ネットワーク部 は、どのネットワークに所属しているかを示します。

ホスト部 は、そのネットワーク内のどのホスト(端末)なのかを示しています。

でも、どこから区切りになるのか、どうやって決まるのでしょうか?

それは、クラスフルアドレスクラスレスアドレス によって区別されることになります。

ただし、主流なのは クラスレスアドレス で、サブネットマスク によって区別されていると知っておけばよいでしょう。

サブネットマスク は、IPアドレスとセットで使用される。

イメージとしては、1つの大きなネットワークを小さいネットワークの集合体に分割したものとして覚えるといいかもしれません。

表記は、IPアドレスと変わらなく、255.255.255.0 のようなかんじになっている。表現の仕方は以下を参考にしてください。

# IP (192.168.0.1)の2進数表記
11000000.10101000.00000000.00000001

# サブネットマスク (255.255.255.0)の2進数表記
11111111.11111111.11111111.00000000

# IP (192.168.0.1)のネットワーク部
11000000.10101000.00000000

# IP (192.168.0.1)のホスト部
00000001

つまり、サブネットマスク11111111が並んでいるところがネットワーク部、ということですね。(このネットワークに属していますよ。)

サブネットマスクで表記することもできますが、CIDR表記 といってもう少し短くネットワーク部とホスト部を簡単に区別して表記する方法もあります。

192.168.0.1/24 と表記します。

これは、先頭から3つ(24bit)をネットワーク部とします、という書き方です。 なので、192.168.0.1/24 = 192.168.0.1 255.255.255.0は同様です。

さて、覚えることが多くなってきましたが、これは IPv4 の構成です。

次は、IPv6 について見てきます。

プレフィックスインターフェイスID

IPv6 は、プレフィックスインターフェイスID で構成されています。

IPv4は32bitでしたが、IPv6は128bitですね。

なので、プレフィックスインターフェイスID に何bitずつか割り当てられることになります。

プレフィックスに64bit、インターフェイスIDに64bitで、プレフィックス(ネットワーク部)が十分なためネットワーク部分のアドレスが変更されることは少ないでしょう。

2001:0db8:1234:0088:90ab:cdef:0000:0000

上記の例でいくと、2001:0db8:1234:0088ここの部分が64bit(1フィールド16bit)でプレフィックスになりますね。

また、同様に2001:0db8:1234:0088/64として、CIDR表記にしても大丈夫です。

こうしてIPアドレスの表記などについて見ていきましたが、どうしてこうしたことを知る必要があるのかというと、 ネットワークの作成などで役立つ知識となります。また、社内ネットワークなんかもこうしたIPの範囲で構成されていることになります。

まあ、大概IPv4で構成されているネットワークが現在多いのですが、ここではIPv6でイメージしてみます。

例えば、2001:0db8:1234::/48と書かれたネットワークが存在するとします。

これだと2^80個のアドレスを含む。(ちなみにIPv6においての推奨される割当の大きさは/48)

2001:0db8:1234:0001::/64
2001:0db8:1234:0002::/64
2001:0db8:1234:0003::/64
2001:0db8:1234:0004::/64
.
.
.
2001:0db8:1234:ffff::/64

となり、2001:0db8:1234:0000:0000:0000:0000:0000 〜 2001:0db8:1234:ffff:ffff:ffff:ffff:ffffの範囲である。

ちなみに数値すると1,208,925,819,614,629,174,706,176個の範囲を示すことができる。

社内ネットワークで考えてみて、社員人数分のIPが必要で、辞める社員がいたとしても、何世紀もつかわからんレベルの範囲であるw

IPv4で考えてみる。

192.168.0.0/24だとすると、192.168.0.0 〜 192.168.0.255になるので、IPの個数は256個となる。

うん、これなら現実的かな。むしろ大規模の会社では足りないですね。 だからこの部署は、こうして192.168.1.0/24、この部署は、192.168.2.0/24こうするか....みたいなかんじです。 なんとなくイメージはついてたでしょうか?

長くなりましたが、最初は重要な基礎が多いので、説明が長くなりますが、引き続きtcpdumpの出力から学んでいきます!w

ヘッダ長

tcpdumpの出力によると5が出力されています。

32bit単位で計算するので、5x32bit=160bit=20byteとなります。

この20byteはなにを意味しているのでしょうか。

理解するために、基礎知識がまた必要なので説明していきます。 長くなりますが、ご了承ください!ww

プロトコル

さて、どうしてプロトコルが出てくるのかということなのですが、 ここでは、「そもそも通信機器がどうやって互いにデータを送り合ったりできるのか?」ということを理解する必要があるためです。

プロトコル(Protocol) とは、機器同士が通信を行うための 手順や規格 ことです。

主に 約束事 として紹介されていると思います。

辞書には、議定書や原案、儀礼などとして載っています。

簡単にいうとデータを送受信するための端末情報、データの形式、パケットの構成、エラーだった場合の対処法などが詰まっているわけです。

プロトコル は複数存在します。基本的に一般の方はプロトコルを意識して生活するということはないでしょう。

プロトコルはアナログ通信にも存在するようです。プロトコルだからといって、なんでもランダムに使用されているわけではなさそうですね。

プロトコルの階層化

基本的な概念がプロトコルには存在します。

1980年に発表された OSI参照プロトコル というものです。

そして、このモデルに基づいてコンピュータ間の通信などにおいて使用されるプロトコルは1つではなく、それぞれ役割があって複数のプロトコルが使用されることになります。 OSI参照モデルを元にして 7つ の階層に分かれている構造のことを プロトコルスタック といいます。

色んなプロトコル

f:id:o21o21:20190129171721p:plain

このように7つのレイヤーに分かれていて、各レイヤーに色んなプロトコルが存在します。

よく聞く TCP/IP(プロトコル) とは一体どこのレイヤーに位置するのでしょうか?

実は、TCP/IPOSIモデルに沿っていないのです。 沿ってないというよりは、ネットワークの技術が普及するにつれて、そこまで「詳細に階層分けしなくなった」という方があってるかもしれません。

TCP/IPは、4階層 にわかれています。

f:id:o21o21:20190129171743p:plain

  • アプリケーション層

ここでの規定は、各アプリに依存する。 HTTP,SMTP,FTP,SSH,POP3...

ここでは、TCPUDPプロトコルが使用される。 ネットワーク内で接続されている機器(ノード間)のデータ転送の信頼性を確保する。 TCP, UDP

  • インターネット層

IPが代表的なプロトコルEnd2End の通信を実行するための規定。 IP, ARP, ICMP...

直接的に接続された機器(ノード)間の通信のための規定。 詳しくは、こちらEthernet, PPP...

各レイヤーの規定をみてくると、通信の順番がわかるかと思います。

送信する側は、アプリケーション層から始まりネットワークインターフェイス層でカプセル化を行い データを流します。

受信側はこの逆で、ネットワークインターフェイス層 -> アプリケーション層の カプセル化 を行ってデータを取り除いていきます。

自宅の環境を考えてみると簡単です。

自宅でスマホをいじっています -> 何かアプリで友人にメッセを送信します ->

自宅のWi-Fiを経由します -> たくさんのサーバーや基地局を経由します ->

宛先の機器のWi-Fiまで到達します -> 友人のスマホに到達します

ざっくりですがこんな流れでしょうか。

ゲームなんかのリアルタイム処理が重要な通信においては、ルーターの性能や機器の処理速度が重要になってくるのもこれを考えればなんとなく理解できるかと思います。

実際は開発者の匠の技がいくつも隠されているのですw

かるくネットワークについて

こうした通信(TCP/IP)は、巨大なネットワーク、インターネット (Internet) で行われていると理解することが大事です。

なんかインターネットって当たり前の技術みたいに思われがちですが、あくまで地球規模のネットワーク という風に認識することが重要です。

そして、上記で1例としてあげた「TCP/IPというプロトコルが使用されているよ」ということですね。

他にもネットワークと呼ばれるものはあります。

会社では、イントラネット (intranet) というネットワークです。

「あれ?会社でもYahoo開いてるし、ネット使ってるからインターネット環境じゃないの?」と思われる方もいるかもしれませんが、正確には呼び方が違います。

特定範囲(会社や学校など) のコンピュータを繋いで構成されているネットワークは、イントラネットと呼びます。おそらく大企業さんであれば、情シスの方?が管理されているのでしょうか?(大企業に入ったことないからわからないw)

これは、LAN という仕組みを応用したものになります。同じ建物など物理的に隣接している場所で、機器を同士をつないでネットワークを構成します。この時、無線やケーブルで機器同士をつないでると思います。

また、WAN という都市や国などもっと大きな枠組みで、離れた場所をつなぐ仕組みがあります。

WANは、光ケーブルなどを使用してネットワークを形成しています。

ヘッダ長にもどりますw

それはそうと、もとはなんの説明をしているかといえば、ヘッダ長ですねwww

ここまできて ヘッダ長 を理解できますw で、実はもうほとんど理解したようなもんです。

ヘッダ長とは、インターネット層で付けられたヘッダ (IPヘッダ) です。

以下の図も見てください。

f:id:o21o21:20190129171823p:plain

パケットの交換 といって、大きなデータを パケット(Packet) に分割して送信しています。

その時、通信するコンピュータは、プロトコルに従って、ヘッダを作成したり、ヘッダの内部を解読して処理したりしています。

高級なプロトコル(ここではTCP)は、低級なプロトコル(ここではIP)によって取り込まれていくイメージです。 TCPプロトコルは、IPプロトコルペイロードに属しているようなかんじです。

IPヘッダの長さは、5ですよ、というふうに出力されています。

単位は32bit、または4byteで、それぞれ、

  • 5 * 32bit = 160bit
  • 5 * 4byte = 20byte

このようになり、数値は一緒になりますね。

そして、この20byteは、以下のような内容が含まれている。(引用)

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |Version|  IHL  |Type of Service|          Total Length         |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |         Identification        |Flags|      Fragment Offset    |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |  Time to Live |    Protocol   |         Header Checksum       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                       Source Address                          |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                    Destination Address                        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                    Options                    |    Padding    |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                        data(ip payload)                       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IPヘッダのフォーマットとして、IPヘッダIPペイロード になるが、送るデータがない限りの最小サイズは20byteということになる。

ToS,パケット長,識別子,フラグ,TTL,プロトコル番号,チェックサム,送信元IP,送信先IP

さて、上記のIPのヘッダの中身を見てみましたが、tcpdumpの出力の項目は上記の表に当てはまることがわかります。

IPヘッダには、送信先IP以降は載っていないように見えます。

送信先portからの出力は、TCPヘッダ の中身になります。

以下も参考にしてみてください。(引用)

0                   1                   2                   3   
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             data(tcp payload)                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TCPパケットもIPパケットのフォーマットに似ています。

TCPヘッダTCPペイロード にわかれています。

TCPペイロードTCPより高級のプロトコルを含むデータということです。

重要そうな項目をみていきます。

細かい項目の意味については、こちら(IP, TCP)を参考にしてみてください。

ToS (Type of Service)

送信しているIPのサービス品質を示しています。

現状、インターネットではあまり利用されていないそうです。

パケット長

IPヘッダIPペイロード を加えたパケット全体の長さを示します。

識別子

フラグメント(パケットの分割化処理)を復元する際の識別子。

フラグとフラグメントオフセット

  • フラグ

3bitで構成されていて、パケットの分割に関する制御を指示します。

  • フラグメントオフセット

13bitで構成されていて、分割されたフラグメントが、どこに位置していたのかを示します。

TTL (Time To Live)

もともとは、このパケットがネットワークに存在してよい時間(秒単位)を示していましたが、 実際のインターネットでは、いくつのルーターを中継してもよいか、という意味になります。

プロトコル番号

IPヘッダの次のプロトコルが何であるか を示します。

チェックサム

IPヘッダのチェックサムを示す。 詳しくは、こちらを参考。

送信元IP, 送信先IP

送信元・送信先IPアドレスを示します。

送信元port, 送信先port

送信元・送信先のポート番号(Port)を示します。

シーケンス番号

シーケンス番号。

シーケンス番号は、送信したデータの位置ということ。

ACK番号 (Acknowledgment Number) 確認応答番号

確認応答番号は、次に受信すべきデータのシーケンス番号になっています。

データオフセット (Data Offset)

TCPが運んでいるデータがTCPパケットの先頭のどこから始まるのかを意味しています。

つまり、TCPヘッダ の長さを示しているということになります。

コントロールビット(または、コントロールフラグ) と 予約(Reserved)

コントロールフラグ は、8bit長で、以下のフラグが存在する。

  • CWR
  • ECE
  • URG
  • ACK
  • PSH
  • RST
  • SYN
  • FIN

全ては紹介しませんが、代表的な 3way Hand Shake (3ウェイハンドシェイク) を紹介します。

3way Hand Shake (3ウェイハンドシェイク)

TCPで通信する際に利用されるやり取りです。

名前の通り、3回のやり取りを経て接続を確立する方法になります。 クライアントと対象のサーバーとのやり取りを例にしてみます。

順番はシンプルにこんなかんじです。 

f:id:o21o21:20190129171858p:plain

SYN は、コネクションの確立 に使われます。 1になっているときは、コネクションが確立されていることを示します。さらに、シーケンス番号(Seq)が初期化されます。

ACK は、1の時、確認応答番号(ACK番号)のフィールドが有効なことを意味します。

ここでは出てきませんが、FIN というフラグもあります。 これは、コネクションを切断したという意味を示します(1のとき)。

ウィンドウサイズ

TCPヘッダに含まれる確認応答番号で示した位置から、受信可能なデータサイズを通知するのに使われます。

チェックサム

TCPチェックサム

緊急ポインタ

コントロールフラグのURGが1の場合に有効になります。 ここの数値は、緊急を要するデータの格納場所を示すポインタとして扱わられます。

オプション

TCPによる通信の性能を向上させるために利用されます。

詳しくは、こちらを参考にしてみてください。

まとめ

tcpdumpは随時実行してみてください! 目的や欲しいキャプチャによってオプションは変わってくるので、自分で使いやすいようなオプションを見つけられるといいです。

まだまだ基礎については書き足らないところがたくさんあります...

次は、有名な本「マスタリング TCP/IP」でも読んでみてまとめてみようかと思います。 もちろんすべては無理なので、私が重要だと思うメモみたいになってしまうかもしれません...

以上.

参考&引用

【outguess】画像ファイルに秘密ファイルを埋め込む!?

今回はステガノグラフィ・ツールで遊んでみます!

ステガノグラフィ・ツールとは、音声や画像などのデータに秘密のメッセージを埋め込む技術のことです。

ちょっとワクワクしますね!w

一見普通の画像ファイルに見えるのですが、秘密の情報を埋め込んであり、誰かに渡すといったことも可能です!

受け取った方は、秘密のワードで、その秘密ファイルを取り出すといったことを想定します。

私の環境はmac(OS X)です。

この記事では、outguessというツールを使用します。

macではoutguessがGUIになっているので、仮想環境を作成します。

仮想環境には、VirtualBoxを使用してUbuntuvagrantを使用します。 この記事では、細かいインストール手順は説明しませんが、大体は書いてあるので良かったら参考にしてください。

(vagrant upあたりからエラーやらWARNINGが出る方もいるかと思いますが、随時ググってください。たくさん有益な対処法が見つかると思います。)

では、さっそくやっていきます。

VirtualBox

以下からOSにあったVirtualBoxをダウンロードします。

www.virtualbox.org

Vagrant

Vagrantも以下からダウンロードします。 特にこだわりがなければ最新のヴァージョンでいいと思います。

www.vagrantup.com

準備

仮想環境を作成するので、作業ディレクトリをつくります。 あとからヴァージョンの違ったboxを追加したりすることを想定して、以下ののようなディレクトリを任意の場所で作成します。 (ここでは以下の名前で作成してますが、ディレクトリの名前はなんでも構いません。)

~/VirtualEnv/ubuntu/1604/

VagrantBox

VagrantBoxをインストールします。

A list of base boxes for Vagrant - Vagrantbox.es

上記のサイトからインストールできる一覧が記載されています。

今回は、ubuntuを選択できれば良いので適当なboxを見つけて以下のコマンドを作成します。

$ vagrant box add ubuntu16.04 https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-vagrant.box

このコマンドは、vagrant box add < 任意のBox名前> <Boxがあるパス> という構成です。任意のBox名前は、後から自分でわかりやすいような名前がいいかと思います。今回はヴァージョンを名前にいれていますが、プロジェクト名とかでもいいですね。

そしたら上記のコマンドを実行します。(このコマンドの実行はどこのディレクトリでも構いません。)

少し時間がかかるかもしれません。できるだけネットワーク環境の良いところでインストールするのがオススメです。

Vagrantfile

インストールの完了が確認できたら、さきほど作成した作業ディレクトリに移動します。

移動したら、まずworkというディレクトリを作成しましょう。($ mkdir work)

そして、以下のコマンドを実行します。

このコマンドは、さきほどインストールしたBoxファイルを展開するイメージです。

initすると、Vagrantfileというファイルが作成されます。

$ vagrant init ubuntu16.04

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

initが完了したらVagrantfileを編集します。

vimでファイルを開いて、config.vm.network "private_network", ip: と書いてある行を探し、コメントを外します。

次に、config.vm.synced_folderを書いてある行を探し、コメントを外して、共有フォルダを設定します。

config.vm.synced_folder "ホスト側のパス", "ゲスト側のパス"

今回は、config.vm.synced_folder "./work", "/home/vagrant/work" このように設定しました。

./workは、Vagrantfileと同じ階層にあることになります。 ホストOSで秘密のパスワードを展開する際に、共有していると便利です。

これでようやく仮想環境を立ち上げることができます。

以下のコマンドをVagrantfileがあるディレクトで実行します。

実行したら稼働しているか、確認します。

# 仮想環境を立ち上げる
$ vagrant up

# 仮想環境が稼働しているか確認
$ vagrant status

# (仮想環境内)仮想環境をぬける
$ exit

確認ができたら、仮想環境に入ります。

$ vagrant ssh

入れましたか? おそらくvagrantユーザーになって、ubuntuを操作することが可能なはずです!

apt-get

さあ、ここからが本番です。

ubuntuでは、apt-getでパッケージをインストールするのが常だと思います。

なので、まずはアップデートしてから、outguessをインストールしてみましょう。

$ sudo apt-get update
$ sudo apt-get install outguess

もしユーザーを変更したかったり、outguess専用のユーザー作成したかったら以下を参考にしてみてください。

Ubuntuでユーザーの確認・追加・削除・sudoに追加 - Qiita

outguessのインストールが終わったら、確認してみましょう。 以下のような出力があれば大丈夫です。

$ outguess

OutGuess 0.2 Universal Stego (c) 1999-2001 Niels Provos

outguess [options] [<input file> [<output file>]]
    -[sS] <n>    iteration start, capital letter for 2nd dataset
    -[iI] <n>    iteration limit
    -[kK] <key>  key
    -[dD] <name> filename of dataset
    -[eE]        use error correcting encoding
    -p <param>   parameter passed to destination data handler
    -r           retrieve message from data
    -x <n>       number of key derivations to be tried
    -m           mark pixels that have been modified
    -t           collect statistic information
    -F[+-]       turns statistical steganalysis foiling on/off.
                 The default is on.

ubuntuで準備

ubuntuでも作業ディレクトリを作成しましょう。

/home/vagrant/work/outguess/

作業ディレクトリに移動したら、次に画像が必要です。

画像

著作権フリーのサイトからcurlでダウンロードします。

$ curl -o woods.jpg https://cdn.pixabay.com/photo/2018/11/23/14/19/forest-3833973_1280.jpg

今回はwoods.jpgという名前でダウンロードしました。

テキストファイル

パスワードが書いてあるtxtファイルを作成し、1行目にパスワードを記述して保存します。 (今回はテストなので、適当に単語を記述しました!)

$ vim pwd.txt
〜 編集 & 保存〜

作成

さあ、ここでようやく情報を隠した画像ファイルを生成します。

-kオプションは、提供されたデータ内のメッセージを暗号化して隠すために使用されます。

その他コマンドのオプションはこちらにあります。

コマンドは以下の通りです。

# コマンド
$ outguess -k <secret_key_word> -d <text_file> <pics_file_name> <new_pics_file_name>

# コマンド例 (今回)
$ outguess -k oolongtea -d pwd.txt woods.jpg beautiful-woods.jpg

実行してみると、beautiful-woods.jpgが作成されたかと思います。

取り出し

さあ、ホスト側のFInderかなんかでubuntuとマウントされているディレクトリを見てみましょう。

f:id:o21o21:20190124144918p:plain

うん、普通の画像ファイルが存在していますね!

ここからubuntuで指定した秘密の文章(pwd.txt)を取り出します。

macでは、outguessはGUIとして存在します。

なので、ダウンロードします。

$ brew install outguess

インストールしたら、アプリケーションフォルダにあるoutguessを起動させます。

そうするとこんなのが立ち上がるかと思います。

f:id:o21o21:20190124145152p:plain

上のメニューで、Extractという項目があるので押下。

そうすると、FromKeyが入力できます。

Fromの方で、ubuntuのoutguessで生成した画像ファイルbeautiful-woods.jpgを指定。

Keyでは、oolongteaを入力して、*Extractボタンを押します。

取り出されたファイルを格納するパスを聞かれるので、適当にしてします。

そのファイルを見てみると.........

ubuntuで作成した秘密の文章ファイルがちゃんと記載されています!!!

これで、終了です。

まとめ

今回はoutguessについてでした。

ホスト側とゲスト側での、一人でできるハンズオンでしたが、 友人や同僚とやってみるのも面白いかもしれません。

これで何気ない画像に秘密の情報を埋め込み、取り出す方法を実感できたと思います!

以上.