世紀末の墓

お気持ち.log

IT系寄りの雑記

【インフラ勉強会LT記】ネットワークの基本の「き」(2018/02/04)

インフラ勉強会って?

インフラ勉強会とは非営利のインフラエンジニアのための勉強会オンラインコミュニティです。
DiscordというVCアプリ(?)を用いて行っています。
詳細はインフラ勉強会 Wikiを参照ください。

LTの内容

ネットワークの基本の部分の

をざっくりと説明しました。

形式

VC:Discord
画面共有:mixer.com

所感

僕の今まで勉強してきたことを、できるだけ初心者向けかつ体系的に伝えられるようにしたつもり。
なんか意外と刺さりが良かったというか好感触だったのでまたやりてぇってなった。

今までここの分野を講義というか人に教えるために整理したことがなかったので、良い復習になった。

ちなみにこのイベント
wp.infra-workshop.tech

まとめ


インフラ勉強会はいいぞ

NAPTとは

この記事の続きといえば続きです。
silmin.hatenablog.com

NATとの違い

アドレス変換テーブルを用いて変換を行う部分は同じなのですが、
変換するパラメータに「ポート番号」を追加します。

聞いたことがあるかもしれません。(80番ポートが一番有名かな?)

NATでは、IPアドレスのみでテーブルを作っていましたが、1対1の通信しか実現できませんでした。
※詳しくは上の記事参照

ですがNAPTでは1対多の通信を実現できます。

NAPTとは

例のごとく、このようなネットワークをモデルにします。
f:id:silmin:20180114234141p:plain
NAPTでは、ルーターはIPとポート番号をセットにしたアドレス変換テーブルを持ちます。

ポートについては詳しく記事にしようと思いますが、分からない人は今は「そんなのがあるんだ」くらいに思っておいてくれれば結構です。

では実際に流れを見ていきます。


PC2からサーバーの80番ポートにパケットを送っています。
f:id:silmin:20180114234131p:plain
ルーターはアドレス変換テーブルを見ながら、ヘッダ情報を書き換えます。
これでPC2からサーバーに送ることができました。
ここまではNATでも可能でした。

サーバーからPC2に送る時はどうでしょう。
f:id:silmin:20180114234150p:plain
サーバーは、G:S2から送られたと思っている(受け取ったパケットのヘッダ情報から読み取る)ので、G:S2宛にパケットを送ります。

受け取ったルーターは、アドレス変換テーブルにもとづいてヘッダ情報を変換します。

こうして、PC2に無事届けることができました。

こちらも、アドレス変換テーブルに無い宛先のパケットが来た場合は破棄されます。

これが俗に「IPマスカレード」,「ポートフォワーディング」というやつですね。

アドレス変換問題

一見完璧なように見える(かもしれない)NAPTですが、コレにも問題があります。

それは、ヘッダしか見ない(変換しない)こと です。

...宛先や送信元情報が書かれてるのはヘッダなんだからいいじゃんと思うかもしれません。

その通りなんですが、例外もあります。

ICMPなど、パケットのデータ部分に宛先情報等が載っているプロトコルも存在するため、データ部分まで見ないNAPTではカバーしきれないのです。

NAPTだけでも簡易的なセキュリティ対策にはなるのですが、今になっては無意味同然なので通常ファイヤーウォールと併用して運用します。(多分そう違ったらごめん)

NATとは

NAT(Network Address Translation) とは、一言でいうと

グローバルアドレスを節約するために、プライベートアドレスっての作って変換しようぜ

っていう話です。

これだと圧倒的説明不足感が拭いきれないのでちゃんと説明します。

NATのはじまり

ずばり、IPv4アドレスの枯渇対策です。

かつて、ネットワークに接続されている機器にはそれぞれに固有のアドレス(グローバルアドレス)が割り振られてました。
当時は、接続機器数も少なくて全然それで良かったのです。

今はどうでしょう。
当時とは比べ物にならないくらいインターネットが普及しました。
PCやネットワーク機器は勿論、スマホや家電だってインターネットに接続する時代です。

IPv4アドレスは32ビットで構成されているため、単純計算でも2の32乗で...約40億個しかありません。
到底足りません。


そこでグローバルIPの他にプライベートIPを作って、複数のプライベートIP→一つのグローバルIPっていう変換が出来ればいけんじゃね!?
っていうのがNATのはじまりです()

NATとは

NATは、プライベートIPとグローバルIPを相互変換する技術です。

画像で詳しく見ていきましょう。

