已在 /etc/sysconfig/iptables 末尾加入:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
執行 service iptables restart 後,**仍無法連接 3306**。
iptables **按順序匹配**,首條匹配規則生效。預設鏈中通常存在:
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
若 ACCEPT 規則在 REJECT **之後**,封包早被拒絕,永遠輪不到 ACCEPT。
# 1. 查看當前規則行號
iptables -L -n --line-numbers
# 2. 找到 REJECT 規則行號(假設為 8)
# 3. 在第 8 行之前插入 ACCEPT
iptables -I INPUT 8 -p tcp --dport 3306 -j ACCEPT
# 4. 持久化
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
#!/bin/bash
# fix_mysql_port.sh
REJECT_LINE=$(iptables -L INPUT -n --line-numbers | grep 'REJECT' | head -1 | awk '{print $1}')
if [ -n "$REJECT_LINE" ]; then
iptables -I INPUT $REJECT_LINE -p tcp --dport 3306 -j ACCEPT
else
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
fi
service iptables save
echo "Rule inserted before REJECT at line $REJECT_LINE"
iptables -L INPUT -n -v | grep 3306
# 應顯示 ACCEPT 規則且 pkts/bytes 計數增長
# 遠程測試
telnet 3306
nc -zv 3306
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# 限定來源 IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
firewall-cmd --reload