目次
[特別収録] TCP/IP&コマンドラインQuickリファレンス
Part 0 基礎知識
0.1 プロトコル ネットワーク通信に必要な段取りとは
- インターネットには多種多様なハードとソフトが関わっている
 - サービスを提供する側を「サーバー」という
 - 段取りをまとめたものを「プロトコル」という
 - インターネットの共通言語「TCP/IP」
 - TCP/IPは「みんなで決めた」プロトコル
 
0.2 階層モデル ネットワーク通信は「層」で分けるとうまくいく
- インターネットはネットワークのネットワーク
 - TCP/IPは4つの層で構成されている
 - 通信相手を指定する方法が各層で異なる
 - データは分割して送受信されている
 - パケットには各層でヘッダーが付け加えられている
 - OSI参照モデルは7層から成る概念モデル
 
0.3 OS・シェル・コマンドの基礎知識 ネットワークコマンドを使う上で知っておくべきこと
- OSとネットワークの関係
 - コマンドとシェルの関係
 - Linuxのディストリュビューションとは
 - コマンドラインシェルの種類
 - シェルとコマンドの関係
 - コマンドの実行権限 管理者権限,root権限
 - ホームディレクトリとカレントディレクトリ
 
0.4 学習用の環境を準備しよう VirtualBox/UTM/WSL
- 仮想化ソフトウェアの活用
 - 実環境と仮想環境の使い分け
 - 本書で使用する仮想環境
 - Windows VirtualBox+Ubuntu
 - macOS UTM+Ubuntu
 - Ubuntuデスクトップの使い方
- 【補足】 ホストOSのスリープから復帰後のネットワークの状態
 
 - WSLの活用
 
0.5 パケットキャプチャ用のソフトウェア Wireshark/tcpdump
- Windowsでのパケットキャプチャ Wireshark
 - macOSでのパケットキャプチャ Wireshark,tcpdump
 - Linuxでのパケットキャプチャ Wireshark,tcpdump
 
0.6 体験その❶ Webサーバーとのやりとりを体験してみよう ncコマンドでHTTP接続
- 体験の流れ
 - ⒶWebサーバーとHTTPで対話してみよう
 - Ⓑ-1 Wiresharkで通信内容を表示してみよう
- 【補足】 表示フィルターの活用
 
 - Ⓑ-2 tcpdumpで通信内容を表示してみよう
 
0.7 体験その❷ 接続の状態を調べてみよう pingコマンド
- pingコマンドを実行してみよう
 - Wiresharkで通信内容を表示してみよう
 - tcpdumpで通信内容を表示してみよう
 
0.8 コマンドラインの基礎知識 いつでもどこでも使えるようになろう
- この後の構成
 
0.9 Linuxコマンドライン Ubuntuデスクトップとbash
- 端末アプリケーション
 - コマンド履歴
 - コマンド補完
 - 実行結果の検索・実行結果の削除
 - GUI環境との組み合わせ
 
0.10 Windowsコマンドライン cmd,PowerShell,WSL
- コマンドプロンプト
 - PowerShell
 - WSL Windows Subsystem for Linux
 - WSLのディレクトリ構成
 - コマンドプロンプトやPowerShellからWSLのコマンドを実行する
 - WSLからWindowsコマンドを実行する
 - Windows Terminal
 - コマンド履歴
 - 実行結果の検索・実行結果の削除
 - GUI環境との組み合わせ
 
0.11 macOSコマンドライン ターミナル.appとzsh
- ターミナル Terminal.app
 - コマンド履歴
 - コマンド補完
 - 実行結果の検索・実行結果の削除
 - GUI環境との組み合わせ
 
0.12 標準入出力とパイプ・リダイレクトの活用 入出力を理解しよう
- 実行結果をファイルに保存する リダイレクト
 - 実行結果を絞り込む パイプとgrepコマンド・findstrコマンド
 - 実行結果を破棄する ヌルデバイス
 - 標準出力と標準エラー出力のリダイレクト/パイプ操作
 
0.13 コマンドの使い方と調べ方 「いま使っている環境で」調べよう
- コマンドのオプションと引数
 - オプションの書式
 - コマンドの使い方を調べるには
 - manコマンドでマニュアルを参照する(macOS,Linux)
 
