The Own Lab The Own Lab

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]
層級協定工具
ApplicationHTTP, DNS, SSH, SMTPcurl, dig, ssh
TransportTCP, UDPss, netstat
InternetIP, ICMPping, traceroute, ip
Network AccessEthernet, ARPip 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 虛擬介面
介面說明用途
loLoopback(127.0.0.1)本機通訊
eth0 / ens33有線網路主要網路
docker0Docker bridgeContainer 網路
veth*Virtual EthernetContainer ↔ 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 eth0192.168.1.x 的封包直接從 eth0 送出(同網段)
172.17.0.0/16 dev docker0Docker 容器的封包走 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 速查###

CIDRSubnet Mask可用 IP 數常見用途
/32255.255.255.2551單一 host
/24255.255.255.0254小型網路
/16255.255.0.065,534中型網路
/8255.0.0.016,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(只有本機可連)
:::80IPv6 所有介面

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###

面向ufwiptables
學習曲線
適用場景簡單規則複雜規則、NAT、轉發
底層基於 iptablesLinux 原生
生產環境個人伺服器企業級

Quiz##

Single Choice

當服務無法從外部連線時,以下哪個指令可以確認服務是否在監聽?

Single Choice

服務綁定在 127.0.0.1:3000,外部為什麼連不上?

Single Choice

192.168.1.0/24 代表什麼?

Single Choice

設定 iptables -P INPUT DROP 前,最重要的前置步驟是什麼?

Single Choice

tcpdump 最適合在什麼情況下使用?

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)

登入後即可留言