Skip to content
Published on

ネットワーク & Linux内部構造完全ガイド — TCP/IP, DNS, iptables, systemd

Authors

目次

1. OSI 7層 vs TCP/IP 4層

ネットワークを理解するには、まず階層モデルを把握する必要がある。実務ではOSI 7層よりTCP/IP 4層の方がよく使われる。

OSI 7層構造

名前役割プロトコル例
7アプリケーションユーザーインターフェースHTTP, FTP, SMTP, DNS
6プレゼンテーションデータ変換、暗号化SSL/TLS, JPEG, ASCII
5セッション接続管理NetBIOS, RPC
4トランスポートエンドツーエンド通信TCP, UDP
3ネットワークルーティング、アドレス指定IP, ICMP, ARP
2データリンクフレーム伝送Ethernet, Wi-Fi
1物理ビット伝送ケーブル、ハブ

TCP/IP 4層構造

TCP/IP層OSIマッピングプロトコル
アプリケーション5-7HTTP, DNS, SSH, FTP
トランスポート4TCP, UDP
インターネット3IP, ICMP, ARP
ネットワークアクセス1-2Ethernet, Wi-Fi

カプセル化(Encapsulation)プロセス

データがネットワークを通じて伝送される際、各層でヘッダーを追加する。

[Application Data]
    ↓ アプリケーション層
[TCP Header | Application Data]
    ↓ トランスポート層
[IP Header | TCP Header | Application Data]
    ↓ インターネット層
[Ethernet Header | IP Header | TCP Header | Application Data | Ethernet Trailer]
    ↓ ネットワークアクセス層

実務ではtcpdumpやWiresharkで各層のヘッダーを直接確認できる。

# パケットキャプチャ - 各層のヘッダーを確認
sudo tcpdump -i eth0 -vvv -c 10

2. TCP 3ウェイハンドシェイクと4ウェイテアダウン

TCPは信頼性のあるコネクション指向プロトコルである。接続の確立と解除プロセスを正確に理解しよう。

3ウェイハンドシェイク(接続確立)

Client                    Server
  |                         |
  |--- SYN (seq=x) ------->|   ステップ1: クライアントがSYN送信
  |                         |
  |<-- SYN-ACK (seq=y,      |   ステップ2: サーバーがSYN-ACK応答
  |    ack=x+1) ------------|
  |                         |
  |--- ACK (ack=y+1) ----->|   ステップ3: クライアントがACK送信
  |                         |
  |===== 接続確立完了 ======|

4ウェイテアダウン(接続解除)

Client                    Server
  |                         |
  |--- FIN ----------------->|   ステップ1: クライアントがFIN送信
  |                         |
  |<-- ACK -----------------|   ステップ2: サーバーがACK応答
  |                         |
  |<-- FIN -----------------|   ステップ3: サーバーがFIN送信
  |                         |
  |--- ACK ----------------->|   ステップ4: クライアントがACK送信
  |                         |
  |== TIME_WAIT (2*MSL) ====|

TCP状態遷移

ssコマンドで現在のTCP状態を確認できる。

# TCP接続状態の確認
ss -tan

# 状態別接続数のカウント
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn

主要なTCP状態:

  • LISTEN: サーバーが接続要求を待機
  • SYN_SENT: クライアントがSYNを送信し待機中
  • ESTABLISHED: 接続が確立された状態
  • TIME_WAIT: 接続解除後の待機(通常60秒)
  • CLOSE_WAIT: リモートからFINを受信し待機中

フロー制御

TCPはスライディングウィンドウ方式でフロー制御を行う。

# 現在のTCPウィンドウサイズを確認
ss -ti | grep -A 1 "ESTAB"

# TCPウィンドウスケーリング設定の確認
sysctl net.ipv4.tcp_window_scaling

輻輳制御(Congestion Control)

Linuxで使用される主要な輻輳制御アルゴリズム:

# 現在の輻輳制御アルゴリズムを確認
sysctl net.ipv4.tcp_congestion_control

# 利用可能なアルゴリズム一覧
sysctl net.ipv4.tcp_available_congestion_control

# BBRに変更(高帯域、高遅延ネットワークに効果的)
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr

主要なアルゴリズム:

  • Cubic: Linuxデフォルト、ほとんどの環境で良好
  • BBR: Google開発、帯域幅とRTTに基づいて最適化
  • Reno: 古典的アルゴリズム、パケットロスベース