Part 1 リンク層
1.1 ネットワークデバイスとMACアドレス リンク層で使われている「ハードウェアのアドレス」
- Ethernet(IEEE 802.3)とWi-Fi(IEEE 802.11)
 - MACアドレスはリンク層のアドレス
 - IPアドレスはネットワーク層のアドレス
 
1.2 ネットワークデバイスの情報を表示してみよう ip/ifconfig/ipconfig
- ipコマンド(Linux)
 - ifconfigコマンド(macOS,Linux,WSL)
 - ipconfigコマンド・getmacコマンド(Windows)
 
1.3 ネットワーク接続の有無による表示の変化を見よう 状態によって表示が変わる
- 体験の流れ
 - Ⓐネットワーク接続がオンの状態を確認
 - Ⓑ-1 ネットワーク接続がオフの状態 システムメニューで切断した場合
 - Ⓑ-2 ネットワーク接続がオフの状態 デバイスを無効にした場合
 - 後始末
 
1.4 MACアドレスを解決するARPとNDP IPアドレスからMACアドレスを知る
- ARPは一斉送信でアドレスを尋ねる
 - NDPはインターネット層の近隣探索機能でアドレスを知る
 - ip neigh(ip n)/arp IPアドレスとMACアドレスの対応を管理する
 
1.5 2台でやりとりできる仮想マシン環境を作ろう VirtualBox/UTM
- [準備]Windows(VirtualBox)
- 1 NATネットワーク用のデバイスを作成する
 - 2 仮想マシン(1台目)の設定を「NATネットワーク」に変更する
 - 3 仮想マシン(1台目)のクローンを作成する
 - 4 2台目の仮想マシンを起動してホスト名(コンピューターの名前)を変更する
 
 - [準備]macOS(UTM)
- 1 仮想マシンのネットワークアドレスを変更する
 - 2 仮想マシン(Ubuntu)のクローンを作成する
 - 3 Ubuntuを起動してホスト名(コンピューターの名前)を変更する
 
 
1.6 WiresharkでARPのやりとりを表示してみよう IPv4のパケットを観察
- これから試す内容の流れ(ARP)
 - [準備]IPアドレスとMACアドレスの確認
 - Ⓐping実行前後でip nの実行結果がどう変化するか確認する
 - ⒷARPのパケットをWiresharkで表示する
 
1.7 WiresharkでNDPのやりとりを表示してみよう IPv6のパケットを観察
- これから試す内容について NDP
 - [準備]IPアドレスとMACアドレスの確認
 - Ⓐping実行前後でip -nの実行結果がどう変化するか確認する
 - ⒷNDPのパケットをWiresharkで表示する
 
1.8 Ethernetフレーム パケットのさまざまな呼び名
- パケットの呼び方について
 - Ethernetフレームの構造
 - Ethernetフレームはリンク層すべてに流れる?
 - 自分宛ではないパケットも取り込むプロミスキャスモード
 
Part 2 インターネット層
2.1 ネットワークとIPアドレス ネットワークを超えて通信相手を特定できるアドレス
- IPアドレスはネットワークアドレス+ホストアドレス
 - ネットワークを分割するメリット
 - ルーティングテーブルには経路の情報が書かれている
 - ローカルIPアドレスとグローバルIPアドレス
 - グローバルIPアドレスは誰が管理しているのか
 - プロバイダーの役割
 - IPv4とIPv6
 - IPv6に対応しているか知るには
 - IPv4を使うかIPv6を使うか
 
2.2 IPv4 昔から使われている32ビットのアドレス
- 32ビットのIPアドレスを0~255×4組で表す
 - サブネットマスクでネットワーク部とホスト部を分ける
 - 「10.0.2.15/24」と「10.0.2.15/28」は意味が異なる
 - ホスト部で特別扱いされるアドレス
 - ローカルIPアドレスとして使用できるアドレス
 - ローカルIPアドレスはインターネットでの使用が禁止されている
 - インターネットへの接続にはNAT(NAPT)という技術が使われている
 - 自分自身は127.0.0.1で表す
 
2.3 IPアドレスの削除と再割当を試してみよう ipコマンドによる手動割り当て
- これから試す内容の流れ
 - ipコマンドによるIPアドレスの表示と変更(Linux)
 - IPアドレスを削除してみよう
 - 新しいIPアドレスを付けてみよう
 
