TCP/IP & ネットワークコマンド入門の大事なところをメモっていく

ncコマンドについて

個人的に、最近ncコマンド使う機会が増えてきて、この本でも結構語られているので、使い方くらいはメモっておきたい

ncコマンドはTCPもしくはUDPのコネクションを貼ってくれるコマンド。送信するビット列は完全に自分で選ぶことができる。 以下のコマンドでサーバをTCPで起動できる。 -l はlistenの略で、リッスンしている、つまりサーバです

nc -l 55555

以下のコマンドで、ncサーバとコネクションを貼ることができる

nc <ip addr> <port>

よくあるncコマンドの使用例

使用例としては、あるサービスのクライアントがどんな感じでbit列を送ってくるのかをサーバ側から可視化するときに使うイメージが強いな。 例えばUDP通信の代表例であるDNS resolutionね。こんな感じです。

ローカルホストで以下のncサーバを立てる

# nc -u -l 1053 > query_packet.txt

こいつは、1053万ポートでUDP通信を待ち受けている。で、受け取ったパケットをquery_packet.txtにリダイレクトしている。

このサーバに対して、以下のdigコマンドを送ることで、DNSクライアントがどのようなパケットを送信しているかがわかる。

dig +retry=0 -p 1053 @127.0.0.1 +noedns google.com

ここからは、追加での遊びですが、こんな感じで、ncサーバで受け取ったパケットを今度はncクライアントに流し込んで読み込ませることもできると。おもろいっすね。

nc -u 8.8.8.8 53 < query_packet.txt > response_packet.txt

ちなみに、以下のコマンドでhexでパケットの中身が見られるようになります。

hexdump -C query_packet.txt

sshクライアントの動きをncサーバをたててみてみる

nc -l 10022 > clien_packet.txt
ssh localhost -p 10022
ray@delta:~$ hexdump -C clien_packet.txt 
00000000  53 53 48 2d 32 2e 30 2d  4f 70 65 6e 53 53 48 5f  |SSH-2.0-OpenSSH_|
00000010  38 2e 39 70 31 20 55 62  75 6e 74 75 2d 33 75 62  |8.9p1 Ubuntu-3ub|
00000020  75 6e 74 75 30 2e 31 30  0d 0a                    |untu0.10..|
0000002a

みたいな感じで見られてりして、マジで面白いわけですね。はい。ってことで、ncコマンドはガチで便利だし、知っておいた方がいいって話です。

pingコマンドについて

今までpingて、疎通を確認するためのコマンドという認識しかなかった。正直、ネットワークのどのレイヤーで動いているのかはピンときてなかったけど、今回理解しました。 icmpってやつで、ネットワーク層、つまりL3だね。IPヘッダはついていて、TCP/UDPのところがICMPヘッダーとデータが入っている。つまり、レイヤーでいうとL4で動いているってことだね。TCP/UDP/QUIC/ICMPって感じでいいかな。これをみるといい感じよね。IPヘッダにはプロトコルが含まれていて、なんのプロトコルを送っているのかがわかるって話だ。

また、IPのペイロードはIPヘッダー(20byte)を含めて大きさが最大で1500bitって決まっているのよね。これ、MTUっていうやつね。そして、MTU - (TCP header + ip header) + mssだね。これはTCPが一回で運べるデータの最大量です。はい。 ちなみに、L3で分割された、Ethernetのペイロード (IPヘッダー+IPペイロード)のことをパケットと言います。これすごく大事です。用語は覚えよう。 パケット=MTU = 1500bitです。マジで覚えておきましょー。

リンクレイヤーのお話

ここではDHCPくらいかな。あとは、ARP。この二つを覚えておけば問題ないかな。

DHCP

まずはDHCPから行くか。はい、DHCPはネットワークに新たに参入してきたノードに自動的にIPを割り振るっていうプロトコルだよね。じゃあどうやって割り振るのか?これは結構おもろい。最初、IP持ってないやつは、ネットワークの管理者であるDHCPサーバであるかもわからないからね。みんなにブロードキャストで、DHCPリクエストを送るんだね。はい、おれにアドレスをくれと。これに対して、DHCPサーバは、はい、お前にipやるよ、ってかんじで渡すわけですね。 もう少し詳しく説明すると、DHCPはUDPプロトコルだから、一応IPヘッダーとかも入ってます。送信限IPには0.0.0.0が入ります。宛先は、ブロードキャストの255.255.255.255が入ります。宛先MACも同じです。ブロードキャストアドレスはみんなが受け取ってくれます。で、DHCPサーバも受け取ってくれる、という話ですね。で67/UDPで待っているわけですね。DHCPサーバが受け取ると、渡すわけですね。 最初のくれーが、DHCP-discover 次に、DHCP-offerがあって、 その次に、DHCP-requestがあって、 最後に、 DHCP-ackがあります。

