helloworlds

not a noun, it's a verb

【AWS】boto3で扱うprofile

今回はAWSPythonを使用してなにかコードを記述するときに使用するprofileの扱い方についてです。

Pythonだとboto3をしようする場面がおおいと思います。

また、AWSサービスを利用するにあたって、1人(またはチームや部署、プロジェクト)でいくつかのcredential情報をしようするかと思います。

また会社によっては、1つのプロジェクト(システム)に複数人のcredential情報を使用して、自由にw開発しちゃってる場合も...

まあそれは組織や考え方で様々ですが、boto3において柔軟にcredential情報を扱う方法をメモしていきます。

boto3とは?

aws.amazon.com

簡単にPythonAWSサービスを容易に統合できるライブラリですね。

インストールも簡単です。

$ pip install boto3
$ pip3 install boto3

ここで抑えておきたいのは、低レベル / 高レベル インターフェイスということば。

AWSによると以下の認識でいいのかなと思います。

  • 低レベル: 実現したいことのために、細かい事を指定する (client)
  • 高レベル: 実現したい事だけ指定する (resource)

以下の公式ドキュメントでは、AWSサービスごとに使用できるクラスが記載されています。

Available Services — Boto 3 Docs 1.9.170 documentation

本題に入ります。

boto3を使用する際、AWSのクレデンシャル情報を如何にして取得するか確認してみます。

Credentials (クレデンシャル)の設定

わたしはいつもローカルで開発する際、.awsディレクトリにconfigとcredentialsというファイルを置いています。

そして、そこに記述しているprofile情報をpythonに渡していたりしますが、それがベストプラクティスなのか確認したいと思います。

credential情報の取得して、他には環境変数に設定しているのを取得したり、そのままコードのべた書きしたり(よろしくないですね笑)できますかね。

AWS的にはなにを推奨しているのか、

以下のドキュメントに記載してありました。

Credentials — Boto 3 Docs 1.9.170 documentation

ちょっとまとめてみると、

boto3がcredential情報を取得しにいく優先順位として以下になるようです。

  1. Passing credentials as parameters in the boto.client() method
  2. Passing credentials as parameters when creating a Session object
  3. Environment variables
  4. Shared credential file (~/.aws/credentials)
  5. AWS config file (~/.aws/config)
  6. Assume Role provider
  7. Boto2 config file (/etc/boto.cfg and ~/.boto)
  8. Instance metadata service on an Amazon EC2 instance that has an IAM role configured.

訳:

  1. boto.client()メソッドで、パラメータが設定される
  2. Sessionオブジェクトを生成して、パラメータが設定される
  3. 環境変数の設定
  4. ~/.aws/credentials での設定
  5. ~/.aws/config での設定
  6. AssumeRoleを使用 (AWS STS)
  7. Boto2の /etc/boto.cfg and ~/.boto の設定
  8. IAMロールが設定されているAmazon EC2インスタンスインスタンスメタデータサービス

ちょっとAWS STSはなるほど!ってかんじでしたが、大体予想通りの展開ですね。

ここからはチームや個人の方針に委ねられるかんじもしますが、

基本的には4や5が良さそうなかんじでしょうか。

2と4でもいけますかね。

仮にコンソール上で実行するようなものであれば、ファイル実行者に.aws/配下に設定されているprofile情報をオプションで入力させ、権限さえあれば実行できそうです。

環境変数でも場合によっては、悪くなさそう。

AWSコンソールのLambdaのメニューからなら環境変数を簡単に入力できますね。(もちろんそれを良しとして、きちんとLambdaへの権限が設定されていたりすればですが)

まとめ

実際きちんと公式を読むと推奨されている事柄が把握できました。

どんなツールでも向き不向きがあるように、できるだけ開発者の意図に沿った使い方ができれば後の運用や保守も少しは楽になりそうですね。

意外と見落としがちな点かもしれませんが、チームや組織、プロジェクトの方針を最初にバチッと決めておくと、

メンバーがハッピー(楽)に開発できそうです!

参考

【インフラ】motdをカスタマイズ!!

少し投稿が止まってしまいました...

今回は小ネタ的な内容になります!

インスタンス(サーバー)にSSH接続した時に出る、格好いい文字!

こんなの↓

f:id:o21o21:20190524113903p:plain

ローカル環境構築してるときや、

開発において環境ごとになにか作業する時に、目立つmotd を設定していたほうがいいですよね! (まあ小ネタ的なかんじなので、しっかり接続方法を管理しておけばいいというのはおいておいて...)

なので、motd (Message Of The Day) の変更方法をメモがてら記事にしました。

※ OSによって若干の変更方法が違い場合もあるかと思いますが、大まかな手順をわかって頂けたらと思います!

今回のわたしのテスト環境としては、centOSのversion7です。

EPEL設定

$ yum install epel-release
$ yum update

次の手順でfigletというコマンドをインストールするのですが、centOSではデフォルトで

EPELリポジトリが設定されていないようなので、上記のコマンドを実行します。

figletをインストール

$ yum -y install figlet

確認してみる。

$ figlet Hello

 _   _      _ _       
| | | | ___| | | ___  
| |_| |/ _ \ | |/ _ \ 
|  _  |  __/ | | (_) |
|_| |_|\___|_|_|\___/ 
                      

おお、もうできました笑

あとは、適当に用途にあったメッセージをうまーく出力させるだけです。

出力させたら、motdファイルを変更します。

$ vim /etc/motd

# 確認してみる
$cat /etc/motd

これで文字が崩れたりしてなければ、次回以降このOSに接続した際に表示されるはずです。

色をつける

上記では、figletコマンド でやりましたが、こちらのサイトに行って、

そのままFontやら変えてコピペしても大丈夫です笑

ただ、Fontによってうまくいかない場合もありましたので、少し苦戦する場合もありそうです。

あと、日本語にも注意してくだいね!

まとめ

けっこう気になってる方も多いmotdについてでした。

まず私はこれを、「メッセージ オプ ザ デイ」というこも知りませんでした笑

また、他のファイルと合わせて、なにかOSの状態を表示させる方法なんていうのも思いつきますね!

(まあ、ただ接続時の時だから状態は、普通にコマンドで確認ですかねw)

それについては以下の記事が良さそうでした!

motdの設定をしてみた | bacchi.me

今回はちょっと薄い内容でしたが、、

また近いうちに更新できたらと思います、

以上.

【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