2.4 IPv6 アドレス枯渇を解消する128ビットのアドレス
- 128ビットのIPアドレスを16進4桁×8組で表す
 - IPv6アドレスの省略表記
 - ネットワーク部分はプレフィックス長で表す
 - ユニキャストアドレスとマルチキャストアドレス
 - 3種類のユニキャストアドレス
 - 誰かが応えるエニーキャストアドレス
 
2.5 ICMP/ICMPv6パケットを観察してみよう IPv4とIPv6を見比べる
- pingはICMP Echo Requestを送りEcho Replyを受け取る
 - ICMPパケットを見てみよう
 - ICMPパケットの構造
 - ICMPv6パケットを見てみよう
 - ICMPv6パケットの構造
 - IPのフラグメンテーション(断片化)
 
2.6 pingに応答しない設定を試してみよう 「応答がない」にもいろいろある
- これから試す内容の流れ
 - pingに応答しないⒶ ICMPの応答を拒否してみよう ping応答が「拒否」されたらどうなる
 - pingに応答しないⒷ ICMPを遮断してみよう
 
2.7 異なるネットワークとの通信を試してみよう 経路設定とIPフォワーディング
- [準備]Windows(VirtualBox)
- 1 NATネットワーク用のデバイスを作成する
 - 2 仮想マシン(Ubuntu1)のクローンを作成する
 - 3 クローンで作成した仮想マシン(Ubuntu3)のネットワークデバイスを変更する
 - 4 Ubuntu3を起動してホスト名(コンピューターの名前)を変更する
 - 5 Ubuntu1にネットワークデバイスを追加する
 
 - [準備]macOS(UTM)
- 1 仮想マシン(Ubuntu1)にネットワークデバイスを追加する
 - 2 仮想マシン(Ubuntu1)のクローンを作成する
 - 3 新しい仮想マシン(Ubuntu3)のネットワークを設定する
 - 4 Ubuntuを起動してホスト名(コンピューターの名前)を変更する
 
 - これから試す内容の流れ
 - ⒶUbuntu1,2,3相互にpingを送ってみる
- 各ホストのIPアドレスの確認
 - Ubuntu1からUbuntu2,Ubuntu3へのpingは可能
 - Ubuntu2からUbuntu1とUbuntu3へのping
 - Ubuntu3からUbuntu1とUbuntu2へのping
 
 - ⒷUbuntu2に経路情報を追加する Ubuntu2にUbuntu3への経路情報を設定する
- Ubuntu1に,Ubuntu3へのルートを追加する
 - 結果の確認
 
 - ⒸUbuntu1でIPフォワーディングを有効にする
 - ⒹUbuntu3に経路情報を追加する
 
2.8 インターネットの経路を探索してみよう traceroute/mtr/pathping
- ネットワークの1区間をホップという
 - 経路を調べるコマンド
 - tracerouteコマンド(Linux/macOS)
 - mtrコマンド(Linux)
 - tracert・pathpingコマンド(Windows)
 
2.9 pingコマンドで経路を探索してみよう tracerouteのしくみ
- TTL/Hop Limitであと何回ホップできるかが決まる
 - traceroute/tracertはTTLで経路を探索している
 - pingコマンドで経路を調べる(Windows)
 - pingコマンドで経路を調べる(macOS)
 - pingコマンドで経路を調べる(Linux)
 
Part 3 トランスポート層
3.1 TCPとUDP コネクション型とコネクションレス型の違いとは
- コネクション型のTCP,コネクションレス型のUDP
 - TCPの3ウェイハンドシェイク
 - WiresharkでTCPパケットを見てみよう
 - TCPのパケット分割と順序制御
 - ウィンドウ制御 フロー制御と輻輳制御で取りこぼしを防ぐ
 - 速度を優先するUDP
 
3.2 ポート番号でサービスを区別する 80はHTTP,443はHTTPS
- ポート番号はサービスを特定するのに使用される
 - 0~65535の数値で表し,3つに区分けされている
 - NATとNAPT
 - ポート番号はファイアウォールでも使用される
 - nmap 開いているポートを調べる(ポートスキャン)
 - ss/netstat 現在の通信状態を調べる
 
