目次
[特別収録] 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 端末で使えるテキストエディタ