3. HTTP/1.1 vs HTTP/2 vs HTTP/3

HTTP/1.1

HTTP/1.1はテキストベースのプロトコルである。

GET /api/users HTTP/1.1
Host: example.com
Connection: keep-alive
Accept: application/json

主な特徴:

  • Keep-Alive: 接続の再利用が可能
  • パイプライニング: 応答を待たずにリクエスト送信(実際にはあまり使われない)
  • Head-of-Line Blocking: 先行リクエストが遅延すると後続も待機

HTTP/2

HTTP/2はバイナリフレーミング層を導入した。

単一のTCP接続上で:

Stream 1: GET /index.html    ─────>  [HEADERS frame]  [DATA frame]
Stream 3: GET /style.css     ─────>  [HEADERS frame]  [DATA frame]
Stream 5: GET /script.js     ─────>  [HEADERS frame]  [DATA frame]

主な改善点:

  • マルチプレクシング: 1つのTCP接続で複数のリクエスト/レスポンスを同時処理
  • HPACKヘッダー圧縮: ヘッダーサイズを大幅に削減
  • サーバープッシュ: クライアントがリクエストする前にリソースを先行送信
  • ストリーム優先度: 重要なリソースを優先的に配信
# curlでHTTP/2リクエスト
curl -v --http2 https://example.com

# nghttp2でHTTP/2フレームを確認
nghttp -v https://example.com

HTTP/3(QUIC)

HTTP/3はTCPの代わりにQUIC(UDPベース)を使用する。

HTTP/1.1:  TCP + TLS(別々のハンドシェイク)
HTTP/2:    TCP + TLS(マルチプレクシング、しかしTCPレベルのHOLブロッキング)
HTTP/3:    QUICUDPベース、ストリームごとの独立したフロー制御)

QUICの利点:

  • 0-RTT接続: 以前の接続情報を再利用して即座にデータ送信
  • 独立したストリーム: あるストリームのパケットロスが他に影響しない
  • 接続マイグレーション: IPアドレスが変更されても接続を維持(モバイル環境に有利)
# curlでHTTP/3リクエスト
curl --http3 https://example.com

# QUIC接続の確認
curl -v --http3 https://cloudflare-quic.com

パフォーマンス比較

特性HTTP/1.1HTTP/2HTTP/3
トランスポートTCPTCPQUIC (UDP)
マルチプレクシングXOO
ヘッダー圧縮XHPACKQPACK
サーバープッシュXOO
HOLブロッキングOTCPレベルX
0-RTTXXO

4. DNSの動作原理

DNS(Domain Name System)は、ドメイン名をIPアドレスに変換する分散データベースシステムである。

DNSクエリプロセス

ブラウザ
  |
  |-- 1. ローカルキャッシュを確認
  |
  v
