跳轉到內容

Linux 防火牆端口開放完全指南 | iptables、firewalld 與 UFW 配置教程

Linux Firewall Port Configuration

為什麼需要配置防火牆?

防火牆是 Linux 系統的第一道安全防線,它可以:

  • 🛡️ 阻止未授權訪問:只允許必要的端口對外開放
  • 🔒 保護敏感服務:數據庫、管理面板等內網服務不暴露公網
  • 📊 監控網絡流量:記錄和分析進出系統的連接
  • ⚠️ 防止端口掃描:減少被攻擊面

常見需要開放的端口:

  • 22 - SSH 遠程登錄
  • 80 - HTTP Web 服務
  • 443 - HTTPS 加密 Web 服務
  • 3306 - MySQL 數據庫(通常僅內網)
  • 6379 - Redis 緩存(通常僅內網)
  • 8080 - 應用服務器/代理

Linux 三大防火牆工具對比

特性iptablesfirewalldUFW
複雜度高(底層)低(最簡單)
靈活性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
適用發行版所有 LinuxRHEL/CentOS 7+Ubuntu/Debian
學習曲線陡峭中等平緩
動態更新需重載規則支持熱更新需重載
推薦場景高級用戶、複雜規則CentOS/RHEL 服務器Ubuntu/Debian 新手

推薦選擇:

  • 🟢 Ubuntu/Debian 用戶: 使用 UFW(簡單直觀)
  • 🔵 CentOS/RHEL 用戶: 使用 firewalld(系統集成)
  • 🔴 高級用戶: 直接使用 iptables(最靈活)

方法一:UFW 防火牆(Ubuntu/Debian 推薦)

1. 安裝與啟用

bash
# 安裝 UFW
sudo apt install ufw -y

# 查看狀態
sudo ufw status

# 啟用 UFW(會提示可能中斷 SSH,輸入 y 確認)
sudo ufw enable

# 開機自啟
sudo systemctl enable ufw

2. 基本操作

設置默認策略:

bash
# 默認拒絕所有入站連接
sudo ufw default deny incoming

# 默認允許所有出站連接
sudo ufw default allow outgoing

開放端口:

bash
# 開放單個端口(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 訪問:

bash
# 允許特定 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

刪除規則:

bash
# 查看規則編號
sudo ufw status numbered

# 按編號刪除規則
sudo ufw delete 3

# 按規則內容刪除
sudo ufw delete allow 80/tcp

禁用/重置:

bash
# 臨時禁用防火牆
sudo ufw disable

# 重新啟用
sudo ufw enable

# 重置所有規則(恢復默認)
sudo ufw reset

3. 常用服務配置示例

Web 服務器(Nginx/Apache):

bash
sudo ufw allow 'Nginx Full'    # 同時開放 80 和 443
# 或
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

SSH 安全加固:

bash
# 修改 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

數據庫(僅內網訪問):

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

Docker 容器:

bash
# Docker 會自動管理 iptables,但可以與 UFW 配合
# 確保 UFW 在 Docker 之後啟動
sudo ufw reload

# 或者在 /etc/ufw/before.rules 中添加 Docker 規則

4. 查看與管理

bash
# 查看詳細狀態
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. 安裝與啟用

bash
# CentOS 7+ 默認已安裝
# 如果沒有,安裝 firewalld
sudo yum install firewalld -y

# 啟動服務
sudo systemctl start firewalld

# 開機自啟
sudo systemctl enable firewalld

# 查看狀態
sudo systemctl status firewalld

2. 基本概念

Zone(區域):

  • public - 公共網絡(默認)
  • internal - 內部網絡
  • dmz - DMZ 區域
  • drop - 丟棄所有連接
  • block - 拒絕所有連接

Service(服務): 預定義的服務集合,如 ssh, http, https, mysql 等。

3. 基本操作

查看當前配置:

bash
# 查看所有區域
sudo firewall-cmd --get-zones

# 查看默認區域
sudo firewall-cmd --get-default-zone

# 查看當前區域的規則
sudo firewall-cmd --list-all

# 查看所有區域的詳細配置
sudo firewall-cmd --list-all-zones

開放端口:

bash
# 開放單個端口(永久生效)
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

使用服務名稱:

bash
# 添加預定義服務
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:

bash
# 允許特定 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

刪除規則:

bash
# 刪除端口
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

臨時規則(重啟後失效):

bash
# 不加 --permanent 參數即為臨時規則
sudo firewall-cmd --zone=public --add-port=8080/tcp

# 查看臨時規則
sudo firewall-cmd --zone=public --list-ports

4. 高級配置

端口轉發:

bash
# 將 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):

bash
# 啟用 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

自定義服務:

bash
# 創建自定義服務配置文件
sudo nano /etc/firewalld/services/myapp.xml
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>
bash
# 重新加載
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. 基本操作

查看規則:

bash
# 查看 filter 表規則
sudo iptables -L -n -v

# 查看 nat 表規則
sudo iptables -t nat -L -n -v

# 顯示行號
sudo iptables -L -n --line-numbers

設置默認策略:

bash
# 默認拒絕所有入站
sudo iptables -P INPUT DROP

# 默認允許出站
sudo iptables -P OUTPUT ACCEPT

# 默認拒絕轉發
sudo iptables -P FORWARD DROP

⚠️ 警告: 執行上述命令前,務必先允許 SSH 端口,否則會立即斷開連接!

允許已建立的連接:

bash
# 允許已建立和相關連接(重要!)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

開放端口:

bash
# 允許 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:

bash
# 允許特定 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

刪除規則:

bash
# 查看行號
sudo iptables -L INPUT -n --line-numbers

