經典場景:VirtualBox/VMware 虛擬機內部 curl localhost:8080 正常,宿主機瀏覽器訪問 https://VM_IP:8080 卻連線逾時。主因通常是 Linux 防火牆 (iptables/firewalld) 攔截外部連入。本文提供三種解決方案,由簡入繁。
curl https://127.0.0.1:8080 → 返回 Tomcat 頁面 ✅https://192.168.x.x:8080 → 無法連線 ❌telnet 192.168.x.x 8080 → Connection timed out# CentOS 6 / RHEL 6 (iptables service)
chkconfig iptables off # 開機不啟動
service iptables stop # 立即停止
# CentOS 7+ / RHEL 7+ (firewalld)
systemctl disable firewalld # 開機不啟動
systemctl stop firewalld # 立即停止
⚠️ 生產環境嚴禁使用,會暴露所有埠口風險。
# 1. 編輯規則檔
vi /etc/sysconfig/iptables
# 2. 在 COMMIT 行之前插入 (確保在 REJECT 規則之前)
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
# 完整範例片段:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT # 新增此行
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# 3. 重新載入規則
service iptables restart
# 或 CentOS 7+
systemctl restart iptables
# 永久開放 (重啟生效)
firewall-cmd --permanent --add-port=8080/tcp
# 立即生效 (不重啟)
firewall-cmd --add-port=8080/tcp
# 驗證
firewall-cmd --list-ports
# 輸出應包含 8080/tcp
# 重新載入
firewall-cmd --reload
若虛擬機跑在雲端,**必須**在雲控制台對應的「安全組」或「防火牆規則」開放 8080 埠:
這層防火牆在作業系統之外,OS 內開放無效。
netstat -ntlp | grep 8080
# 應顯示 0.0.0.0:8080 或 :::8080
telnet VM_IP 8080 連線成功https://VM_IP:8080 顯示 Tomcat 首頁檢查 server.xml Connector 設定:
<Connector port="8080" address="0.0.0.0" ... />
若 address="127.0.0.1" 則僅接受本機連線,需改為 0.0.0.0 或刪除 address 屬性 (預設即為 0.0.0.0)。
| 環境 | 推薦方案 | 指令 |
|---|---|---|
| 開發/測試 VM | 關閉防火牆 | systemctl stop firewalld |
| 生產 Linux (CentOS 6) | iptables 開放埠 | vi /etc/sysconfig/iptables |
| 生產 Linux (CentOS 7+) | firewalld 開放埠 | firewall-cmd --add-port=8080/tcp |
| 雲端 VM | 雲安全組 + OS 防火牆雙重開放 | 控制台配置 + 上述指令 |
「內網通、外網不通」90% 是防火牆問題,按表對號入座,通常 1 分鐘內解決。