DHCPの詳しい話は、 これを見てください。DHCPサーバを設定した話 ちなみに、DHCPサーバから、MACアドレスとIPを紐づける設定をすることも可能です。

ARP

つぎ、ARPですね。何をするのか。各サーバで実施されている処理になります。macアドレスとIPの解決をするのがARPです。 ハードウェアがipに対応するmacを知らない時、そのネットワークに対してブロードキャストでARPを投げます。このIPの人誰ー?って感じで。 そこで、返答として、私ですよーって返してくるわけですね。 ここにARP spoofingをする余地があるわけですね。 で、各ノード内での macとIPの対応が書いてあるテーブルが、ARPテーブルで、これはarpコマンドで見ることができますと。はい。以上です。

ちなみに、リピータとスイッチングハブの違いだけど、リピータは、全てのEthernetフレームをただデカくするのに対して、スイッチングハブは、接続先のノードを覚えておいて、そいつ宛のものをフィルタリングする、という機能を持っている。つまり、効率がいい。あと、リンクレイヤーをプロミスキャスモードで動かすこともできるが、これは、自分宛ではないパケットも取り込むという話です。

IPレイヤーのお話

この辺はね、そんなに話すこともないんだよね。 IPパケットの最大値は1500bit。 127.0.0.1はループバックアドレス。 ブロードキャストアドレスは、255.255.255.255。 プライベートアドレスは、クラスが決まっていて、詳しくはこっち

ことなるネットワーク間で通信をするには、ルータを用意しないといけない。ルータは別に必要なソフトをインストールする必要はなく、ただ、linux kernelの機能で実現できる。というはなしだ。ip forwardingとnaptの設定をすれば大丈夫。詳しくはこちら

ちなみに、ルータ間のやり取りはroutingテーブルに基づいてやられる。この辺はあまり詳しくない。

トランスポート層のお話。

TCPはコネクションを張るために3way handshakeをする。だから遅い。パケットのやり取りも一回一回確認しながらやる。だから遅い。ただ、windowsサイズ内のTCPペイロードはまとめて送信できる。ウィンドウサイズは大事なやつ。 UDPはコネクションレス。 意外だが、ポートを指定するのもTCPヘッダーとかUDPヘッダです。これは意外ですよね。

ssコマンド。これは使えるようになろうな。

あとは、tcp/udpの違いを知るためにやった、nc commandを使った実験が結構好きだった。

サーバ

nc -l 55555

クライアント

ping localhost | nc 192.168.3.1 55555

この辺は、修士の研究で結構詳しく見たところだからね。ウィンドウサイズはなかなか面白かった。 あとはUDP上でTCPの信頼性を確保するQUICもかなり好きだったね。これはすごい。

アプリケーション層

あとは、おまけみたいな感じです。それぞれ、別の本があるので、そっちで詳しく勉強しましょう。ちょっとだけ紹介。

  1. TLSの話。opensslでhttpsを検証することもできるって話。まあこれは別の本でちゃんとやる。
  2. DNSの話。キャッシュDNSと権威DNSとかね。まあ、いつか自分のドメインを持ちたいなって思うよね。まあdigとか使ってちゃんと勉強しよう。詳しくはこちら
  3. SMTPのお話。ここはちゃんと見てないね。
  4. sshの話。まあ死ぬほど使っているけど、これは意外と奥が深いよね。フォワードもできたりする。詳しくはこちら
  5. VPNのお話。VPNは死ぬほど触っているので、もういいかな。
  6. あとは、普通にhttpのお話でした。

今後何を勉強するか?って話ですが、

  1. SSL/TLS実践入門
  2. Real World HTTP この二つを勉強しよう。1はマジで全部に通じるからね。頑張ろう。2も、まあ、ヘッダーとか大事だからね。頑張ろう。