ローカルDNSリゾルバ(例: 192.168.1.1  |
  |-- 2. キャッシュにない場合、再帰クエリを開始
  |
  v
ルートDNSサーバー (.)
  |
  |-- 3. ".comのネームサーバーはa.gtld-servers.netです"
  |
  v
TLD DNSサーバー (.com)
  |
  |-- 4. "example.comのネームサーバーはns1.example.comです"
  |
  v
権威DNSサーバー (example.com)
  |
  |-- 5. "example.comのIPは93.184.216.34です"
  |
  v
ローカルDNSリゾルバ(キャッシュに保存)
  |
  v
ブラウザ(IPアドレスで接続)

再帰クエリ vs 反復クエリ

  • 再帰クエリ(Recursive): リゾルバが最終的な回答を見つけるまで代わりにクエリ
  • 反復クエリ(Iterative): 各サーバーが次にクエリすべきサーバーのアドレスのみ返す

DNSレコードタイプ

レコード用途
AIPv4アドレスマッピングexample.com -> 93.184.216.34
AAAAIPv6アドレスマッピングexample.com -> 2606:2800:220:1:...
CNAMEドメインエイリアスwww.example.com -> example.com
MXメールサーバーexample.com -> mail.example.com (priority 10)
TXTテキスト情報SPF, DKIM, ドメイン所有証明
NSネームサーバー指定example.com -> ns1.example.com
SOAゾーン情報シリアル番号、更新周期
SRVサービスロケーション特定サービスのホストとポート
PTR逆引きDNSIP -> ドメイン名

digコマンドの活用

# Aレコードの問い合わせ
dig example.com A

# 特定のDNSサーバーで問い合わせ
dig @8.8.8.8 example.com

# MXレコードの問い合わせ
dig example.com MX

# TXTレコードの問い合わせ(SPF確認)
dig example.com TXT

# 逆引きDNS
dig -x 93.184.216.34

# 完全なDNSトレース
dig +trace example.com

# 短縮出力
dig +short example.com

# DNSSEC検証
dig +dnssec example.com

DNSキャッシュ管理

# systemd-resolvedのキャッシュ統計(Linux)
resolvectl statistics

# DNSキャッシュのフラッシュ
sudo resolvectl flush-caches

# /etc/resolv.confの確認
cat /etc/resolv.conf

# nsswitch.confでDNS解決順序を確認
grep hosts /etc/nsswitch.conf

5. TLS/SSLハンドシェイク

HTTPSはHTTPにTLS(Transport Layer Security)を組み合わせたものである。

TLS 1.3ハンドシェイクプロセス

Client                                Server
  |                                     |
  |--- ClientHello ------------------>  |   サポートする暗号スイート、鍵共有
  |    (+ key_share)                    |
  |                                     |
  |<-- ServerHello ------------------- |   選択された暗号スイート、鍵共有
  |    (+ key_share)                    |
  |<-- EncryptedExtensions ----------- |
  |<-- Certificate ------------------- |   サーバー証明書
  |<-- CertificateVerify ------------- |   署名検証
  |<-- Finished ---------------------- |
  |                                     |
  |--- Finished --------------------->  |
  |                                     |
  |==== 暗号化通信開始 ===============|

TLS 1.3の主な改善点:

  • 1-RTTハンドシェイク: TLS 1.2の2-RTTから1-RTTに短縮
  • 0-RTT再開: 以前の接続のPSKを使用して即座にデータ送信
  • 安全でないアルゴリズムの削除: RC4, DES, MD5等を削除
  • Perfect Forward Secrecy必須: ECDHEのみ許可

証明書チェーン

ルートCA(自己署名)
  |
  |-- 中間CA(ルートCAが署名)
        |
        |-- サーバー証明書(中間CAが署名)
# 証明書チェーンの確認
openssl s_client -connect example.com:443 -showcerts

# 証明書の詳細情報
openssl x509 -in cert.pem -text -noout

# 証明書の有効期限確認
echo | openssl s_client -connect example.com:443 2>/dev/null | \
  openssl x509 -noout -dates

# TLSバージョンと暗号スイートの確認
openssl s_client -connect example.com:443 -tls1_3

Let's Encryptで証明書を発行

# certbotのインストール(Ubuntu)
sudo apt install certbot python3-certbot-nginx

# 証明書の発行(Nginx)
sudo certbot --nginx -d example.com -d www.example.com

# 証明書更新のテスト
sudo certbot renew --dry-run

# 自動更新タイマーの確認
systemctl list-timers | grep certbot

6. Linuxネットワークスタック

ソケット基礎

ソケットはネットワーク通信のエンドポイントである。Linuxではソケットはファイルディスクリプタとして管理される。

# オープンソケットの確認
ss -tuln

# プロセス情報付きソケット表示
ss -tulnp

# ソケット統計
ss -s

epoll - 高性能I/O多重化

Linuxのepollは大量のファイルディスクリプタを効率的に監視する。

select/poll: O(n) - 全fdをスキャンして準備完了のものを探す
epoll:       O(1) - イベントが発生したfdのみ返す

epollの動作:
1. epoll_create() - epollインスタンスの作成
2. epoll_ctl()    - 監視するfdの登録/変更/削除
3. epoll_wait()   - イベント待ち(ブロッキングまたはノンブロッキング)

Nginx、Redis、Node.jsなどの高性能サーバーはすべてepollに基づいて動作する。

iptables / nftables

iptablesはLinuxカーネルのnetfilterフレームワークを使用するパケットフィルタリングツールである。

iptablesチェーン構造

                    PREROUTING
                        |
                  [ルーティング判断]
                   /         \
              INPUT        FORWARD
                |              |
          [ローカルプロセス]  [他のインターフェース]
                |              |
             OUTPUT        POSTROUTING
                \            /
              POSTROUTING

iptables基本コマンド

# 現在のルールを表示
sudo iptables -L -n -v

# 特定ポートの許可
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 特定IPのブロック
sudo iptables -A INPUT -s 10.0.0.100 -j DROP

# SSH接続制限(1分あたり3回)
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

# NAT設定(マスカレード)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# ルールの保存
sudo iptables-save > /etc/iptables/rules.v4

nftables(iptablesの後継)

# 現在のnftルールを表示
sudo nft list ruleset

# テーブルの作成
sudo nft add table inet my_filter

# チェーンの作成
sudo nft add chain inet my_filter input \
  '{ type filter hook input priority 0; policy drop; }'

# ルールの追加
sudo nft add rule inet my_filter input tcp dport 80 accept
sudo nft add rule inet my_filter input tcp dport 443 accept

# ルールの保存
sudo nft list ruleset > /etc/nftables.conf

ルーティングテーブル

# ルーティングテーブルの表示
ip route show

# デフォルトゲートウェイの確認
ip route | grep default

# 特定宛先への経路を確認
ip route get 8.8.8.8

# スタティックルートの追加
sudo ip route add 10.10.0.0/24 via 192.168.1.1 dev eth0

# ポリシーベースルーティング
sudo ip rule add from 10.0.1.0/24 table 100
sudo ip route add default via 10.0.1.1 table 100

7. systemd完全ガイド

ユニットファイル構造

systemdはユニットファイルでサービス、タイマー、マウントなどを管理する。

ユニットファイルの場所:

  • /etc/systemd/system/ - 管理者が作成したユニット(最優先)
  • /run/systemd/system/ - ランタイムユニット
  • /usr/lib/systemd/system/ - パッケージがインストールしたユニット

サービスユニットファイルの例

# /etc/systemd/system/myapp.service
[Unit]
Description=My Application Server
After=network.target postgresql.service
Requires=postgresql.service
Documentation=https://example.com/docs

[Service]
Type=notify
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
Environment=NODE_ENV=production
EnvironmentFile=/etc/myapp/env
ExecStartPre=/opt/myapp/scripts/check-deps.sh
ExecStart=/usr/bin/node /opt/myapp/server.js
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
StartLimitBurst=3
StartLimitIntervalSec=60

# セキュリティ強化
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/myapp /var/log/myapp
PrivateTmp=true

[Install]
WantedBy=multi-user.target

サービス管理コマンド

# サービス状態の確認
systemctl status myapp.service

# サービスの起動/停止/再起動
sudo systemctl start myapp.service
sudo systemctl stop myapp.service
sudo systemctl restart myapp.service

# 設定変更後のリロード(PID維持)
sudo systemctl reload myapp.service

# 起動時の自動起動設定
sudo systemctl enable myapp.service
sudo systemctl enable --now myapp.service  # 即時起動 + 自動起動

# ユニットファイル変更後のデーモンリロード
sudo systemctl daemon-reload

# 失敗したサービスの確認
systemctl --failed

# サービスの依存関係を確認
systemctl list-dependencies myapp.service

journalctl - ログ管理

# 特定サービスのログを確認
journalctl -u myapp.service

# リアルタイムログの監視
journalctl -u myapp.service -f

# 過去1時間のログ
journalctl -u myapp.service --since "1 hour ago"

# 特定の時間範囲
journalctl --since "2026-04-12 10:00:00" --until "2026-04-12 12:00:00"

# エラーレベル以上のみ表示
journalctl -u myapp.service -p err

# ブート別ログ
journalctl -b -1  # 前回のブート
journalctl -b 0   # 現在のブート

# ディスク使用量の確認
journalctl --disk-usage

# 古いログの削除
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=500M

systemdタイマー(cronの代替)

# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
# /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup

[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
# タイマーの有効化
sudo systemctl enable --now backup.timer

# 全タイマーの確認
systemctl list-timers --all

# タイマーの次回実行時刻を確認
systemctl status backup.timer

8. プロセス管理

fork/execモデル

Linuxでは新しいプロセスはfork()で現在のプロセスを複製した後、exec()で新しいプログラムを実行する。

Parent Process (PID 100)
    |
    |-- fork() --> Child Process (PID 101)
                       |
                       |-- exec("/bin/ls") --> lsプログラムの実行
# プロセスツリーの確認
pstree -p

# 特定プロセスの詳細情報
cat /proc/PID/status

# プロセスが使用しているファイルディスクリプタ
ls -la /proc/PID/fd/

ゾンビプロセスとオーファンプロセス

# ゾンビプロセスの確認
ps aux | awk '$8 ~ /Z/'

# オーファンプロセスはinit(PID 1)が自動的に引き取る
# ゾンビプロセスは親がwait()を呼び出す必要がある

# ゾンビプロセスの親を探す
ps -eo pid,ppid,stat,cmd | grep -w Z

ゾンビプロセスの解決方法:

  1. 親プロセスにSIGCHLDシグナルを送信
  2. 親プロセスを終了(initがゾンビを回収)
  3. アプリケーションコードでwait()またはwaitpid()を呼び出す

cgroups(Control Groups)

cgroupsはプロセスグループのリソース使用量を制限する。

# cgroup v2の確認
mount | grep cgroup2

# 現在のcgroupを確認
cat /proc/self/cgroup

# CPU使用量を50%に制限するcgroupの作成
sudo mkdir /sys/fs/cgroup/my_limited_group
echo "50000 100000" | sudo tee /sys/fs/cgroup/my_limited_group/cpu.max

# メモリ制限(512MB)
echo "536870912" | sudo tee /sys/fs/cgroup/my_limited_group/memory.max

# プロセスをcgroupに割り当て
echo PID | sudo tee /sys/fs/cgroup/my_limited_group/cgroup.procs

namespaces(名前空間)

名前空間はプロセスを隔離された環境で実行する。Dockerコンテナのコア技術である。

名前空間隔離対象フラグ
PIDプロセスIDCLONE_NEWPID
NetworkネットワークスタックCLONE_NEWNET
MountファイルシステムマウントCLONE_NEWNS
UTSホスト名CLONE_NEWUTS
IPCIPCリソースCLONE_NEWIPC
Userユーザー/グループIDCLONE_NEWUSER
CgroupcgroupルートCLONE_NEWCGROUP
# 名前空間の一覧
lsns

# 新しいネットワーク名前空間の作成
sudo ip netns add test_ns

# 名前空間内でコマンドを実行
sudo ip netns exec test_ns ip addr

# unshareで隔離環境を作成
sudo unshare --pid --fork --mount-proc bash

# 名前空間の一覧
ip netns list

9. Linuxファイルシステム

VFS(Virtual File System)

VFSは様々なファイルシステムを統一されたインターフェースでアクセスできるようにする抽象化レイヤーである。

ユーザープロセス
    |
    |-- open(), read(), write() ...
    |
    v
VFS (Virtual File System)
    |
    ├── ext4
    ├── XFS
    ├── btrfs
    ├── NFS
    ├── procfs (/proc)
    └── sysfs (/sys)

inode(アイノード)

すべてのファイルはinodeでメタデータを管理する。

# ファイルのinode番号を確認
ls -i file.txt

# inodeの詳細情報
stat file.txt

# ファイルシステムのinode使用量を確認
df -i

# ハードリンク vs シンボリックリンク
# ハードリンク: 同じinodeを共有
ln original.txt hardlink.txt

# シンボリックリンク: 別のinode、パスを指す
ln -s original.txt symlink.txt

ファイルシステムの比較

特性ext4XFSbtrfs
最大ファイルサイズ16TB8EB16EB
最大ボリュームサイズ1EB8EB16EB
スナップショットXXO (CoW)
圧縮XXO
RAIDサポート外部外部内蔵
オンラインリサイズ拡張のみ拡張のみ拡張+縮小
最適用途汎用大容量ファイルスナップショット/バックアップ
# ファイルシステムタイプの確認
df -Th

# ファイルシステムの詳細情報
sudo tune2fs -l /dev/sda1    # ext4
sudo xfs_info /dev/sda1      # XFS
sudo btrfs filesystem show    # btrfs

/procファイルシステム

/procはカーネルとプロセス情報をファイルとして公開する仮想ファイルシステムである。

# CPU情報
cat /proc/cpuinfo

# メモリ情報
cat /proc/meminfo

# ロードアベレージ
cat /proc/loadavg

# カーネルバージョン
cat /proc/version

# ネットワーク接続情報
cat /proc/net/tcp

# 特定プロセスの情報
cat /proc/PID/status    # プロセス状態
cat /proc/PID/maps      # メモリマップ
cat /proc/PID/cmdline   # 実行コマンド

/sysファイルシステム

/sysはカーネルのデバイスモデル情報を公開する。

# ブロックデバイス情報
ls /sys/block/

# ネットワークインターフェース情報
ls /sys/class/net/

# CPU周波数情報
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

# ディスクスケジューラの確認
cat /sys/block/sda/queue/scheduler

10. トラブルシューティングツール集

ss(Socket Statistics)

ssnetstatの現代的な代替ツールである。

# すべてのTCP接続(リスニング含む)
ss -tuln

# ESTABLISHED状態のみ
ss -t state established

# 特定ポートへの接続数を確認
ss -tn dport = :443 | wc -l

# プロセス情報を含む
ss -tulnp

# ソケットメモリ使用量
ss -tm

# TIME_WAIT状態の接続
ss -t state time-wait

tcpdump

# 特定インターフェースでキャプチャ
sudo tcpdump -i eth0

# 特定ホストとの通信のみキャプチャ
sudo tcpdump -i eth0 host 10.0.0.1

# 特定ポートのキャプチャ
sudo tcpdump -i eth0 port 80

# DNSクエリのキャプチャ
sudo tcpdump -i eth0 port 53

# ファイルに保存
sudo tcpdump -i eth0 -w capture.pcap

# 保存されたファイルの読み込み
tcpdump -r capture.pcap

# HTTPリクエスト/レスポンスの内容を表示
sudo tcpdump -i eth0 -A port 80

# SYNパケットのみキャプチャ(新規接続の監視)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'

strace

# システムコールのトレース
strace -p PID

# ネットワーク関連のシステムコールのみ
strace -e trace=network -p PID

# ファイル関連のシステムコール
strace -e trace=file ls

# 時間情報を含む
strace -T -p PID

# 子プロセスも追跡
strace -f -p PID

# 出力をファイルに保存
strace -o output.txt -p PID

lsof(List Open Files)

# 特定ポートを使用しているプロセスの確認
sudo lsof -i :80

# 特定プロセスが開いているファイル
lsof -p PID

# 特定ファイルを使用しているプロセス
lsof /var/log/syslog

# 削除されたがまだ開いているファイル(ディスク空間が回収されない)
lsof +L1

# ネットワーク接続の確認
lsof -i -P -n

# 特定ユーザーの開いているファイル
lsof -u username

perf(Performance Counters)

# CPUプロファイリング(10秒)
sudo perf record -g -p PID -- sleep 10

# 結果の確認
sudo perf report

# リアルタイムのトップ関数
sudo perf top -p PID

# システム全体の統計
sudo perf stat -a -- sleep 5

# フレームグラフの生成
sudo perf record -g -p PID -- sleep 30
sudo perf script > out.perf
# FlameGraphツールで変換
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > flamegraph.svg

総合トラブルシューティングチェックリスト

ネットワーク障害が発生した際に順番に確認するチェックリスト:

# 1. インターフェース状態の確認
ip addr show
ip link show

# 2. ルーティングの確認
ip route show
traceroute TARGET_HOST

# 3. DNSの確認
dig TARGET_DOMAIN
nslookup TARGET_DOMAIN

# 4. 接続の確認
ping TARGET_HOST
curl -v http://TARGET_HOST

# 5. ポートの確認
ss -tuln
sudo lsof -i :PORT

# 6. ファイアウォールの確認
sudo iptables -L -n
sudo nft list ruleset

# 7. パケットキャプチャ
sudo tcpdump -i eth0 host TARGET_HOST

# 8. システムリソースの確認
top
free -h
df -h

# 9. ログの確認
journalctl -xe
dmesg | tail

まとめ

この記事で取り上げた内容を要約すると:

  • ネットワーク基礎: OSI/TCP/IP階層モデル、TCPハンドシェイク、フロー/輻輳制御
  • Webプロトコル: HTTP/1.1からHTTP/3への進化、TLSハンドシェイク
  • DNS: クエリプロセス、レコードタイプ、digの活用
  • Linuxネットワーク: ソケット、epoll、iptables/nftables、ルーティング
  • systemd: ユニットファイル、サービス管理、journalctl、タイマー
  • プロセス: fork/exec、ゾンビ/オーファン、cgroups、namespaces
  • ファイルシステム: VFS、inode、ext4/XFS/btrfs、/proc、/sys
  • トラブルシューティング: ss、tcpdump、strace、lsof、perf

この知識はサーバー運用、インフラ管理、DevOps業務で毎日使われる。問題が発生した際にどの層で問題が起きているかを素早く特定することが核心である。各ツールを実際の環境で直接実行しながら習得することを推奨する。