例えば、このようなネットワークがあったとします。
f:id:silmin:20180114205915p:plain
インターネットにルーターを繋げて、そこにPC1~3を繋げている、ごくありふれた構成です。

ここで、各PCにはP1~3のプライベートIPが、サーバーにはXというグローバルIPが割り振られていることにします。

ルーターはこのP1~3をグローバルアドレスに変換するため、下のようなアドレス変換テーブルを持っています。
f:id:silmin:20180114205924p:plain

このテーブルを用いて、変換していきます。

では、PC2がサーバーに何かしらのデータを送りたいとします。

  1. PC2がIP: X宛にパケットを送ります。
  2. ルーターがパケットのヘッダの部分を見て、P2(送信元のプライベートIP)をG(グローバルIP)に変換します。
  3. ルーターは、サーバーに変換後のパケットを送ります。

f:id:silmin:20180114210807p:plain
※ヘッダ部分のIP表記がポート番号のようになってますが、スペースの問題上 送信元:送信先 と表記しています。

このように、複数のPCからでもプライベートIPを用いることで、グローバルIPを節約することができます。
ちなみに、アドレス変換テーブルに登録されていない宛先のパケットが来た場合は破棄されます。

NATの欠陥

このままでは欠陥があります。

プライベートなネットワークの中に、2つ以上のPC(端末)があると相手からの返答が受けられない。
です。

これは少し考えれば分かる話かと思います。

先程、PC2からサーバーまでは届きました。
それでは、サーバーからPC2まではどうでしょうか。

届かないのです。
サーバーは受け取ったパケットをヘッダを見て、IP: G から送られてきたということを知るため、Gに向けてパケットを送ります。
ですが、ルーターはどのIPに変換していいのやらさっぱりなので、2台以上のPC(端末)があった場合は通信不可となります。

よって、NATでは1対1の通信しか実現できません。

よく NATは1対1と言われてますしね。

この欠陥を克服するために、NAPT(Network Address and Port Translation)というものがあります。

察しの良い方はわかるかもしれませんが、名前にある通り「ポート番号」と言うものを使います。

これの記事も後々かきます。
書きました。
silmin.hatenablog.com

あけましておめでとうございます&2018年の抱負

あけましておめでとうございます。
2018年になりました。
年越しはコーディングしてました。

もう3ヶ月もしたら僕は北陸の民になります。(一人暮らし)

前年も色々あったけど、今年もたくさん頑張りたいということで抱負。

2018年の抱負

CTFをはじめ、いろんなことに挑戦してたくさん成果を生みたい

ということです。
やりたいことはたくさんあります。
野望もあります。
でも圧倒的に時間と金が足りなかった。

  • CTFで精進
  • ネットワーク・セキュリティ周りのおべんきょう
  • ゲームエンジンの習得
  • アプリケーション開発(ゲームでもなんでも)
  • 情報全般の知識・技能の底上げ

これらがさしあたってやりたいことです。

ゲームサークルを建てたいなぁってぼんやり考えてたりもする。
し、動画配信とかにも手を出していきたい感もある。


まあこんな感じで、2018年もよろしくお願いします!

pythonから書式制御文字でターミナルに色付けする

pythonから標準出力への色付けって、調べるとライブラリ使う系パリピ記事()がたくさんでてくるんですが、書式制御文字でもやれるで^^ということを紹介しようと思う。

まえがき

まあC/Ubuntuでやってる人いたから、python/Linux Mintでやろうっていうだけなんですがね。
www.mm2d.net
エスケープコードの細かい話はこの方の記事読んだら最強になれます。


本題

文字に色付け

print("\033[38;5;50mHello!\033[0m")

ってやると
f:id:silmin:20171204221826p:plain
って感じのがでてくるかな?

256色のリストを出してみる

for i in range(256): 
  print("\033[38;5;%dm%3d\033[0m " % (i,i), end="")
  if i % 16 == 15: print()

これで15ずつの表ちっくなのが出てくるかと思う。
↓こんなの
f:id:silmin:20171204220946p:plain

この値にそれぞれの色が対応してるって感じですね。
上の記事の人は16進でやってたので僕は10進でやりました。


まとめ

上の記事がぐう有能で正直あまり書くことなかったなら書くな
まあ今後その記事を発見できるかわからんので、メモってことで。
つかリンク貼ってるなら見失わないのでは

エスケープコード諸々は基本的に言語に関係なく使える(ターミナル側が解釈する)ので、ライブラリとかなくても全然色付け可能やで^^

