Ubuntu UFW 防火牆完整安全配置指南
Ubuntu UFW 防火牆完整安全配置指南
目標
僅允許特定 IP (xxx.xxx.64.97) 透過 SSH (埠號 22) 訪問 Ubuntu 主機,拒絕所有其他外部連線。
一、核心安全策略
採用「預設拒絕,例外允許」原則:
- 預設拒絕所有傳入連線
- 預設拒絕所有傳出連線
- 預設拒絕所有路由轉發
- 僅允許特定 IP 的 SSH 連線
二、UFW 防火牆設定步驟
步驟 1:檢查當前狀態
sudo ufw status verbose
Status: inactive
= 尚未啟用Status: active
= 已啟用
步驟 2:設定預設策略
sudo ufw default deny incoming
sudo ufw default deny outgoing
sudo ufw default deny routed
步驟 3:允許特定 IP 的 SSH 連線
sudo ufw allow from xxx.xxx.64.97 to any port 22
重要提示:如果使用非標準 SSH 埠(如 2222),請修改為
port 2222
步驟 4:清理多餘規則
- 檢視所有規則編號:
sudo ufw status numbered
- 刪除衝突規則:
- 刪除
22/tcp ALLOW IN Anywhere
類型的規則 - 刪除多餘的 DENY 規則(80, 443, 8080 等)
- 刪除
sudo ufw delete [規則編號]
注意:每次刪除後重新執行
sudo ufw status numbered
確認編號
步驟 5:啟用防火牆
sudo ufw enable
系統提示時輸入 y
確認
步驟 6:重新載入規則(如已啟用)
sudo ufw reload
三、驗證防火牆配置
檢查 UFW 狀態
sudo ufw status verbose
預期結果:
Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), deny (routed)
To Action From
-- ------ ----
22/tcp ALLOW IN xxx.xxx.64.97
外部埠掃描驗證
使用另一台外部主機安裝 nmap 進行掃描:
基本掃描
nmap -Pn [您的Ubuntu主機IP]
完整埠掃描
nmap -p- [您的Ubuntu主機IP]
詳細掃描
nmap -v --reason [您的Ubuntu主機IP]
預期掃描結果:
- 從 xxx.xxx.64.97 掃描:22 埠顯示
open
,其他埠顯示filtered
- 從其他 IP 掃描:所有埠(包括 22)都顯示
filtered
或closed
即時監控防火牆日誌
sudo tail -f /var/log/ufw.log
觀察被阻止的連線嘗試,確認防火牆正常運作
檢查 SSH 服務日誌
sudo journalctl -u ssh.service -f
四、系統服務狀態檢查
檢視正在運行的服務
sudo systemctl list-units --type=service --state=running
檢查特定服務狀態
systemctl status ssh.service
systemctl status ufw.service
檢查服務是否開機啟動
systemctl is-enabled ssh.service
systemctl is-enabled ufw.service
五、額外安全層配置
5.1 使用 hosts.deny/hosts.allow
在 /etc/hosts.deny
添加:
sshd: ALL
在 /etc/hosts.allow
添加:
sshd: xxx.xxx.64.97
5.2 強化 SSH 安全設定
編輯 SSH 配置檔 /etc/ssh/sshd_config
:
# 停用密碼認證,強制使用金鑰認證
PasswordAuthentication no
PubkeyAuthentication yes
# 停用 root 登入
PermitRootLogin no
# 限制登入嘗試次數
MaxAuthTries 3
# 設定連線超時
ClientAliveInterval 300
ClientAliveCountMax 2
# 停用 X11 轉發(如不需要)
X11Forwarding no
重啟 SSH 服務:
sudo systemctl restart ssh
5.3 整合 Fail2ban 入侵防護
安裝 Fail2ban:
sudo apt update
sudo apt install fail2ban
建立自訂 Fail2ban 配置:
sudo nano /etc/fail2ban/jail.local
加入以下內容:
[DEFAULT]
# 封鎖時間(秒)
bantime = 3600
# 監控時間窗口(秒)
findtime = 600
# 失敗次數門檻
maxretry = 3
# 使用 UFW 作為封鎖動作
banaction = ufw
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
啟用並啟動 Fail2ban:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
檢查 Fail2ban 狀態:
sudo fail2ban-client status
sudo fail2ban-client status sshd
六、Docker 容器環境注意事項
Docker 與 UFW 的衝突問題
如果系統中運行 Docker,需要特別注意:
-
Docker 繞過 UFW 規則: Docker 會直接操作 iptables,可能繞過 UFW 設定
-
解決方案 - 使用 ufw-docker:
# 安裝 ufw-docker 工具
sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
sudo chmod +x /usr/local/bin/ufw-docker
# 修改 UFW 配置
sudo ufw-docker --add-service docker-proxy 2376/tcp
- Docker 服務配置:
在
/etc/default/ufw
中設定:
DEFAULT_FORWARD_POLICY="ACCEPT"
- 重新啟動服務:
sudo systemctl restart ufw
sudo systemctl restart docker
七、處理傳出連線限制
由於設定了 deny outgoing
,以下功能將受限:
- 系統更新(apt update/upgrade)
- DNS 解析
- 外部服務連線
如需要這些功能,添加傳出規則:
# DNS 解析
sudo ufw allow out to any port 53 proto udp
sudo ufw allow out to any port 53 proto tcp
# HTTP/HTTPS(用於系統更新)
sudo ufw allow out to any port 80 proto tcp
sudo ufw allow out to any port 443 proto tcp
八、進階安全監控
8.1 啟用詳細日誌記錄
sudo ufw logging on
sudo ufw logging medium # 或 high 獲得更詳細日誌
8.2 設定 Logrotate 管理日誌
建立 /etc/logrotate.d/ufw
檔案:
/var/log/ufw.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 root root
postrotate
systemctl reload rsyslog > /dev/null 2>&1 || true
endrotate
}
8.3 自動化安全監控腳本
建立監控腳本 /opt/security-monitor.sh
:
#!/bin/bash
# 每日安全檢查腳本
LOG_FILE="/var/log/security-monitor.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] Security Monitor Report" >> $LOG_FILE
# 檢查 UFW 狀態
if ! sudo ufw status | grep -q "Status: active"; then
echo "[$DATE] WARNING: UFW is not active!" >> $LOG_FILE
fi
# 檢查 SSH 登入失敗次數
FAILED_SSH=$(grep "Failed password" /var/log/auth.log | grep $(date '+%b %d') | wc -l)
if [ $FAILED_SSH -gt 10 ]; then
echo "[$DATE] WARNING: $FAILED_SSH SSH login failures today" >> $LOG_FILE
fi
# 檢查 Fail2ban 狀態
if ! systemctl is-active --quiet fail2ban; then
echo "[$DATE] WARNING: Fail2ban is not running!" >> $LOG_FILE
fi
設定執行權限和 cron 排程:
sudo chmod +x /opt/security-monitor.sh
sudo crontab -e
加入:
0 6 * * * /opt/security-monitor.sh
九、故障排除
常見問題
- 掃描顯示主機離線:使用
-Pn
參數跳過 ping 探測 - SSH 連線失敗:確認規則中的 IP 地址正確
- 系統無法更新:添加必要的傳出規則
- Docker 容器無法連線:檢查 Docker 與 UFW 的整合設定
- Fail2ban 與 UFW 衝突:確保使用正確的 banaction 設定
緊急恢復程序
如果無法 SSH 連線,可透過以下方式恢復:
透過雲端控制台或實體存取:
sudo ufw reset # 重置所有規則
sudo ufw disable # 暫時停用防火牆
備份和恢復 UFW 規則:
# 備份當前規則
sudo cp /etc/ufw/user.rules /etc/ufw/user.rules.backup
sudo cp /etc/ufw/user6.rules /etc/ufw/user6.rules.backup
# 恢復備份規則
sudo cp /etc/ufw/user.rules.backup /etc/ufw/user.rules
sudo cp /etc/ufw/user6.rules.backup /etc/ufw/user6.rules
sudo ufw reload
測試模式操作
在生產環境修改前,建議使用測試模式:
# 建立測試規則並設定自動恢復
(sleep 300 && sudo ufw disable) &
sudo ufw enable
# 在 5 分鐘內測試連線,如無法連線則自動停用
十、安全檢查清單
- UFW 狀態為 active
- 預設策略均為 deny
- 僅有必要的 SSH 允許規則
- 外部掃描結果符合預期
- 防火牆日誌正常記錄阻擋事件
- SSH 服務正常運行且已強化設定
- 所有多餘規則已清除
- SSH 金鑰認證已設定
- Fail2ban 已安裝並運行
- Docker 與 UFW 整合正常(如適用)
- 日誌輪轉設定完成
- 監控腳本已設定
- 備份規則已建立
十一、定期維護建議
每週檢查
- 檢視 UFW 和 Fail2ban 日誌
- 確認無異常連線嘗試
- 驗證允許的 IP 地址仍然有效
每月檢查
- 更新系統安全套件
- 檢查 SSH 金鑰是否需要輪換
- 檢視 Fail2ban 封鎖統計
每季檢查
- 重新評估防火牆規則需求
- 測試緊急恢復程序
- 檢查備份規則的完整性
注意事項
- 備份重要性:設定前建議備份現有配置
- 測試連線:每次修改後從允許的 IP 測試 SSH 連線
- 日誌監控:定期檢查防火牆日誌,識別異常活動
- 定期更新:保持系統和安全工具的更新
透過遵循此指南,您的 Ubuntu 主機將具備企業級的網路安全防護。