SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

什麼是 127.0.0.1?為什麼 localhost 上的服務只有本機連得到

127.0.0.1 是迴路位址,localhost 是它的名字。監聽在這裡的程式只收本機連線,所以 VPS 或 Docker 印出的網址在你的筆電打不開。比較 127.0.0.1、0.0.0.0 與公網 IP,用 ss -ltn 查綁定位址,並介紹三種安全的連線方法。

先講結論:127.0.0.1 只有本機自己連得到

127.0.0.1 是迴路位址(loopback address),localhost 是它的主機名稱。一個程式如果監聽在 127.0.0.1,它只接受同一台機器發出的連線。所以 VPS 上的程式或 Docker 的 log 印出 http://127.0.0.1:8080,你在自己的筆電打開這個網址,瀏覽器連到的是筆電自己,不是 VPS,當然什麼都沒有。這不是程式壞掉,而是刻意的安全預設:在你決定要開放之前,服務先只讓本機碰得到。

下面說明迴路位址是怎麼運作的,這些網址的埠號是從哪裡來的,127.0.0.1、0.0.0.0 和公網 IP 差在哪裡,以及怎麼用 ss -ltn 看一個服務到底綁在哪個位址。最後給三種安全地從外面連進去的方法。

迴路位址是什麼:封包不會離開這台機器

每一台跑 TCP/IP 的機器都有一個迴路介面,Linux 上叫做 lo。整個 127.0.0.0/8 網段都屬於它,127.0.0.1 只是最常用的那一個。送到這個位址的封包由核心(kernel)直接轉回本機,不會經過任何實體網卡,也不會出現在網路線上。

ip addr show lo

你會看到 lo 介面帶著 127.0.0.1/8 這個位址。因為封包不會離開機器,所以「別台機器的 127.0.0.1」這個說法沒有意義:在筆電上輸入 127.0.0.1,指的永遠是筆電自己。

localhost 是這個位址的名字,定義在 /etc/hosts 裡,不需要查 DNS(網域名稱系統)。多數現代系統同時把 localhost 對應到 IPv4 的 127.0.0.1 和 IPv6 的 ::1,這一點後面會回來談,因為它會製造一種很難懂的「連線被拒」。

一個程式啟動時會選擇要「綁定」(bind)在哪個位址監聽。綁在 127.0.0.1,核心只會把來自迴路介面的連線交給它;來自公網 IP 或私有網路的封包,核心找不到對應的監聽者,直接回覆拒絕。位址和連接埠(port)合起來才是一個完整的監聽點,關於埠號本身的意義,可以看 Linux 連接埠是什麼、怎麼分配

這些網址是從哪裡來的:8080、3080、11434、5173

以下是 VPS 使用者常在終端機或 log 裡看到的幾個預設位址,依據截至 2026 年 9 月的官方文件。

  • http://localhost:8080:SearXNG 官方的 docker-compose.yml 把埠對應寫成 ${SEARXNG_HOST:+${SEARXNG_HOST}:}${SEARXNG_PORT:-8080}:${SEARXNG_PORT:-8080}.env 裡沒設定 SEARXNG_HOST 時,這一行展開後就是 8080:8080,也就是綁在所有介面,而不只是本機。很多自架服務的 compose 範例都是這種寫法。
  • http://127.0.0.1:3080dsh web 啟動 DeepSeek Harness 的網頁介面時預設印出這個網址,它只監聽迴路位址。要在 VPS 上用它,請看 dsh web 印出 127.0.0.1:3080 代表什麼
  • http://127.0.0.1:11434:Ollama 的 FAQ 明寫「Ollama binds 127.0.0.1 port 11434 by default」,要改就用 OLLAMA_HOST 環境變數。細節在 Ollama API 與 11434 埠。
  • http://localhost:5173:Vite 開發伺服器的 server.host 預設是 'localhost'server.port 預設是 5173。埠被占用時 Vite 會自動往下找一個空的。

注意這四個裡面只有 SearXNG 預設綁在所有介面。其他三個印出來的網址都是誠實的:它們真的只在本機有效。

127.0.0.1、0.0.0.0 與公網 IP 的差別

綁定位址決定了誰連得到。

  • 127.0.0.1:只有本機。從其他機器連不到,不管防火牆怎麼設定都一樣,因為封包根本不會到達這個監聽者。
  • 0.0.0.0:所有 IPv4 介面,包括公網 IP 和私有網路 IP,也包括迴路位址。誰連得到,完全交給防火牆決定。沒有防火牆規則,就是整個網際網路都連得到。
  • 公網 IP(例如 203.0.113.10):只綁在那一張對外的網路介面。從外面可以連,但在本機用 127.0.0.1 反而連不到,要改用 203.0.113.10 才行。
  • ::1[::]:IPv6 版本的迴路位址和「所有介面」。Linux 預設綁 [::] 也會同時接受 IPv4 連線。

Docker 的情況多一層。compose 檔裡寫 ports: - "8080:8080",Docker 會把主機的 0.0.0.0:8080 對應到容器,也就是發佈到每一個介面。寫成 "127.0.0.1:8080:8080" 才會只綁本機。Docker 官方文件自己說得很直接:「Publishing container ports is insecure by default」,發佈出去的埠不只主機看得到,外面的世界也看得到。更麻煩的是 Docker 會自己改寫 iptables 規則,ufw 擋不住它,原因在 Docker 發佈的埠為什麼繞過 ufw

用 ss -ltn 看服務綁在哪個位址

不用猜,直接問核心。

ss -ltn
sudo ss -ltnp

