既然全部都在內網,而且「網頁永遠連得到、但 Ping 和 SSH 閒置就斷」,問題就完全排除外網或雲端防火牆了。
在區域網路(LAN)環境下,這個現象最核心的元兇是**「主機/網卡的省電模式」或「內網設備的 ARP 機制(IP 找不到 MAC)」**。
以下是內網最常發生的 4 個原因與具體解決方法:
1. 主機網卡開啟了「節電功能」(最常見)
- 原因:當你一陣子沒有操作 SSH,內網也沒有大流量時,作業系統或主機 BIOS 會認為現在是「閒置狀態」,為了省電,會自動把實體網卡或虛擬網卡(如 WSL2 網卡)切換到低功耗狀態(D3 State 或 ASPM)。
- 為什麼網頁能連? 網卡在低功耗時會拒絕 ICMP(Ping)和主動建立的長時間 TCP(SSH)。但當你從外面瀏覽器發送網頁請求(HTTP)時,因為網頁封包通常會觸發特定的硬體中斷,網卡會被「瞬間喚醒」並處理網頁請求。
- 🛠️ 解決方法:
- Linux 主機:檢查是否有安裝
tlp 或 powertop 等省電套件,將其關閉。並在網卡設定中關閉 綠能乙太網路(EEE)。
- Windows 主機(若作為 Docker 宿主機):進入「裝置管理員」-> 找到你的網卡 -> 右鍵「內容」-> 「電源管理」-> 取消勾選「允許電腦關閉這個裝置以節省電源」。
2. 內網 ARP 紀錄過期或被遺忘(ARP Timeout)
-
原因:內網設備(你的電腦與 Docker 主機)在溝通時,必須知道對方的「IP 地址對應哪一個 MAC 網卡地址」(這叫 ARP 紀錄)。當連線閒置時,交換器(Switch)或你電腦上的 ARP 快取(Cache)會因為時間到期而刪除該紀錄。
-
為什麼網頁能連? 網頁使用的是較高層的協定,當網頁找不到路時,瀏覽器或系統會大範圍發送廣播(Broadcast)重新尋找。但 Ping 和已經建立的 SSH 在失去 ARP 紀錄時,通常直接判定逾時(Timeout)而斷線。
-
🛠️ 解決方法(測試法):當你又遇到「Ping 不到、SSH 連不上、但網頁開得起來」的瞬間,請在你的個人電腦(用戶端)打開命令提示字元(CMD/Terminal),手動執行:檢查裡面有沒有那台 Docker 主機的 IP。如果沒有,代表內網快取死掉了。可以在你的個人電腦上改用固定 ARP 綁定,或是依舊開啟 SSH KeepAlive(維持每 60 秒有封包在跑,ARP 就不會過期)。
arp -a
3. 內網 IP 衝突(IP Conflict)
- 原因:內網有另一台設備(例如某個人的手機、同事的測試機,或是 Docker 內部的 Bridge 網路)不小心拿到了跟這台主機一模一樣的 IP。
- 為什麼會這樣?
- 當主機閒置時,另一台設備可能剛好活躍,導致內網的交換器(Switch)把 SSH 和 Ping 的封包送到了「另外那台設備」去,那台設備不支援 SSH,所以你連不上。
- 但當你點擊網頁時,如果 Docker 主機剛好有流量回應,交換器又把路徑導回 Docker 主機,網頁就通了。這種「兩台設備搶同一個 IP」會導致連線極度不穩定。
- 🛠️ 解決方法:將 Docker 主機在路由器中設定為固定 IP(Static IP),並確保該 IP 位於 DHCP 發放範圍之外。
4. 虛擬化網路(WSL2 / 虛擬機)的閒置回收