3.3 TCPとUDPのパケットを見比べてみよう ncコマンドで試してみよう
- これから試す内容の流れ ncコマンド
 - TCPによる通信
 - TCPのパケット
 - UDPによる通信
 - UDPパケットを見てみよう
 
3.4 パケットロスを発生させてみよう tcコマンドで試してみる
- 1 一定間隔で送られるデータの観察 これから試す内容の流れを確認しよう
 - Ⓐ一定間隔で送られるデータの観察 パケットロスがない状態
- TCP通信の実行例
 - UDP通信の実行例
 
 - Ⓑ一定間隔で送られるデータの観察 パケットロスがある状態
- 【参考】 IP通信だとどうなるか
 
 - いったん後始末
 - 2 大きなデータを送信した場合の観察 これから試す内容の流れを確認しよう
 - テスト用のファイルを作成する
 - Ⓐ大きなデータの送信 パケットロスがない状態
- TCP通信での実行
 - UDP通信での実行
 
 - Ⓑ大きなデータの送信 パケットロスがある状態
 - 結果の比較と後始末
 
3.5 TLS 安全な通信とは
- TLSで実現する「安全な通信」とは
 - なりすましを防ぐ「サーバー証明書」
 - 暗号化には公開鍵と共有鍵を使用する
 - TLSハンドシェイクで安全な通信を確立
- ❶Client Hello
 - ❷Server Hello
 - ❸Certificate, Certificate Verify
 - ❹Finished
 
 - HTTPとHTTPSのハンドシェイクを見比べてみよう
 
3.6 TLS通信を見てみよう 暗号化された状態と復号された状態を見比べよう
- opensslによるHTTPS通信
 - セッションキーで復号する
 
3.7 QUIC UDPベースでセキュアな高速通信を狙うプロトコル
- QUICは高速で安全な通信を目指して新しく作られたプロトコル
 - QUICのハンドシェイク
 - TCPのヘッドオブラインブロッキング問題
 - モバイル通信の再接続問題
- 【参考】 Wiresharkでの表示
 
 
Part 4 アプリケーション層
4.1 DNSによるドメイン名とIPアドレスの変換 ドメイン名のしくみと名前解決
- 名前からIPアドレスを知るのが「名前解決」
 - nslookup/host 接続先のドメインからIPアドレスを調べる
 - 名前解決のしくみ
 - インターネットで使われる名前は「ドメイン」で管理されている
 - ドメイン名からわかること
 - トップレベルドメイン
 - 「DNSサーバー」は名前解決用のサーバー
 - DNSが管理する情報(レコード)
 - whois ドメインの管理情報を表示
 - 自分が使用しているDNSサーバーを調べるには
 - 名前解決の際に使用するDNSサーバーを指定する
 - DNSの効率化とDNSSEC
 
4.2 mDNSによるローカルネットでの名前解決 自ら名乗って名前を解決
- mDNSは「設定なし」で名前解決できるしくみ
 - 名前を使ってpingを実行してみよう
- 【補足】 VirtualBox/UTMにインストールしたUbuntuのmDNSでIPv6の名前解決を行う
 
 
4.3 Web通信のプロトコル URLとHTTP/HTTPSを理解しよう
- URLからはプロトコルと場所がわかる
 - URLの基本書式
 - HTTPにはいくつかのバージョンがある
 - リクエストメソッド
 - HTTPのステータス
 - HTTPとHTTPSは標準のポート番号が異なる
 
4.4 HTTP/HTTPSの通信を見てみよう curlコマンドで通信内容を比較する
- curlコマンドによるHTTP/HTTPS通信
 - curlコマンドを試してみよう
 - 環境変数SSLKEYLOGFILE
 - HTTP/1.1とHTTP/2でデータを取得する
 - HTTP/1.1とHTTP/2のパケットを見比べる
 - ❶HTTP通信の開始
 - ❷HTTPリクエスト(GETメソッド)
 - ❸HTTPレスポンス
 - Firefoxのパケットを表示してみよう
- 【補足】 Wiresharkのフィルターについて
 - 【参考】 curlによるHTTP/3通信
 
 
