Linux 網路管理
網路模型、IP 設定、診斷工具與防火牆的實務操作指南
Overview##
每個部署在 Linux 上的服務——Web Server、API、資料庫——都依賴網路。當服務連不上、回應慢、或被攻擊時,你需要知道怎麼診斷和修復。
TCP/IP 模型###
實務上使用的是四層的 TCP/IP 模型(不是七層 OSI):
graph TB
A[Application Layer] -->|HTTP, DNS, SSH| B[Transport Layer]
B -->|TCP, UDP| C[Internet Layer]
C -->|IP, ICMP| D[Network Access Layer]
D -->|Ethernet, Wi-Fi| E[Physical Medium]
| 層級 | 協定 | 工具 |
|---|---|---|
| Application | HTTP, DNS, SSH, SMTP | curl, dig, ssh |
| Transport | TCP, UDP | ss, netstat |
| Internet | IP, ICMP | ping, traceroute, ip |
| Network Access | Ethernet, ARP | ip link, arp, tcpdump |
Note
診斷網路問題時,從下往上排查:先確認網路介面有 IP(Internet 層),再確認 port 有監聽(Transport 層),最後確認應用回應正確(Application 層)。
Architecture##
封包流向###
一個 HTTP 請求從你的機器到目標伺服器的完整路徑:
Application: curl https://api.example.com/users
│
Transport: TCP 三次握手(SYN → SYN-ACK → ACK)
│
Internet: Source IP → Router → ... → Router → Dest IP
│
Network: Ethernet Frame → Switch → Gateway
網路介面###
# 列出所有網路介面
ip addr show
# 典型輸出
# lo — loopback(127.0.0.1)
# eth0 — 有線網路(實體或虛擬機)
# ens33 — 有線網路(systemd 命名)
# wlan0 — 無線網路
# docker0 — Docker bridge
# veth* — Docker container 虛擬介面
| 介面 | 說明 | 用途 |
|---|---|---|
lo | Loopback(127.0.0.1) | 本機通訊 |
eth0 / ens33 | 有線網路 | 主要網路 |
docker0 | Docker bridge | Container 網路 |
veth* | Virtual Ethernet | Container ↔ Host |
Routing Table###
Routing table 決定封包從哪個介面、往哪個方向送出:
# 查看 routing table
ip route show
# 典型輸出
# default via 192.168.1.1 dev eth0 ← 預設閘道
# 192.168.1.0/24 dev eth0 scope link ← 本地子網路
# 172.17.0.0/16 dev docker0 scope link ← Docker 網路
| 路由 | 意義 |
|---|---|
default via 192.168.1.1 | 不符合其他規則的封包都送到 192.168.1.1(Gateway) |
192.168.1.0/24 dev eth0 | 192.168.1.x 的封包直接從 eth0 送出(同網段) |
172.17.0.0/16 dev docker0 | Docker 容器的封包走 docker0 |
Tip
如果你的服務無法連到外部網路,先 ip route show 檢查有沒有 default 路由。沒有 default route = 無法連到本地子網路以外的任何地方。
Configuration##
IP / Subnet / Gateway###
臨時設定(重開機失效)####
# 設定 IP
ip addr add 192.168.1.100/24 dev eth0
# 啟用介面
ip link set eth0 up
# 設定 default gateway
ip route add default via 192.168.1.1
# 設定 DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf
持久設定 — Netplan(Ubuntu)####
# /etc/netplan/01-config.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
# 套用設定
sudo netplan apply
持久設定 — nmcli(RHEL / Fedora)####
# 設定靜態 IP
nmcli con mod eth0 ipv4.addresses 192.168.1.100/24
nmcli con mod eth0 ipv4.gateway 192.168.1.1
nmcli con mod eth0 ipv4.dns "8.8.8.8 8.8.4.4"
nmcli con mod eth0 ipv4.method manual
# 套用
nmcli con up eth0
Subnet 速查###
| CIDR | Subnet Mask | 可用 IP 數 | 常見用途 |
|---|---|---|---|
/32 | 255.255.255.255 | 1 | 單一 host |
/24 | 255.255.255.0 | 254 | 小型網路 |
/16 | 255.255.0.0 | 65,534 | 中型網路 |
/8 | 255.0.0.0 | 16,777,214 | 大型網路 |
Note
/24 是最常用的子網路大小。192.168.1.0/24 代表 192.168.1.1 到 192.168.1.254 共 254 個可用 IP(.0 是網路位址,.255 是廣播位址)。
Diagnostics##
Layer 3 — IP 連通性###
# ping:確認目標可達
ping -c 4 8.8.8.8
# traceroute:追蹤封包路徑
traceroute 8.8.8.8
# mtr:結合 ping + traceroute(持續監控)
mtr 8.8.8.8
| 工具 | 用途 | 常用參數 |
|---|---|---|
ping | 測試連通性 + 延遲 | -c 4(發 4 個封包) |
traceroute | 追蹤路由路徑 | -n(不解析 hostname) |
mtr | 持續追蹤 | 即時更新,顯示每一跳的遺失率 |
Layer 4 — Port 和連線###
# ss:檢查監聽的 port(取代 netstat)
ss -tlnp
# -t TCP -l listening -n numeric -p process
# 檢查特定 port
ss -tlnp | grep :3000
# 檢查所有連線(含 ESTABLISHED)
ss -tnp
ss 輸出解讀:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234))
LISTEN 0 128 127.0.0.1:3000 0.0.0.0:* users:(("node",pid=5678))
| Local Address | 意義 |
|---|---|
0.0.0.0:80 | 監聽所有介面的 port 80(外部可連) |
127.0.0.1:3000 | 只監聽 loopback(只有本機可連) |
:::80 | IPv6 所有介面 |
Warning
如果你的服務只綁在 127.0.0.1,外部是連不進來的。需要改綁 0.0.0.0 或指定的網路介面 IP。
Layer 7 — DNS 和 HTTP###
# dig:查詢 DNS 紀錄
dig example.com
dig example.com MX
dig @8.8.8.8 example.com # 指定 DNS server
# curl:測試 HTTP
curl -v https://api.example.com/health
curl -I https://example.com # 只看 headers
curl -o /dev/null -s -w "%{http_code} %{time_total}s\n" https://example.com
封包擷取 — tcpdump###
# 擷取特定介面的流量
tcpdump -i eth0
# 擷取特定 port
tcpdump -i eth0 port 80
# 擷取特定 host
tcpdump -i eth0 host 192.168.1.100
# 儲存到檔案(可用 Wireshark 開啟)
tcpdump -i eth0 -w capture.pcap
# 組合條件
tcpdump -i eth0 'port 443 and host 10.0.0.5' -c 100
Tip
tcpdump 是最後手段——當其他工具都無法找出問題時,擷取封包可以看到實際的網路通訊內容。搭配 Wireshark 分析更方便。
診斷流程###
graph TD
A[Service unreachable] --> B{ip addr show}
B -->|No IP| C[Fix IP config]
B -->|Has IP| D{ping gateway}
D -->|Fail| E[Check cable / route]
D -->|OK| F{ping external IP}
F -->|Fail| G[Check default route]
F -->|OK| H{dig domain}
H -->|Fail| I[Fix DNS config]
H -->|OK| J{curl service}
J -->|Fail| K{ss -tlnp}
K -->|Not listening| L[Start service]
K -->|Listening| M[Check firewall]
Firewall##
ufw(簡易防火牆)###
Ubuntu 預設的防火牆前端,適合簡單場景:
# 啟用
sudo ufw enable
# 允許特定 port
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
# 允許特定 IP
sudo ufw allow from 192.168.1.0/24 to any port 3306
# 拒絕
sudo ufw deny 8080/tcp
# 查看規則
sudo ufw status numbered
# 刪除規則
sudo ufw delete 3
iptables 基礎###
iptables 是 Linux 原生的封包過濾工具。三個主要 chain:
Incoming packet → PREROUTING → INPUT → Local Process
│
Local Process → OUTPUT → POSTROUTING → Outgoing packet
Forwarded packet → PREROUTING → FORWARD → POSTROUTING
| Chain | 作用於 |
|---|---|
INPUT | 進入本機的封包 |
OUTPUT | 從本機送出的封包 |
FORWARD | 經過本機轉發的封包(如 router) |
# 查看規則
iptables -L -n -v
# 允許 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允許已建立的連線
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 預設拒絕所有 input
iptables -P INPUT DROP
# 允許 loopback
iptables -A INPUT -i lo -j ACCEPT
Caution
設定 iptables -P INPUT DROP 前,務必先允許 SSH(port 22),否則你會被鎖在外面。遠端操作時特別危險。
ufw vs iptables###
| 面向 | ufw | iptables |
|---|---|---|
| 學習曲線 | 低 | 高 |
| 適用場景 | 簡單規則 | 複雜規則、NAT、轉發 |
| 底層 | 基於 iptables | Linux 原生 |
| 生產環境 | 個人伺服器 | 企業級 |
Quiz##
Summary##
- TCP/IP 四層模型:Application → Transport → Internet → Network Access
- 診斷從下往上:先確認 IP → 再確認 port → 最後確認應用
ip addr show看介面和 IP,ip route show看路由表ss -tlnp檢查哪些 port 在監聽——127.0.0.1只本機可連,0.0.0.0外部可連ping測連通性、dig測 DNS、curl測 HTTP、tcpdump擷取封包- 防火牆:ufw 簡單場景、iptables 複雜規則——設定 DROP 前務必先放行 SSH
- 持久 IP 設定:Ubuntu 用 Netplan,RHEL 用 nmcli
留言 (0)
登入後即可留言