たなしょのメモ

日々勉強していることをつらつらと

「Linuxで動かしながら学ぶTCP/IPネットワーク入門」を読んだので所感

Linuxで動かしながら学ぶTCP/IPネットワーク入門を読みました。
現在CCNAの資格を取得するために勉強中なのですがその副読本としてとても良い本でした。
今まで本や資格の勉強の中でしか見てこなかったネットワークの動きがわかりました。

2章

この章ではTCP/IPの概要が説明されていました。
TCP/IPの代表的なプロトコルOSI参照モデルpingtcpdumpについて学びました。
特にtcpdumpは今まで存在は知っていましたがあまり使ってこなかったためとても参考になりました。
主にこの本ではtcpdumpを起動したまま後述するルーターやGWに送ったパケットの流れを追うのに使いました。

3章

実際にNetwork Namespaceを使用して、
仮想のネットワークを作成してお互いに通信させて動作を確かめました。
以下はその際に使用したコマンドです。

① Network Namespace(今回はns1という名称にします)を作成します。

sudo ip netns add ns1

Network Namespace同士をつなぐため、vethインターフェースを作成してNetwork Namespaceに割り当てます。
② vethインターフェースを作成します。

sudo ip link add ns1-veth0 type veth peer name ns2-veth0

③ vethインターフェースをNetwork Namespaceに割り当てます。

sudo ip link set ns1-veth0 netns ns1

④ IPを使って通信するためIPアドレスとをvethインターフェースに割り当てます。

sudo ip netns exec ns1 ip address add 192.0.1.2/24 dev ns1-veth0

⑤ ネットワークインターフェースを立ち上げます。

sudo ip netns exec ns1 ip link set ns1-veth0 up

以上の設定が正しく行う(対向のNetwork Namespaceも必要なのでもう一度同じコマンドを入力します)と
pingで疎通確認できます。

ルーターを交えてセグメントをまたいで通信する過程も学びました。 その際はNetwork Namespaceに新しく「router」を追加して、gw-veth0,1というvethを用意しました。

4章

イーサネットについて学びました。
実際にNetworkNamespaceにMACアドレスを設定することで、ルーターを経由するとパケットが積みかえるい動きが読み取ることができました。

MACアドレスを指定するコマンドです。

sudo ip netns exec ns1 ip link set dev ns1-veth0 address 00:00:5E:00:53:01

tcpdumparpのやり取りを確認するコマンドです。

sudo ip netns exec ns1 tcpdump -tnel -i ns1-vetho0 icmp or arp

5章

トランスポート層プロトコルTCP/UDP)について学びました。
netcatコマンドtcpdumpコマンドを使ってパケットの動きを観察しました。

① netcatでudpを見るコマンドです。 オプションの-uがUDPで通信することを指定しています。

nc -u 127.0.0.1 1234567

② netcatでtcpを見るコマンドです。 何もオプションを指定しなければTCP通信になります。

nc 127.0.0.1 1234567

6章

アプリケーション層のプロトコル(HTTP、DNSDHCP)について学びました。
dnsmasqコマンドを使用してDHCPサーバー作成しました。

sudo ip netns exec server dnsmasq \
--dhcp-range=192.0.2.100,192.0.2.200,255.255.255.0
--interface=s-veth0
--port 0
--no-resolv
--no-daemo

7章

NATについて学びました。
NATにはSourceNAT、DestinationNATの二つが主にあります。
SourceNATは一般的に本で書かれているNAT、NAPTのイメージで送信先がグローバルアドレスで、送信元がプライベートアドレスになっているパケットのヘッダです。
DestinatioNATはSourceNATの逆で送信先がグローバルアドレスになっているパケットをプライベートアドレスに書き換えます。
「ポートを開ける」という言葉は実はグローバルアドレスをプライベートアドレスに変換するDestinationNATが動作しているポートを指定したことがわかりました。

8章

ソケットプログラミングの実践ということでPythonでHTTPクライアント、エコーサーバ、バイナリベースのプロトコルを作成しました。
Pythonで書いたコードをGoやRustで書き換えるのも面白そうなので今度挑戦してみようと思います。

まとめ

CCNAの副読本として最適だと思いました。
今まで文章でしか見たことなく実際に動いてる場面を見る事がなかったイーサネットなどの動きが学べたのはとてもよかったです。
この本を足がかりに他のネットワークの本にもチャレンジしたいです。