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

- Name
- Youngju Kim
- @fjvbn20031
目次
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-7 | HTTP, DNS, SSH, FTP |
| トランスポート | 4 | TCP, UDP |
| インターネット | 3 | IP, ICMP, ARP |
| ネットワークアクセス | 1-2 | Ethernet, 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: QUIC(UDPベース、ストリームごとの独立したフロー制御)
QUICの利点:
- 0-RTT接続: 以前の接続情報を再利用して即座にデータ送信
- 独立したストリーム: あるストリームのパケットロスが他に影響しない
- 接続マイグレーション: IPアドレスが変更されても接続を維持(モバイル環境に有利)
# curlでHTTP/3リクエスト
curl --http3 https://example.com
# QUIC接続の確認
curl -v --http3 https://cloudflare-quic.com
パフォーマンス比較
| 特性 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| トランスポート | TCP | TCP | QUIC (UDP) |
| マルチプレクシング | X | O | O |
| ヘッダー圧縮 | X | HPACK | QPACK |
| サーバープッシュ | X | O | O |
| HOLブロッキング | O | TCPレベル | X |
| 0-RTT | X | X | O |
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レコードタイプ
| レコード | 用途 | 例 |
|---|---|---|
| A | IPv4アドレスマッピング | example.com -> 93.184.216.34 |
| AAAA | IPv6アドレスマッピング | 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 | 逆引きDNS | IP -> ドメイン名 |
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
ゾンビプロセスの解決方法:
- 親プロセスにSIGCHLDシグナルを送信
- 親プロセスを終了(initがゾンビを回収)
- アプリケーションコードで
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 | プロセスID | CLONE_NEWPID |
| Network | ネットワークスタック | CLONE_NEWNET |
| Mount | ファイルシステムマウント | CLONE_NEWNS |
| UTS | ホスト名 | CLONE_NEWUTS |
| IPC | IPCリソース | CLONE_NEWIPC |
| User | ユーザー/グループID | CLONE_NEWUSER |
| Cgroup | cgroupルート | 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
ファイルシステムの比較
| 特性 | ext4 | XFS | btrfs |
|---|---|---|---|
| 最大ファイルサイズ | 16TB | 8EB | 16EB |
| 最大ボリュームサイズ | 1EB | 8EB | 16EB |
| スナップショット | X | X | O (CoW) |
| 圧縮 | X | X | O |
| 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)
ssはnetstatの現代的な代替ツールである。
# すべての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業務で毎日使われる。問題が発生した際にどの層で問題が起きているかを素早く特定することが核心である。各ツールを実際の環境で直接実行しながら習得することを推奨する。