# 按行號刪除
sudo iptables -D INPUT 3

# 按規則內容刪除
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT

清空規則:

bash
# 清空所有規則
sudo iptables -F

# 清空特定鏈
sudo iptables -F INPUT

# 重置默認策略
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

3. NAT 與端口轉發

SNAT(源地址轉換):

bash
# 啟用 IP 轉發
echo 1 > /proc/sys/net/ipv4/ip_forward

# 配置 SNAT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

DNAT(目標地址轉換/端口轉發):

bash
# 將公網 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 ACCEPT

4. 保存與恢復規則

Debian/Ubuntu:

bash
# 安裝持久化工具
sudo apt install iptables-persistent -y

# 保存當前規則
sudo netfilter-persistent save

# 規則保存在:
# /etc/iptables/rules.v4
# /etc/iptables/rules.v6

CentOS/RHEL:

bash
# 保存規則
sudo service iptables save

# 或使用
sudo iptables-save > /etc/sysconfig/iptables

# 恢復規則
sudo iptables-restore < /etc/sysconfig/iptables

手動保存/恢復:

bash
# 保存到文件
sudo iptables-save > /root/iptables-backup.txt

# 從文件恢復
sudo iptables-restore < /root/iptables-backup.txt

常用端口參考表

Web 服務

端口協議服務說明
80TCPHTTPWeb 服務
443TCPHTTPS加密 Web 服務
8080TCPHTTP-Alt備用 Web/代理
8443TCPHTTPS-Alt備用加密 Web

數據庫

端口協議服務建議
3306TCPMySQL/MariaDB僅內網
5432TCPPostgreSQL僅內網
6379TCPRedis僅內網+密碼
27017TCPMongoDB僅內網+認證

郵件服務

端口協議服務
25TCPSMTP
110TCPPOP3
143TCPIMAP
465TCPSMTPS
993TCPIMAPS
995TCPPOP3S

其他常用

端口協議服務
22TCPSSH
21TCPFTP
53TCP/UDPDNS
123UDPNTP
3389TCPRDP
5900TCPVNC
8888TCP1Panel/BT面板

安全最佳實踐

1. 最小權限原則

只開放必要的端口:

bash
# 錯誤做法:開放所有端口
sudo ufw allow all

# 正確做法:按需開放
sudo ufw allow 22/tcp   # SSH
sudo ufw allow 80/tcp   # HTTP
sudo ufw allow 443/tcp  # HTTPS

2. 限制來源 IP

敏感服務僅允許信任 IP:

bash
# 數據庫僅允許應用服務器訪問
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 22

3. 修改默認端口

避免使用知名端口:

bash
# SSH 改為 2222
sudo nano /etc/ssh/sshd_config
# Port 2222

# 防火牆同步修改
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp

4. 定期審計規則

bash
# 每週檢查防火牆規則
sudo ufw status verbose

# 清理無用規則
sudo ufw status numbered
sudo ufw delete [編號]

# 查看被阻止的連接日誌
sudo grep "UFW BLOCK" /var/log/syslog | tail -20

5. 備份規則

bash
# 定期備份防火牆規則
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 連接?

緊急救援:

bash
# 通過 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: 端口已開放但仍無法訪問?

排查步驟:

  1. 檢查防火牆規則
bash
sudo ufw status
# 或
sudo iptables -L -n
  1. 檢查服務是否監聽
bash
# 查看端口監聽狀態
sudo ss -tuln | grep 80
# 或
sudo netstat -tuln | grep 80
  1. 檢查雲服務商安全組
  • AWS EC2 Security Group
  • 阿里雲安全組
  • 騰訊雲安全組
  • Oracle Cloud VCN 規則
  1. 測試本地訪問
bash
# 在服務器上測試
curl http://localhost:80

# 從外部測試
telnet your_server_ip 80
  1. 檢查 SELinux(CentOS/RHEL)
bash
# 查看 SELinux 狀態
sestatus

# 臨時禁用測試
sudo setenforce 0

# 如果解決問題,配置 SELinux 規則
sudo semanage port -a -t http_port_t -p tcp 8080

Q3: 如何查看被防火牆阻止的連接?

UFW 日誌:

bash
# 啟用日誌
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 -10

iptables 日誌:

bash
# 添加日誌規則
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES_DROP: " --log-level 4

# 查看日誌
sudo tail -f /var/log/syslog | grep "IPTABLES_DROP"

Q4: Docker 容器端口無法訪問?

解決方案:

  1. 檢查 Docker 是否正確配置 iptables
bash
# 查看 Docker 鏈
sudo iptables -L DOCKER -n -v
  1. 確保 UFW 在 Docker 之後啟動
bash
# 重啟 UFW
sudo ufw disable
sudo ufw enable
  1. 或在 UFW 配置中允許 Docker
bash
# 編輯 /etc/ufw/before.rules
# 在 *filter 之前添加:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
COMMIT
  1. 重新加載 UFW
bash
sudo ufw reload

Q5: 如何臨時開放端口進行測試?

UFW 臨時規則:

bash
# 開放端口
sudo ufw allow 8080/tcp

# 測試完成後刪除
sudo ufw delete allow 8080/tcp

iptables 臨時規則(重啟失效):

bash
# 添加規則(不加保存)
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

# 測試後刪除
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT

完整配置示例

Ubuntu Web 服務器防火牆配置

bash
#!/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 服務器防火牆配置

bash
#!/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 "防火牆配置完成!"

相關教程推薦

通過合理配置防火牆,你可以有效控制服務器的網絡訪問權限,大幅提升系統安全性!🔒✨


延伸阅读

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。

最後更新於: