Linuxで動かしながら学ぶTCP/IPネットワーク入門 5日目(ブロードキャストアドレス、ネットワークアドレスについて)
みなさん こんばんは。
「Linuxで動かしながら学ぶTCP/IPネットワーク入門」を使用した学習の5日目になります。 自分のペースで無理なく、楽しめる範囲で理解しながら少しづつ進めております。
それでは以下本題です。
学び5日目
①ブロードキャストアドレス
2進数にした際のホストアドレスのビットが全て11111111(255)のアドレスのこと。
セグメントに所属しているノードすべてに通信したい時の宛先として使用される。
そのため、ブロードキャストアドレスである、11111111(255)はIPアドレスのホストアドレスとして設定できない。
また、逆にホスト部が00000000(0)のホストアドレスの事をネットワークアドレスという。
ブロードキャストアドレスと同様に特別なホストアドレスとなっており、そのネットワーク自体を表すアドレスとなる。
そのため、ホスト部としてとりえる値の範囲は、これらの特別なホストアドレスを除いた下記となる。
# ホスト部としてとりえる値はネットワークアドレス+1 ~ ブロドキャスト -1まで 192.168.1.1 ~ 192.168.1.254
Linuxで動かしながら学ぶTCP/IPネットワーク入門 4日目(ルータはどこ)
みなさん おはようございます。
「Linuxで動かしながら学ぶTCP/IPネットワーク入門」を使用した学習の4日目になります。
それでは以下本題です。
学び4日目
①ルータはどこ
同じネットワークセグメントであれば、ルータが無くても通信が可能。
②ネットワーク部とホスト部
IPアドレスはネットワーク部とホスト部とで分かれている。
IPアドレスの32ビットを、特定のビット数を境目として前後で分ける。
なぜ、2つの部分に分けられているのかについては、ネットワークのセグメントを識別するためとなっている。
そのため、ネットワークアドレスが同じIPは、同じセグメントに属しているといえる。
実験で使ったIPアドレスをホスト部の24ビット目で分けると、どちらも192.0.2.0となり、両者が同じセグメントに属している事がわかる。
- ネットワークアドレス部:192.0.2
- ホスト部:0
そのため、ルータを介さずに通信する事ができた。
ネットワーク部とホスト部の境目のビットを示す表記は、ip address show等のコマンドを利用した際に、IPアドレスの後ろに付く”/”という文字列が示している。
「192.0.2.1/24」の場合は、"/24"のため、24ビット目までが、ネットワーク部であることを示している。
この表記方法は、CIDR(Classless Inter-Domain Routing)表記と呼ばれることがある。
③ルーティングエントリについて解けた謎
「192.0.2.0/24」というCIDR表記になったIPアドレスがあったが、これは、そのセグメントに所属するIPアドレスをまとめて宛先として指定していた。
④サブネットマスクについて
IPアドレスのネットワーク部とホスト部を境目として示す方法として、CIDR表記の他にサブネットマスクという書き方がある。
サブネットマスクは、ネットワーク部だけを1、ホスト部を0にした32ビットの整数。
これを、IPアドレスのビット列とAND演算すると、ネットワークアドレスを取り出す事が可能。
試しにホスト部が24ビットである「192.0.2.2/24」より、サブネットマスクを使用して実際にネットワークアドレスを取り出す。
- IPアドレス(192.0.2.2)
- 11000000 00000000 00000010 00000010
- サブネットマスク(24ビット)
- 11111111 11111111 11111111 00000000
- AND演算した結果
- 11000000 00000000 00000010 00000000
すると、「11000000 00000000 00000010 00000000」となり、こちらを10進数表記に直すと「192.0.2.0」になる。
感想
ネットワークセグメント、IPアドレスの構成について詳しく理解できた。
ネットワークアドレス部が同じIPアドレスの場合、ルータがなくてもホスト同士を繋げる事が可能なのが分かった。
基本情報技術者試験合格
合格やっほい
Linuxで動かしながら学ぶTCP/IPネットワーク入門 3日目(ネットワーク的にシステムから独立したネットワーク同士を接続する)
みなさん おはようございます。
「Linuxで動かしながら学ぶTCP/IPネットワーク入門」を使用した学習の3日目になります。
それでは以下本題です。
学び3日目
①Network Namespaceとは
ネットワーク的にシステムから独立した領域を作成可能。 ネットワークインターフェースやルーティングテーブル等のネットワークに関連する情報はすべて、独立した環境にて作成される。 そのため、実環境等に影響がない自由な実験環境を作成する事が可能。 Dockerのようなコンテナ型仮想技術を構成する際の要素の1つでもある。
②Network Namespaceをvethで繋いでみる
Network Namespace環境である「ns1」と「ns2」をveth(virtual Ethernet Device)を使用して繋ぐ。 vethインターフェースは、2つのネットワークインターフェースが一対(ペア)になって機能する。 これは、ネットワークインターフェースにパケットが入ると、もう片方から出るという特性があるため。 vethを使ってNetwork Namespace同士を接続することで、双方が仮想的なLANケーブルで繋がった状態となる。 ただし、これは物理的に配線しただけの状態です。 実際にやり取りを行うためには、物理的な配線をどのように扱うか、論理的に設定する必要がある。 そのため、各インターフェースに対して下記操作が必要。 - インターネット上の住所となるIPアドレスを付与 - ネットワークインターフェースを使用可能な状態とする →DOWN から UPに状態を変更する。 上記操作を完了させることで、Network Namespace環境同士で疎通が可能となる。
[ {IF1} ] <==== 仮想ケーブル ==== > [ {IF2} ]
今回学んだ主要コマンド
- ipコマンド:Linux のネットワークを操作するためのコマンド。
- netns:サブコマンド。Network Namespaceを操作するコマンド
- link:サブコマンド。ネットワークインターフェース(NIC)を操作するモード。
Network Namespace関連コマンド
# Network Namespaceを作成するコマンド sudo ip netns add {作成するNetwork Namespace名} # Network Namespaceの一覧を表示する ip netns list # 指定したNetwork Namespce環境でコマンドを実行するサブコマンド sudo ip netns exec {Network Namespace名} {実行したいコマンド} # 例 「helloworld」内で、ip address showを実行する。 sudo ip netns exec helloworld ip address show # 指定したNetwork Namespace環境を使用してシェルを起動する。 sudo ip netns exec helloworld exec {Network Namespace名} bash # 指定したNetwork Namespaceを削除する。 sudo ip netns delete {Network Namespace名} # 特定のNetwork Namespace環境上でシェルを起動することで、実行するコマンドを簡略化可能 # 特定のNetwor Namespaceに対して連続でコマンドを実行したい場合に便利 ip address show #シェルを起動しているnetwork namespace内のipのみが結果に表示される。 # exitコマンドもしくは、Ctrl+Dでシェルを抜ける。 exit
ネットワークインターフェースの作成及び、ipアドレス作成関連のコマンド
# vethのネットワークインターフェースを作成する。(ip link addサブコマンド)
sudo ip lin add {Network Namespace名1}-{ネットワークインターフェース名1} type veth peer name {Network Namespace名2}-{ネットワークインターフェース名2}
# 実際のコマンド
sudo ip link add ns1-veth0 type veth peer name ns2-veth0
# vethインターフェイスを使用可能とする。
# vethインターフェイスを各Network Namespaceに所属させるコマンド。
sudo ip link set ns1-veth0 netns ns1
sudo ip link set ns1-veth0 netns ns2
# vethインターフェイスにIPアドレスを付与する
sudo ip netns exec {network namespace} ip address add {ipアドレス} dev {vethインターフェイス名}
## ns1にIPアドレスを付与
sudo ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0
## ns2にIPアドレスを付与
sudo ip netns exec ns2 ip address add 192.0.2.1/24 dev ns2-veth0
# ネットワークインターフェイスを有効化する
sudo ip netns exec {Network Namespace} ip link set {vethインターフェイス名} up
sudo ip netns exec ns1 ip link set ns1-veth0 up
sudo ip netns exec ns2 ip link set ns2-veth0 up
# ns1とns2の疎通確認
# -Iオプションを使用することで、送信元IPアドレスを指定可能。
# 通常は、ソースアドレス選択(Source Address Selection)という仕組みで自動的に選ばれる
sudo ip netns ns1 ping -c 192.0.2.2 -I 192.0.2.1
感想
ネットワーク的にシステムから独立した環境の作成~疎通までを行う操作を通じて、
- Network Namespaceの仕組み
- ネットワークインターフェースの役割
- ipアドレスの役割
が分かった。
ネットワークを使用可能な状態にするには、物理的な配線を行うだけでなく、物理的に配線したネットワークをどのように扱うかの設定までが必要だということを理解した。
今回行った実際の操作をそれぞれ分類すると、①~③の操作が物理的配線、④~⑤が論理的操作となる。
①Network Namespaceの作成
②vethインターフェイスの作成
③vethインターフェイスを各Network Namespaceに所属(振り分け)させる ※LAN接続に近い
④vethインターフェイスにIPアドレスを付与
⑤ネットワークインターフェイスを有効化する
Linuxで動かしながら学ぶTCP/IPネットワーク入門 2日目(ルーティングテーブル、1章のまとめ)
みなさん こんばんは。
「Linuxで動かしながら学ぶTCP/IPネットワーク入門」を使用した学習の2日目になります。
それでは以下本題です。
<学び2日目>
①次にパケットを渡す相手を決める仕組み
TCP/IPの世界では、バケットを渡すべきルーティングテーブル(Routing Table)というもので管理している。
このルーティングテーブルは複数の経路から構成されており、その構成されている経路の事をルーティングエントリという。
また、ルーティングエントリを構成する2大要素として「宛先」と「次にパケットを渡す相手」になります。
次にバケットを渡す相手の事は、ネクストホップと呼ぶ。
ルーティングテーブルを使用して、ネクストホップにパケットを転送する作業のことをルーティングという。
インターネットを構成しているルータは、このルーティングを行い、パケットのやり取りを行っている。
1. パケットを受け取る
2. IPヘッダで宛先IPを確認する
3. ルーティングテーブルで宛先に合う経路を探す
4. 経路に対応するネクストホップを決定する
5. パケットをネクストホップへ転送する
②デフォルトルート
どの宛先にも該当しない場合に使用される宛先。
③1章のまとめ
1.TCP/IPがたくさんのプロトコルで成り立っている。
プロトコルは役割ごとに改装構造で分類される。
そして、実際の通信の際は、様々なプロトコルの中から役割に応じたプロトコルを選び、組み合わせて使用する。
2.IPの概要
IPというプロトコルを使用して、パケットを目的地に送る。
その際に使用する宛先のことをIPアドレスになる。
3.パケットを目的地に届けるための仕組みについて
インターネットはたくさんのルータによる、パケットのバケツリレーで成り立っている。
ルータはルーティングテーブルという情報をたどり、パケットを届ける相手を決めている。
ネクストホップに次のパケットを転送する作業を、ルーティングという。
<今回学んだ主要コマンド>
```sh
# ルーティングテーブルを確認するコマンド
ip route show
```
<感想>
Linuxで動かしながら学ぶTCP/IPネットワーク入門 1日目(TCP/IPとは)
みなさん こんばんは。
そろそろネットワーク、特にTCP/IPについて詳しく知っておきたいなと思い、「Linuxで動かしながら学ぶTCP/IPネットワーク入門」を読み始めました。
そのため、これから、学んだことを備忘録としてブログに残していこうと思います。
それでは、以下本題です。
<本書を学ぶ上で準備した環境>
Ubuntu 22.04.5 LTS(WSL2)
→WSL2でUbuntuを始めるのが一番手っ取り早かったため、WSL2を利用
<学び(1日目)>
①そもそもTCP/IPとは
インターネットを構成するプロトコルの総称。
インターネットを利用して複数のPCと円滑にやりとりするための決めごと
②プロトコルについて
プロトコルには様々な種類があり、適材適所で役割分担され使用されている。
1種類だけではなく、わざわざ複数用意されている理由については、目的にあわせてプロトコルを組み合わせて利用することで、結果的にシンプルになり、様々な事が可能となる。
その組み合わせの例としてTCP/IPがある。
IPは荷物(データ)を運ぶためのプロトコルでありますが、これだけでは、荷物が目的地にきちんと届いたかの判断ができません。
そのため、荷物が正常に目的地まで届いたかを判定するためのプロトコルであるTCPとあわせて利用することで、荷物が宛先に正常に届く仕組みを作成することが可能に。
③プロトコルの階層構造
理解が苦手なOSI参照モデルについての説明とあわせて解説されておりました。
OSI参照モデルは上に行くほど抽象的にあらわされ、下に行くほど抽象度が低くなるとのこと。
・7層:アプリケーション層
・6層:プレゼンテーション層
・5層:セッション層
・4層:トランスポート層
・3層:ネットワーク層
・2層:データリンク層
・1層:物理 (フィジカル) 層
抽象度の高い、7レイヤのアプリ層のプロトコルであるHTMLではWebページのコンテンツを扱い、
抽象度が低くなる1レイヤの物理層では、通信に使用するビットや電気信号をどう表現するかといった事を定義するプロトコルとなっている。
④IPアドレスについて
インターネット上での住所のこと。
WAN上、LAN上、通信するネットワーク内において必ず一意のアドレスとなる。
⑤今回学んだ主要コマンド
```sh
# 自分のIPアドレスを表示するコマンド
# ネットワークインターフェースごとで表示される。
## loと書かれているのはループバックアドレス用のインターフェース
$ip address show
# ICMPプロトコルを利用して、ネットワークの診断(疎通確認)を行う。
$ ping -c 3 8.8.8.8
# パケットキャプチャを行うためのコマンド
## それぞれのオプションについては下記意味
### -t :時刻に関する情報を表示しない
### -n:
### -i:パケットキャプチャするネットワークインターフェースを指定。今回はanyを指定することですべてのインターフェースを指定している。
### icmp:キャプチャ対象のプロトコルを末尾に指定することで、そちらのみキャプチャ可能となる。
$sudo tcpdump -tn -i any icmp
# 指定した宛先までに到達するまでに経由したルータを一覧表示する。
## TTLというフィールドを利用してパケットが滞留していないかを判定している。
$traceroute -n 8.8.8.8
```
⑥ノードとルータとホストの違い
・ルータ:インターネットに接続したり、ネットワーク間で通信を中継・制御したりする機器のこと
・ ホスト:ルータではないコンピュータのこと
・ノード:ルータやホストを区別しない、インターネットに接続されたコンピュータの総称
⑦tracerouteコマンドの仕組み
ここがわかりやすかった。
利用している仕組みとしては、ICMPで時間超過(Time Exceeded)を起こした際、目的のルータ側でIPパケットが破棄され、送信元に目的のルータのIPアドレスを含む時間切れメッセージを届ける仕組みがあり、これを利用している。
具体的にルータの情報を取得する流れとしては、まず、TTLはルータを1つ経由する度にTTLが1減り、このTTLの値が0になった際に、時間超過が発生する。
そのため、TTLを1から順に1づつ増やしながらIPパケットを目的のルータに送信することで、経由する全てのルータで時間超過を発生させる事が可能となり、経由する全ルータのIPアドレスを取得できるという仕組みだ。
以上です。
中堅プログラマとしてどう生きるか
みなさま
超お久しぶりです、5年ぶりの投稿です。
技術的な備忘録を残そうと思い、なにか良いプラットフォームはないかなと探していたところ、過去にそういえばはてなブログで何か書いてたなと思い出し、懐かしい気持ちでブログを読んでおりました。
この5年間の中であれこれありましたが、プログラマは続けております。
時間というものは早いものです・・・
私も経験年数的には中堅という立場です。
それもあってか、PL等ではありませんが、少しづつ管理等のマネジメント的な仕事もやっていたりします。
正直、あまり自分は人とのマネジメントには向いていないと、初めてみてあらためて思いました。
コミュニケーションが重要な仕事はやはり難しいですね・・・
はてさて、本題のタイトルの中堅プログラマとしてどう生きるか。
についてですが、キャリアをどう築いていくかはおそらく誰しもエンジニア(以外の職業の方も)であれば一度は悩むかと思います。
趣味と仕事が一致していれば、おそらく趣味と仕事が一致している分野を伸ばすで正解だと思います。
ただ、この5年で私自身の生活や興味の変化、24年頃から急激に進み始めたAIの発展で、単純なプログラマとしての技術力をただがむしゃらに身に着けていく(いかねばならない)という時代は自分の中で終わりました。
創作を行っていく中で、手段としてコーディングは行っていきたいというのはありますが、技術力をとにかく付けたいといった方面での興味はほぼ無くなりました。
今は、とにかく自分の興味や目的にフォーカスしたうえで、取捨選択を行うようにしております。
プログラミングという職業は、上を見てもキリがないので、自分の興味が持てる分野を仕事の中で見つけていくのがやはり良いと私は思っております。
目の前の仕事を一生懸命にやっていくという事はもちろん大事ですが、それ以上に自分が楽しいと思える事や、達成感を得られる仕事をするべきだとは今でも思っております。
理想論ではありますが、仕事は人生の半分以上の時間を費やしていくことになるため、そのあたりはきちんと考えながら仕事に向き合うそれがやはり大事だと、この5年間で思いました。
長々と書きましたが、「中堅プログラマとしてどう生きたいのか?」これについては、現時点での目標としては、システム監査になろうと考えております。
監査といっても、会計知識等が必要となってくる監査ではなく、あくまでもシステムが適切に運用されているかどうかを評価するような事をしていきたいです。
なぜ、システム監査になりたいと考えたのかについては、これまでに様々なプロジェクトに携わらせて頂きましたが、保守運用については素人ながらにも、下記のような点を明確化するべきだと感じる事がありました。
・各種窓口(誰が開発チームとインフラチームの橋渡し役になるか等)の担当者が明確化されていない
→窓口が一本化されていないため、課題が散見される
・システムの運用を開始してからの保守運用体制が定まっていない
→トラブル発生時のインシデントの起票先や、窓口が明確されていないため、顕在化したインシデントやリスクの適切なエスカレーションがされずに放置。
このような点は、問題提起することで1つづつ解決する事は可能ですが、問題が発生するたびに上記改善を行っていくでは、あまりに非効率でかつ、あらゆるリスクを無視するのと同義だと私は考えています。
仮に致命的なインシデントが発生した際に、上記が整備されていない事によって、早期での問題解決が行われず、肥大が大きくなる可能性が高いです。
そのため、システムの運用を適切に行っていくためにはどうすれば良いのかと考えていたところ、基本情報技術者試験の学習の中でシステム監査という活動がある事を知りました。
下記IPAのシステム監査技術者試験の引用になりますが、正に私が解決したい問題を解決するための活動ではないかと!
下記引用です。
独立かつ客観的な立場で、情報システムや組込みシステムを監査する業務に従事し、次の役割を主導的に果たすとともに、下位者を指導する。
縁の下の力持ち的な役割ですね。
おそらく、システム監査がなされたとて、開発や運用を行う方々にはあまりメリットを実感する機会はないと思いますが、それこそがシステム監査を行う最大のメリットでかつ運用が健全に行われている証拠だと考えます。
あらゆるリスクが事前に抜本的に排除されているため、上記のような余計な問題を意識せずにシステムと向き合える事が可能となります。
そんな環境を自分も作りたいと考えた結果、システム監査が目標となりました。