-l 只列監聽中的 socket,-t 只看 TCP,-n 不把埠號換成服務名稱。加 -p 並用 sudo 執行,可以多看到是哪個程序(process)在監聽。要看的是 Local Address:Port 這一欄,位址的部分有幾種樣子:

  • 127.0.0.1:埠號:只有本機。
  • 0.0.0.0:埠號:所有 IPv4 介面。
  • *:埠號[::]:埠號:所有 IPv6 介面,通常也接受 IPv4。
  • [::1]:埠號:只有本機,走 IPv6。
  • 203.0.113.10:埠號 這種具體位址:只綁那一張介面。

只想看某一個埠,可以加過濾條件:

ss -ltn 'sport = :8080'

如果這條指令什麼都沒列出來,代表根本沒有程式在監聽 8080,問題不在綁定位址,而是服務沒起來。怎麼從本機和從外面分別確認一個埠有沒有開,檢查 Linux 埠有沒有開啟 有完整的做法。

localhost 解析成 ::1 的陷阱

服務綁在 127.0.0.1,你在同一台機器上打 http://localhost:8080 卻得到「連線被拒」。這時先看 localhost 解析成什麼:

getent ahosts localhost

多數現代系統會同時列出 ::1127.0.0.1。瀏覽器和 curl 會兩個都試,一個被拒就換下一個,所以你通常不會發現這件事。但有些用戶端只試第一個位址,拿到 ::1 被拒就直接報錯。判斷方法很簡單:錯誤訊息裡的位址如果是 ::1 而不是 127.0.0.1,就是這個情況。

解法有兩個。用戶端這邊,把網址裡的 localhost 換成 127.0.0.1,直接指定 IPv4。伺服器這邊,讓服務同時綁 ::1;Docker 的話,官方文件建議同時寫 -p 127.0.0.1:8080:80 -p '[::1]:8080:80' 兩條對應。

從外面連到只綁 127.0.0.1 的服務:三種正當做法

把服務改成 0.0.0.0 是最容易想到的做法,也是最危險的:一個沒有密碼的管理介面就這樣暴露在公網上了。以下三種方法都保留「服務本身只聽本機」這個安全預設。

SSH 本機埠轉發。 在筆電上執行:

ssh -N -L 8080:127.0.0.1:8080 user@203.0.113.10

然後在筆電的瀏覽器打開 http://127.0.0.1:8080-L 後面那個 127.0.0.1 是從 VPS 的角度看的,意思是「連到 VPS 之後,再從 VPS 連它自己的 8080」。-N 表示不開 shell,只做轉發。連線走 SSH 加密,VPS 上不需要開任何新的埠。這是最快、最不需要改設定的方法,適合一個人偶爾用。

Tailscale 或其他 overlay 網路。 筆電和 VPS 加入同一個 Tailscale 網路後,服務可以只綁在 VPS 的 Tailscale 位址上,公網完全看不到。這比 SSH 轉發適合每天用、多台裝置用的情況,做法在 用 Tailscale 取代埠轉發。

反向代理加驗證。 讓 nginx 監聽 443,做 TLS(傳輸層安全)和登入驗證,再把請求轉給 127.0.0.1:8080。服務本身還是只聽本機,公網只看到 nginx。這是要給多人用、要有正式網域時的做法,設定檔逐行解釋在 nginx 反向代理設定解析

三種方法的共同點:真正對外開放的東西,一定是有加密、有驗證的那一層。你的服務不必知道這些事,繼續綁在 127.0.0.1 就好。

FAQ

127.0.0.1 和 localhost 是同一個東西嗎?

幾乎是,但不完全。127.0.0.1 是一個 IPv4 位址,localhost 是一個主機名稱,由 /etc/hosts 對應到 127.0.0.1,在多數系統上也同時對應到 IPv6 的 ::1。差別在於用戶端拿到兩個位址時怎麼選:有些會先試 ::1,如果服務只綁 IPv4,就可能出現連線被拒。想避免這個差異,直接寫 127.0.0.1

為什麼瀏覽器說連線被拒(ERR_CONNECTION_REFUSED)?

連線被拒代表封包到達了目標機器,但那個位址和埠上沒有程式在監聽。最常見的三種原因:你在筆電上打開了 VPS 印出的 127.0.0.1 網址,連到的是筆電自己;服務綁在 127.0.0.1,你卻用公網 IP 去連;或是 localhost 解析成 ::1,服務只綁 IPv4。在 VPS 上執行 ss -ltn 看服務綁在哪,就能分辨。如果不是被拒而是一直等到逾時,那是防火牆把封包丟掉了,兩者的差別在 連線被拒與逾時的差別

服務一直綁在 127.0.0.1 安全嗎?

安全,而且這是最好的預設。只綁本機的服務不會被網際網路上的掃描器碰到,就算它沒有密碼、有已知漏洞,外面也連不進來。這也是 Ollama 和 dsh 這類工具預設選 127.0.0.1 的原因。需要從外面用的時候,用 SSH 轉發、Tailscale 或反向代理,不要把綁定位址改成 0.0.0.0。

我把服務改成 0.0.0.0 之後,全世界都連得到嗎?

如果防火牆沒有擋,是的。0.0.0.0 的意思是所有 IPv4 介面,包含公網 IP。很多 VPS 映像檔預設沒有啟用防火牆,所以改完的下一秒,任何知道你 IP 的人都能連上這個埠。改之前先設好防火牆,ufw 防火牆基礎 是起點;如果服務跑在 Docker 裡,還要記得 Docker 發佈的埠會繞過 ufw。

#localhost#loopback#ports#networking#vps-basics#docker