單公網 IP、單網卡 (eth0) 的 Linux 服務器,需狀態檢測防火牆、開放特定服務端口(SSH、HTTP/HTTPS、自定義),禁止其餘入站連接。
apt update && apt install shorewall shorewall6 # IPv6 同步部署
cp -r /usr/share/doc/shorewall/examples/one-interface/* /etc/shorewall/
cp -r /usr/share/doc/shorewall6/examples/one-interface/* /etc/shorewall6/
# /etc/shorewall/shorewall.conf
STARTUP_ENABLED=Yes
# /etc/default/shorewall
startup=1
ip -br link # 假設為 eth0
# /etc/shorewall/interfaces
#ZONE INTERFACE OPTIONS
net eth0 detect,tcpflags,logmartians,nosmurfs,blacklist
# /etc/shorewall/rules
#ACTION SOURCE DEST PROTO DEST PORT RATE LIMIT
# 基礎防護
ACCEPT net $FW icmp echo-request - # 允許 ping
DROP net $FW tcp 22 - # 預設關閉 SSH(下文開放)
# 開放服務
ACCEPT net $FW tcp 22 - # SSH
ACCEPT net $FW tcp 80,443 - # HTTP/HTTPS
# 自定義:僅允許特定 IP 訪問管理端口
ACCEPT net:203.0.113.5 $FW tcp 8443 - # 僅此 IP 可訪問 8443
# 拒絕其餘入站(隱含默認策略),出站允許
# 預設 policy: $FW net ACCEPT; net $FW DROP; 已在 policy 文件定義
SOURCE:net (互聯網)、$FW (防火牆主機)、loc (內網區域)、net:IP (特定公網 IP)。DEST:同源區域定義。PROTO:tcp/udp/icmp/esp 等。DEST PORT:端口號、逗號分隔列表、start:end 範圍、服務名 (需定義在 /etc/shorewall/services)。RATE LIMIT:limit:burst 格式,如 5/minute:10。# /etc/shorewall/policy
#SOURCE DEST POLICY LOG LEVEL LIMIT
$FW net ACCEPT info -
net $FW DROP info -
net all DROP info -
# THE FOLLOWING POLICY MUST BE LAST
all all REJECT info -
shorewall check # 語法檢查,無錯誤顯示 "Shorewall configuration verified"
shorewall start # 啟動
shorewall status # 顯示當前規則計數
iptables -nvL # 底層 iptables 規則檢視
# 測試:外部嘗試連接 SSH/HTTP,確認通/阻符合預期
| 任務 | 命令 |
|---|---|
| 重新載入規則(無中斷現有連接) | shorewall reload |
| 暫時開放端口(調試) | shorewall allow net $FW tcp 3306 |
| 永久開放端口 | 編輯 rules → shorewall reload |
| 查看日誌 | journalctl -u shorewall -f 或 dmesg -T | grep Shorewall |
| IPv6 同步配置 | 編輯 /etc/shorewall6/ 對應文件 → shorewall6 reload |
rules 中先添加 ACCEPT net $FW tcp 22 再 reload。DOCKER_OPTS="--iptables=false" 或使用 shorewall-docker 集成腳本。Shorewall 以區域、策略、規則三層抽象,將複雜的 iptables 變為可讀、可維護的聲明式配置。單網卡服務器只需 interfaces、policy、rules 三個核心文件,十分鐘完成企業級防火牆部署。