ネットワークアーキテクチャはなぜ階層構造なのか

OSIプロトコルもといOSI参照モデルは7階層、TCP/IPは4階層です。

ではなぜ、階層構造になっているのでしょうか。
それぞれやくめが違うからといってしまえばそれまでですが、ちょっと説明させてください。

事前に

これらの記事を読んでおくと幸せになれるかも(露骨)
OSI参照モデルとは - 世紀末の墓
プロトコルとはなんだろう - 世紀末の墓

本題

いきなりネットワークアーキテクチャはなぜ階層構造?と考えるまえに・・・
これは通信においての、必要なプロトコルを階層に分類したものですよね。

もっと簡単にいうと、これは通信についてのことです。
通信というと硬そうだけど、「会話」や「手紙」だって通信です。

ここで、「会話をする」という通信を考えてみます。

会話をする

ここでは電話を使ってビーチの話をする男女を挙げようかと思います。

f:id:silmin:20171125233547p:plain

画像からもわかるように、共通部分がいくつかあると思います。

これらはどれも両者で共通していないと、会話という通信は成立しません。
男性の方はビーチの話をしているのに、女性の方はレストランの話をしていたとしたら
会話は成立しませんよね。

共通していればいいから・・・

共通していれば通信は成立するのだから、ということで一つ入れ替えてみましょう。

f:id:silmin:20171125234103p:plain

両者共に日本語を使っていたところを、英語を使うようにしてみました。

これも問題なく通信できますよね?
電話→メールにしても
ビーチ→レストランにしても
両方が共通していれば、通信は何ら問題なくできるはずです。

なにが言いたいの

勘の良い方は気がついたかもしれません。

これがコンピュータ同士の通信だとしたら、どうでしょうか。

コンピュータ同士でも同じなはずですね。
7層のうちの1層に変更があっても、他の層にはその変更は影響しません。

これが階層化されている理由です。


は?
そんなんで説明した気になるな、いまいちわからんぞ。