4.5 電子メールのプロトコル メール転送のしくみとSMTP/POP/IMAPの役割
- SMTPはメールを転送,POPはメールを取得するためのプロトコル
 - メール転送とバケツリレー
 - メールの経路はヘッダーに残されている
 - エラーメールは経由地のMTAが送信するケースもある
 - SMTPの認証は後から追加された
 - IMAP4はサーバー上のメールを直接操作できるプロトコル
 - SMTP・POP3・IMAP4のポート番号
 - MUA(メールソフト)の設定はどのようになっているか
 - OAuthによるメールアカウントの認証
 - メールはテキスト形式に変換して送信されている
 - Base64によるエンコード
 
4.6 POP受信を試してみよう POPコマンドによるメール受信のプロセス
- POPのコマンド
 - POPでメールを受信してみよう
 - MUAは何をしているのか
 
4.7 SMTP送信を試してみよう SMTPコマンドによるメール送信のプロセス
- SMTPのコマンド
 - base64コマンドでユーザー名とパスワードをエンコードしておく
 - SMTPでメールを送信してみよう
 - 送信者と受信者のメールアドレスはどこで指定しているか
 
4.8 SSH 遠隔地のコンピューターをコマンドで操作する
- 遠隔地からコンピューターを操作する
 - これから試す内容(SSH接続)
 - ⒶホストOSへの接続
 - [準備]Windows(ホストOS)
 - [準備]macOS(ホストOS)
 - ゲストOSからホストOSへログインする
 - ⒷゲストOSへの接続
 - [準備]ポートフォワーディングの設定(VirtualBox)
 - [準備]Ubuntu(ゲストOS)
 - [確認用]ゲストOSからゲストOSの接続
 - ホストOSからゲストOSの接続 Windows(VirtualBox)
 - ホストOSからゲストOSの接続 macOS(UTM)
 - WARNINGが表示された場合
 - Ⓒ公開鍵でパスワードなしの接続を行う
 - ssh-keygenで自分用の鍵を作る
- 【注意】 「already exists」メッセージが表示された場合
 
 - scpで接続先に鍵をコピーする Windows
- 手順の詳細
 
 - ssh-copy-idで接続先に鍵をコピーする macOS
 
4.9 VPN パブリックな回線を使ってプライベートなネットワークを実現する
- 広域Ethernet/IP-VPN/エントリーVPN/インターネットVPN
 - レイヤ2VPN/レイヤ3VPN/SSL-VPN
 - OpenVPNで接続しているパケットを見てみよう
- Ⓐ[準備]Ubuntu1側でOpenVPN用の設定ファイルを入手する
 - Ⓑ[準備]Ubuntu2側でUbuntu1のパケットを観察する準備をする(VirtualBox)
 - ⒸOpenVPNによる接続前後のパケットを観察する
 
 - Ⓐ[準備]OpenVPNによる接続を試してみよう
 - Ⓑ[準備]プロミスキャスモードを設定しよう VirtualBox
 - ⒸOpenVPNによる接続前後のパケットを観察しよう
 
4.10 Network Namespaceの活用 コマンドラインで仮想ネットワーク環境を作る
- Network Namespaceとは
 - Network Namespaceの作成と削除
 - ネットワークデバイスの作成
 - 最初からやり直すには
 - Network Namespaceの作成
 - 仮想ネットワークデバイスの作成
 - 仮想ネットワークデバイスを有効化する
 - 仮想ネットワークデバイスにIPアドレスを割り当てる
 - [テスト❶]同じネットワークどうしでの通信
 - ルーティングとIPフォワーディング
 - [テスト❷]外部への通信
 - デフォルトルートの設定
 - NATの設定
- 【補足】 WSLの名前解決
 
 - tcpdumpで観察する
- eth0のIPアドレスでのtcpdump
 - veth-u2のIPアドレスでのtcpdump
 
 - Wiresharkで観察する
- 【補足】 WSL環境のパケットをWindows版のWiresharkで観察する
 
 
Column
- テキストの表示に使われるコマンド
 - ランダムMAC(プライベートアドレス)とMACアドレススプーフィング
 - Wiresharkでパケットダイアグラムを表示する
 - DHCPによる自動割り当て
 - Ubuntu環境用のtracerouteコマンド
 - pingコマンドで経路上の最小MTUを調べる
 - Windowsの名前解決
 - テキストエディタvi 端末で使えるテキストエディタ