Linux 防火牆端口開放完全指南 | iptables、firewalld 與 UFW 配置教程
為什麼需要配置防火牆?
防火牆是 Linux 系統的第一道安全防線,它可以:
- 🛡️ 阻止未授權訪問:只允許必要的端口對外開放
- 🔒 保護敏感服務:數據庫、管理面板等內網服務不暴露公網
- 📊 監控網絡流量:記錄和分析進出系統的連接
- ⚠️ 防止端口掃描:減少被攻擊面
常見需要開放的端口:
22- SSH 遠程登錄80- HTTP Web 服務443- HTTPS 加密 Web 服務3306- MySQL 數據庫(通常僅內網)6379- Redis 緩存(通常僅內網)8080- 應用服務器/代理
Linux 三大防火牆工具對比
| 特性 | iptables | firewalld | UFW |
|---|---|---|---|
| 複雜度 | 高(底層) | 中 | 低(最簡單) |
| 靈活性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 適用發行版 | 所有 Linux | RHEL/CentOS 7+ | Ubuntu/Debian |
| 學習曲線 | 陡峭 | 中等 | 平緩 |
| 動態更新 | 需重載規則 | 支持熱更新 | 需重載 |
| 推薦場景 | 高級用戶、複雜規則 | CentOS/RHEL 服務器 | Ubuntu/Debian 新手 |
推薦選擇:
- 🟢 Ubuntu/Debian 用戶: 使用 UFW(簡單直觀)
- 🔵 CentOS/RHEL 用戶: 使用 firewalld(系統集成)
- 🔴 高級用戶: 直接使用 iptables(最靈活)
方法一:UFW 防火牆(Ubuntu/Debian 推薦)
1. 安裝與啟用
# 安裝 UFW
sudo apt install ufw -y
# 查看狀態
sudo ufw status
# 啟用 UFW(會提示可能中斷 SSH,輸入 y 確認)
sudo ufw enable
# 開機自啟
sudo systemctl enable ufw2. 基本操作
設置默認策略:
# 默認拒絕所有入站連接
sudo ufw default deny incoming
# 默認允許所有出站連接
sudo ufw default allow outgoing開放端口:
# 開放單個端口(TCP)
sudo ufw allow 80/tcp
# 開放單個端口(UDP)
sudo ufw allow 53/udp
# 開放端口範圍
sudo ufw allow 6000:6007/tcp
# 開放特定協議的端口
sudo ufw allow 22/tcp
sudo ufw allow 443/tcp
# 同時開放 TCP 和 UDP
sudo ufw allow 53開放特定 IP 訪問:
# 允許特定 IP 訪問所有端口
sudo ufw allow from 192.168.1.100
# 允許特定 IP 訪問特定端口
sudo ufw allow from 192.168.1.100 to any port 22
# 允許整個網段
sudo ufw allow from 192.168.1.0/24 to any port 3306刪除規則:
# 查看規則編號
sudo ufw status numbered
# 按編號刪除規則
sudo ufw delete 3
# 按規則內容刪除
sudo ufw delete allow 80/tcp禁用/重置:
# 臨時禁用防火牆
sudo ufw disable
# 重新啟用
sudo ufw enable
# 重置所有規則(恢復默認)
sudo ufw reset3. 常用服務配置示例
Web 服務器(Nginx/Apache):
sudo ufw allow 'Nginx Full' # 同時開放 80 和 443
# 或
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpSSH 安全加固:
# 修改 SSH 端口後(如 2222)
sudo ufw allow 2222/tcp
# 限制 SSH 僅允許特定 IP
sudo ufw allow from 203.0.113.50 to any port 22
# 刪除默認的 SSH 規則
sudo ufw delete allow 22/tcp數據庫(僅內網訪問):
# MySQL
sudo ufw allow from 192.168.1.0/24 to any port 3306
# PostgreSQL
sudo ufw allow from 192.168.1.0/24 to any port 5432
# Redis
sudo ufw allow from 192.168.1.0/24 to any port 6379Docker 容器:
# Docker 會自動管理 iptables,但可以與 UFW 配合
# 確保 UFW 在 Docker 之後啟動
sudo ufw reload
# 或者在 /etc/ufw/before.rules 中添加 Docker 規則4. 查看與管理
# 查看詳細狀態
sudo ufw status verbose
# 查看帶編號的規則列表
sudo ufw status numbered
# 查看日誌
sudo tail -f /var/log/ufw.log
# 啟用日誌記錄
sudo ufw logging on
sudo ufw logging medium # low, medium, high, full方法二:firewalld 防火牆(CentOS/RHEL 推薦)
1. 安裝與啟用
# CentOS 7+ 默認已安裝
# 如果沒有,安裝 firewalld
sudo yum install firewalld -y
# 啟動服務
sudo systemctl start firewalld
# 開機自啟
sudo systemctl enable firewalld
# 查看狀態
sudo systemctl status firewalld2. 基本概念
Zone(區域):
public- 公共網絡(默認)internal- 內部網絡dmz- DMZ 區域drop- 丟棄所有連接block- 拒絕所有連接
Service(服務): 預定義的服務集合,如 ssh, http, https, mysql 等。
3. 基本操作
查看當前配置:
# 查看所有區域
sudo firewall-cmd --get-zones
# 查看默認區域
sudo firewall-cmd --get-default-zone
# 查看當前區域的規則
sudo firewall-cmd --list-all
# 查看所有區域的詳細配置
sudo firewall-cmd --list-all-zones開放端口:
# 開放單個端口(永久生效)
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
# 開放多個端口
sudo firewall-cmd --zone=public --add-port=80/tcp --add-port=443/tcp --permanent
# 開放端口範圍
sudo firewall-cmd --zone=public --add-port=6000-6010/tcp --permanent
# 重新加載使配置生效
sudo firewall-cmd --reload使用服務名稱:
# 添加預定義服務
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --zone=public --add-service=ssh --permanent
# 查看可用服務
sudo firewall-cmd --get-services
# 重新加載
sudo firewall-cmd --reload限制來源 IP:
# 允許特定 IP 訪問 SSH
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept'
# 允許網段訪問 MySQL
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
# 重新加載
sudo firewall-cmd --reload刪除規則:
# 刪除端口
sudo firewall-cmd --zone=public --remove-port=80/tcp --permanent
# 刪除服務
sudo firewall-cmd --zone=public --remove-service=http --permanent
# 刪除富規則
sudo firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept'
# 重新加載
sudo firewall-cmd --reload臨時規則(重啟後失效):
# 不加 --permanent 參數即為臨時規則
sudo firewall-cmd --zone=public --add-port=8080/tcp
# 查看臨時規則
sudo firewall-cmd --zone=public --list-ports4. 高級配置
端口轉發:
# 將 80 端口轉發到 8080
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
# 轉發到其他 IP
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=80
sudo firewall-cmd --reload偽裝(NAT):
# 啟用 IP 偽裝
sudo firewall-cmd --permanent --zone=public --add-masquerade
# 端口轉發到外部服務器
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toaddr=203.0.113.100:toport=80
sudo firewall-cmd --reload自定義服務:
# 創建自定義服務配置文件
sudo nano /etc/firewalld/services/myapp.xml<?xml version="1.0" encoding="utf-8"?>
<service>
<short>My Application</short>
<description>Custom application service</description>
<port protocol="tcp" port="8080"/>
<port protocol="tcp" port="8443"/>
</service># 重新加載
sudo firewall-cmd --reload
# 使用自定義服務
sudo firewall-cmd --permanent --add-service=myapp
sudo firewall-cmd --reload方法三:iptables 防火牆(通用底層工具)
1. 基本概念
表(Tables):
filter- 過濾數據包(默認表)nat- 網絡地址轉換mangle- 修改數據包頭部raw- 連接跟蹤之前處理
鏈(Chains):
INPUT- 進入本機的數據包OUTPUT- 從本機發出的數據包FORWARD- 經過本機轉發的數據包PREROUTING- 路由前處理POSTROUTING- 路由後處理
2. 基本操作
查看規則:
# 查看 filter 表規則
sudo iptables -L -n -v
# 查看 nat 表規則
sudo iptables -t nat -L -n -v
# 顯示行號
sudo iptables -L -n --line-numbers設置默認策略:
# 默認拒絕所有入站
sudo iptables -P INPUT DROP
# 默認允許出站
sudo iptables -P OUTPUT ACCEPT
# 默認拒絕轉發
sudo iptables -P FORWARD DROP⚠️ 警告: 執行上述命令前,務必先允許 SSH 端口,否則會立即斷開連接!
允許已建立的連接:
# 允許已建立和相關連接(重要!)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT開放端口:
# 允許 SSH(必須先執行!)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允許 HTTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允許 HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允許 ICMP(ping)
sudo iptables -A INPUT -p icmp -j ACCEPT
# 允許本地迴環
sudo iptables -A INPUT -i lo -j ACCEPT限制來源 IP:
# 允許特定 IP 訪問 SSH
sudo iptables -A INPUT -p tcp -s 203.0.113.50 --dport 22 -j ACCEPT
# 拒絕特定 IP
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
# 允許網段訪問 MySQL
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT刪除規則:
# 查看行號
sudo iptables -L INPUT -n --line-numbers
# 按行號刪除
sudo iptables -D INPUT 3
# 按規則內容刪除
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT清空規則:
# 清空所有規則
sudo iptables -F
# 清空特定鏈
sudo iptables -F INPUT
# 重置默認策略
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT3. NAT 與端口轉發
SNAT(源地址轉換):
# 啟用 IP 轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
# 配置 SNAT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEDNAT(目標地址轉換/端口轉發):
# 將公網 80 端口轉發到內網 192.168.1.100:8080
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
# 允許轉發
sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 8080 -j ACCEPT4. 保存與恢復規則
Debian/Ubuntu:
# 安裝持久化工具
sudo apt install iptables-persistent -y
# 保存當前規則
sudo netfilter-persistent save
# 規則保存在:
# /etc/iptables/rules.v4
# /etc/iptables/rules.v6CentOS/RHEL:
# 保存規則
sudo service iptables save
# 或使用
sudo iptables-save > /etc/sysconfig/iptables
# 恢復規則
sudo iptables-restore < /etc/sysconfig/iptables手動保存/恢復:
# 保存到文件
sudo iptables-save > /root/iptables-backup.txt
# 從文件恢復
sudo iptables-restore < /root/iptables-backup.txt常用端口參考表
Web 服務
| 端口 | 協議 | 服務 | 說明 |
|---|---|---|---|
| 80 | TCP | HTTP | Web 服務 |
| 443 | TCP | HTTPS | 加密 Web 服務 |
| 8080 | TCP | HTTP-Alt | 備用 Web/代理 |
| 8443 | TCP | HTTPS-Alt | 備用加密 Web |
數據庫
| 端口 | 協議 | 服務 | 建議 |
|---|---|---|---|
| 3306 | TCP | MySQL/MariaDB | 僅內網 |
| 5432 | TCP | PostgreSQL | 僅內網 |
| 6379 | TCP | Redis | 僅內網+密碼 |
| 27017 | TCP | MongoDB | 僅內網+認證 |
郵件服務
| 端口 | 協議 | 服務 |
|---|---|---|
| 25 | TCP | SMTP |
| 110 | TCP | POP3 |
| 143 | TCP | IMAP |
| 465 | TCP | SMTPS |
| 993 | TCP | IMAPS |
| 995 | TCP | POP3S |
其他常用
| 端口 | 協議 | 服務 |
|---|---|---|
| 22 | TCP | SSH |
| 21 | TCP | FTP |
| 53 | TCP/UDP | DNS |
| 123 | UDP | NTP |
| 3389 | TCP | RDP |
| 5900 | TCP | VNC |
| 8888 | TCP | 1Panel/BT面板 |
安全最佳實踐
1. 最小權限原則
✅ 只開放必要的端口:
# 錯誤做法:開放所有端口
sudo ufw allow all
# 正確做法:按需開放
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS2. 限制來源 IP
✅ 敏感服務僅允許信任 IP:
# 數據庫僅允許應用服務器訪問
sudo ufw allow from 192.168.1.10 to any port 3306
# SSH 僅允許管理 IP
sudo ufw allow from 203.0.113.50 to any port 223. 修改默認端口
✅ 避免使用知名端口:
# SSH 改為 2222
sudo nano /etc/ssh/sshd_config
# Port 2222
# 防火牆同步修改
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp4. 定期審計規則
# 每週檢查防火牆規則
sudo ufw status verbose
# 清理無用規則
sudo ufw status numbered
sudo ufw delete [編號]
# 查看被阻止的連接日誌
sudo grep "UFW BLOCK" /var/log/syslog | tail -205. 備份規則
# 定期備份防火牆規則
sudo cp /etc/ufw/user.rules /backup/ufw-rules-$(date +%Y%m%d).bak
# 或使用腳本自動化
#!/bin/bash
BACKUP_DIR="/backup/firewall"
mkdir -p $BACKUP_DIR
iptables-save > $BACKUP_DIR/iptables-$(date +%Y%m%d).txt
ufw status verbose > $BACKUP_DIR/ufw-status-$(date +%Y%m%d).txt常見問題排查
Q1: 配置防火牆後無法 SSH 連接?
緊急救援:
# 通過 VNC 控制檯登錄
# 檢查 UFW 狀態
sudo ufw status
# 臨時禁用測試
sudo ufw disable
# 如果恢復連接,檢查規則
sudo ufw status numbered
# 確保 SSH 端口已開放
sudo ufw allow 22/tcp
# 或自定義端口
sudo ufw allow 2222/tcp
# 重新啟用
sudo ufw enable預防措施:
- 配置前先允許 SSH 端口
- 使用
ufw allow而不是直接修改默認策略 - 保留 VNC 控制檯訪問權限
Q2: 端口已開放但仍無法訪問?
排查步驟:
- 檢查防火牆規則
sudo ufw status
# 或
sudo iptables -L -n- 檢查服務是否監聽
# 查看端口監聽狀態
sudo ss -tuln | grep 80
# 或
sudo netstat -tuln | grep 80- 檢查雲服務商安全組
- AWS EC2 Security Group
- 阿里雲安全組
- 騰訊雲安全組
- Oracle Cloud VCN 規則
- 測試本地訪問
# 在服務器上測試
curl http://localhost:80
# 從外部測試
telnet your_server_ip 80- 檢查 SELinux(CentOS/RHEL)
# 查看 SELinux 狀態
sestatus
# 臨時禁用測試
sudo setenforce 0
# 如果解決問題,配置 SELinux 規則
sudo semanage port -a -t http_port_t -p tcp 8080Q3: 如何查看被防火牆阻止的連接?
UFW 日誌:
# 啟用日誌
sudo ufw logging medium
# 查看日誌
sudo tail -f /var/log/ufw.log
# 統計被阻止的 IP
grep "UFW BLOCK" /var/log/ufw.log | awk '{print $12}' | sort | uniq -c | sort -rn | head -10iptables 日誌:
# 添加日誌規則
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES_DROP: " --log-level 4
# 查看日誌
sudo tail -f /var/log/syslog | grep "IPTABLES_DROP"Q4: Docker 容器端口無法訪問?
解決方案:
- 檢查 Docker 是否正確配置 iptables
# 查看 Docker 鏈
sudo iptables -L DOCKER -n -v- 確保 UFW 在 Docker 之後啟動
# 重啟 UFW
sudo ufw disable
sudo ufw enable- 或在 UFW 配置中允許 Docker
# 編輯 /etc/ufw/before.rules
# 在 *filter 之前添加:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
COMMIT- 重新加載 UFW
sudo ufw reloadQ5: 如何臨時開放端口進行測試?
UFW 臨時規則:
# 開放端口
sudo ufw allow 8080/tcp
# 測試完成後刪除
sudo ufw delete allow 8080/tcpiptables 臨時規則(重啟失效):
# 添加規則(不加保存)
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# 測試後刪除
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT完整配置示例
Ubuntu Web 服務器防火牆配置
#!/bin/bash
# ubuntu-firewall-setup.sh
# 重置 UFW
sudo ufw reset
# 設置默認策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允許 SSH(如果使用非標準端口,修改為對應端口)
sudo ufw allow 22/tcp
# 允許 Web 服務
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 允許 ping
sudo ufw allow in proto icmp
# 啟用 UFW
sudo ufw --force enable
# 驗證配置
sudo ufw status verbose
echo "防火牆配置完成!"CentOS Web 服務器防火牆配置
#!/bin/bash
# centos-firewall-setup.sh
# 啟動 firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 設置默認區域
sudo firewall-cmd --set-default-zone=public
# 允許 SSH
sudo firewall-cmd --permanent --add-service=ssh
# 允許 Web 服務
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 允許 ping
sudo firewall-cmd --permanent --add-protocol=icmp
# 重新加載
sudo firewall-cmd --reload
# 驗證配置
sudo firewall-cmd --list-all
echo "防火牆配置完成!"相關教程推薦
- 🔐 SSH 密鑰登錄配置 - 提升遠程訪問安全性
- 🛡️ Fail2ban 防暴力破解 - 自動封禁惡意 IP
- ⚡ BBR 網絡加速 - 優化網絡性能
- 🖥️ Debian/Ubuntu 系統優化 - 完整系統加固指南
通過合理配置防火牆,你可以有效控制服務器的網絡訪問權限,大幅提升系統安全性!🔒✨
延伸阅读
免责声明
本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。