そうでしょうそうでし(殴
ちゃんと説明します。

各層はそれぞれ独立している

アプリケーション層~物理層は、それぞれ独立しています。
そのため、どれか一つが入れ替わっても他の層には影響しません。

1つの層が新しくなるたびに、毎回全部作り直していたら非効率すぎますし。


物理層を例にあげます。
通信につかわれるケーブルはたくさんありますよね。
LANケーブル(より対線)、同軸ケーブル光ファイバー...

これから新しい技術がでてきて、それに置き換わる可能性だってあります。

でも、それらにはアプリケーションの形式やアドレス体系などは影響されません(そのまま使い続けられます)よね。


これが階層構造となっている理由です。

まとめ

ネットワークアーキテクチャのそれぞれの層は独立していて、
特定の層の変更が他に影響を及ぼさないため、効率的!

OSI参照モデルとは

この記事では、OSI参照モデルについて僕が学習したことをつらつら書きます。
どうでもいいと思った項目は好きに飛ばしてください。

どうでもいい話

基本情報技術者試験とかにはバリバリ出てくるけど、中身よくわからんとか、
情報を勉強し始めたときに出てきたけど、正直なんのためにあるか知らんとか、
これって結構最初に出てきて大事なのに、よく知ってる人って少ない感じがしてます。

まあ知らなくても使えちゃいますしね(現に僕も使えてる)

そんな人達のためになったらいいなぁということで書いてます。
一応筆者は基本情報技術者は持ってる(応用は受けたけど受かってるか知らん応用も取る気ではいる)

歴史とか成り立ちとか

OSI参照モデルとは、元々OSIプロトコルという、ISO(国際標準化機構)によって標準化されたネットワークアーキテクチャから来ています。

ネットワークアーキテクチャ
プロトコルを階層構造で体系化したもの
プロトコルスタックプロトコルスイートとも呼ばれる


コンピュータ通信が始まった頃、メーカによって独自のネットワークアーキテクチャが乱立しました。
アーキテクチャの異なるネットワークとの通信は困難なため、

「ネットワークアーキテクチャ標準化しようぜ」

という動きに。

そこで登場したのが(大きく分けて)

の2つです。

まあ色々なんやかんやあって、TCP/IPが標準のネットワークアーキテクチャとなりました。
今でもTCP/IPが標準となっており、本もたくさんありますね。
※なんやかんやのところはまた追々。

それでも、OSIの論理モデルが色々を理解するのに優秀だったので、ネットワークの基本モデルとして普及します。

それが「OSI参照モデル」というわけですね。


OSI参照モデルの概要

OSI参照モデルは、7階層に分かれていて、通信機能を理解するのに有用です。

  1. アプリケーション層
  2. アプリケーション間通信に必要な固有の部分を決めてる(アプリケーション固有の形式等)
  3. プレゼンテーション層
  4. ネットワーク上で扱うデータの形式を決めてる(文字コードはマシンやOSによって違うけど読めるよね)
  5. セッション層
  6. 通信形式の決定やデータ転送のタイミングを決めてる(トランスポート層にコネクションに関する指示)
  7. トランスポート層
  8. アプリケーションの識別とデータ品質の保証をしてる(複数ソフト使っててもそれぞれに届くよね)
  9. ネットワーク層
  10. 終端ノード間(End-to-End)の通信を実現してる(IPアドレスとか経路制御とかしてる 一番働き者かも?)
  11. データリンク層
  12. 隣接ノード間(Link-by-Link)の通信を実現してる(具体的な通信手段やフレームの生成、MACアドレス周り)
  13. 物理層
  14. ビット列と信号との変換、ケーブルとかの規定をしてる
となっています。
上から「アプセトネデブ」とか言って覚えた記憶があります。

正直、()の中身がほぼその詳細です。
それぞれを規定してるのがプロトコルってことですね。
silmin.hatenablog.com
ちなみに、↑の記事で書いてるHTTPはセッション層、IPはネットワーク層プロトコルです。

それぞれの層やプロトコルについては、ちゃんと説明する記事を書こうと思ってるので、しばらくお待ちをば。
ググったほうが早そう

プロトコルとはなんだろう

プロトコルとは、一言で言うと「通信においての共通のルール」のことです。


よく見たり聞いたりするであろう「HTTP」とか「IP」とかもこのプロトコルの一つです。

もうちょい詳しく

プロトコルとは、「通信においての共通のルール」と言いました。

このプロトコルには、色々な種類があってそれぞれが決まりごとを示しています。
例えば、色々な通信方式があるなかで、パケット交換方式を例に挙げてみましょう。
パケット交換方式とは:通信方式の分類について - 世紀末の墓

元データをパケットに分割して送るときに、ヘッダーを付けますよね。
そのヘッダーの形式だったり番号の指定の仕方だったりが規定されてます。

ヘッダーの一番最初の◯bitはこの情報....みたいに。

それ以外にも、インターネット上には自分が送りたいデータ以外のデータも勿論たくさん流れています。
そんな中でパケットの順番の番号だけあっても、受け取った側がAのデータの1番とBのデータの2番を繋げてしまうかもしれませんよね。

ココらへんもどうするかが規定されています。

そんなこんなでプロトコルとなっています。

ちなみに、プロトコルは階層になっていてそれぞれ独立しています。
例えば、接続端子の規定とかアプリケーション側の規定は全く別のもので、どちらか一方が変更されても、もう一方には関係ないですよね。

これが実はOSI参照モデルと関係してきます。
ここらへんも記事にしたいと思ってます。
(記事にしたらここにも貼る)

通信方式の分類について

ネットワークの分野で通信通信と一口にいいますが、通信にも幾つかの方式があります。
ここでは、その紹介と説明をしていきます。
この記事は通信とか回線がゲシュタルト崩壊する可能性を孕んでいます。

通信回線の使い方による分類

これには「回線交換方法」と「パケット交換方式」があり、
それぞれ特徴をもっており、場面によって使い分けられています。

  • 回線:信号の通り道のこと。「物理的な回線」と「論理的な回線」が存在する。

回線交換方法(回線占有方式)

その名の通り、回線を交換(占有)して通信を行う通信方式です。
これが一番イメージしやすい(ごく普通に思いつく方法)だと思います。

画像のAさんとEさんが通信したいとします。
f:id:silmin:20171118211857p:plain


すると、回線交換機は空いている回線を使ってAさんとEさんを物理的に接続します。
f:id:silmin:20171118211852p:plain

こうして、Aさん→Dさんの物理的な回線が確立したため、通信が可能となります。

利点
  • 通信の品質や速度を一定に保つことが容易
    • 回線を占有しているため、安定しやすい
欠点
  • 物理的な通信回線数によって、確立可能な通信の数が制限される
  • 途中で回線が切れた場合、最初から通信確立手順のやり直しが必要となる

図のオレンジの部分の回線は占有されているため、他の人は使うことができません。
よって、この図の場合だと1対1の通信を2つしか確立できません。

この方式は、(IP電話等を除いて)電話が一番わかりやすい実用例だと思います。

パケット交換方式

こちらは聞き慣れないかもしれません。
送りたいデータを「パケット(小包)」に分割して送る、という方式になります。


f:id:silmin:20171118222552p:plain
↑のように、パケットにヘッダーが付いているため宛先側で再構築することが可能です。

これを先程と同じメンバーの所に落とし込むと...
f:id:silmin:20171118224821p:plain
のような形になります。
Aさん→Eさん、Cさん→Fさん、Bさん→Dさん
それぞれの通信が一つの回線で実現できることがわかるかと思います。
一般にパケット交換機は「ルータ」と呼ばれます。

利点
  • 同時通信の数に、回線数による制限がない
  • 1対多の通信ができる
  • パケットのエラーや喪失は、そのパケットだけ再送することで解決できる
    • 他のパケットは届いているため、損失したパケットのみ送り直せばいい
欠点(?)
  • 通信の品質や速度が、回線の混雑状況によって変化する
    • 空いている:高速、高品質
    • 混んでいる:低速、品質の劣化(エラーの増加)

相手の存在を確認するかどうかによる分類

コネクション型通信

  • コネクション:物理的な回線とは関係なく、通信相手との間に存在する論理的な通信路

この通信は、相手が存在するかどうかを確認し、コネクションを確立して通信を行います。

特徴

基本は1対1の通信で、信頼性が高い。
1ビットの誤りも許されないようなデータを送るようなときに使用されます。

コネクションレス型通信

この通信は、名前の通りコネクションを確立せずに通信を行います。
つまり、相手がいてもいなくてもお構いなしに一方的に通信を開始します。

特徴

信頼性は高くないですが、コネクション周りの処理が無い分、高速な通信が可能です。
1対多や放送のような一斉送信が可能です。
ストリーミングデータ(例:youtubeの動画)などは品質よりも速度を重視するため、コレが用いられます。


コネクション型通信とコネクションレス型通信は、
用途によって使い分けます。

通信対象をどう選ぶかによる分類

ユニキャスト

1対の通信

ブロードキャスト

1対全体の通信

マルチキャスト

1対特定の多数の通信

エニーキャスト

1対特定のグループ内のある条件を満たす1つの相手の通信

まとめ

ざっとこんなもんでしょうか。
一口に通信といってもたくさん方式があるんですね。

色々とゲシュタルト崩壊してきたので、この辺にしておきたいと思います。
またそれぞれ詳しく掘り下げたり、主要プロトコルの話とかもしていきたいです。

劣等感や焦燥感がやばいって話

最近、あまりにも劣等感や焦燥感がやばくてやばいって話。

劣等感がやばい

他人に自分が劣ってるってめちゃ思う。
識高い系の人とかプロの人たちを見てるとホントこうなる。

でも、その人達より自分の方が優れている要素だってあるわけで。

というか優れているとか劣っているとかどうでもいいわけで。

って思っているけど、やばいわけで。

焦燥感がやばい

劣等感から来るものなのか知らんが、「やりたいこと」が多い割に「タスク」が多すぎて。
かつ、時間も全然なくて。

卒業するまでにしたいことがたくさんあって。

でもタスクに阻まれてできなくて。

そんなこんなで焦燥感が止まらないわけで。

つまり

劣等感と焦燥感は割りと相互に作用しあってる部分があると思ってる。

劣等感があるから、普段よりも「やりたい」より「やらなきゃ」が増える。
これは焦燥感に繋がる。


全然やりたいことがやれて無くて、自分が今やれてない間にやれてるやつ、いいなぁって。
そっから焦燥感が膨れていって。

自分が何もできなかった間に、めちゃ成長してる人をみて「すごいなぁ」より「なんで僕は...」って方が強くなって。

結局、劣等感が生まれて。


みたーいなのがあると思う。


まあ両方共、単品で持ってる人や原因が別な人とかもたくさんいるけど。

僕はこのパターンが多いなぁって。


結論

人には、脳の処理速度の速い遅いがあるし、得意不得意があるし。
時間のあるないだってあるし、環境のあるないだってある。

でも、自分と他人を比べたってしょうがないし、それで自分のやりたいことが大きく変化するわけでもない。

だったら自分は自分でいいじゃない。って話。


まあそれが定期的にできなくなるからこうなってるんですけどね。



文字に起こすことで割りとスッキリすることが多いから、記事にしました。