XHTTP 設定:遷移單台 Xray 入口並保留復原路徑

XHTTP 設定:遷移單台 Xray 入口並保留復原路徑

Marcus Reid
2026年10月11日· 7 分鐘讀完

XHTTP 設定會建立新的傳輸路徑,並非把欄位改名便完成。先加設獨立入口,證明一個客戶端能經它傳送和接收資料,同時保留舊入口作回退。本文採用兩端 Ubuntu 24.04 LTS x64、Xray v26.3.27,限定直連 TLS、HTTP/2 及明確的 stream-up 模式。[1][2]

關鍵要點

  • 試驗入口獨立使用程式、服務、設定、TCP 連接埠及 UUID。
  • 驗收期間保留舊伺服器服務與客戶端設定。
  • 兩端須對應路徑、模式、TLS 名稱及登入資料。
  • 分別檢查上載、下載、長請求、拒絕及回退。
  • 初次遷移不加入 CDN、反向代理、REALITY、H3 或上下載分流。

上述是文件適用版本,未完成完整端到端實測。以下是檢查方法和預期行為,並非量測結果。先按自建任務與復原清單確定驗收邊界。

Xray XHTTP 遷移要保留哪些既有設定?

保留舊監聽、服務身份、憑證流程、防火牆規則及客戶端設定。記下原有單元的程式與設定路徑,以及連接埠歸屬。舊設定及客戶端匯出檔存於只有管理員可讀的備份,不公開 UUID、密鑰、位址或目的地日誌。

只使用自有或已獲授權的伺服器,保留控制台復原途徑,經獨立可信渠道核實 SSH 主機密鑰。採用嚴格驗證和專用 known_hosts;密鑰不符、已撤銷或未核實便停止。VPN 試驗不能成為唯一管理通道。

需要自行營運 Xray、觀察傳輸行為時,這條路線才有意義。若管理升級和憑證無助於你的工作,改動可用入口前先比較 VPS 與 VPN 的責任。XHTTP 亦不會取代協議、傳輸與混淆的分層。

固定試驗身份

選未被佔用的 TCP 連接埠,本文用 8443,並準備自有域名 xhttp.example.com。檢查 sudo ss -lntup 及供應商防火牆。預留獨立單元 xray-xhttp.service、本機入口 127.0.0.1:1081 及新 UUID;另以一個客戶端程序或應用程式觀察舊路徑。

可行時只向預期客戶端放行 TCP 8443。本路線不需要 UDP 監聽。保留原 SSH 規則及憑證續期驗證埠;新增 TLS 監聽不代表可以停用防火牆或接管原 ACME 服務。

步驟 1:準備指定版本及受信任憑證

從官方 v26.3.27 發行下載 Linux 64 位元壓縮檔,查看發行說明和已公開驗證資料,在本機解壓。以 root 將程式安裝至 /opt/xray-xhttp/v26.3.27/xray,權限 0755;如附有配套資料檔,同樣保留在該目錄。Ubuntu 客戶端也採取相同安裝方式。[1]

兩端執行 /opt/xray-xhttp/v26.3.27/xray version,私密保存輸出。不換成預發行版本,也不默默混用不同核心。以 /opt/xray-xhttp/v26.3.27/xray uuid 產生新身份,保存於私密筆記及兩端設定檔。

建立沒有登入 shell 的系統帳戶 xray-xhttp,將 /etc/xray-xhttp 設為 root:xray-xhttp、0750。經現有授權 ACME 流程取得涵蓋 xhttp.example.com 的公開受信任憑證。將完整鏈及私鑰副本存於此目錄,擁有者為 root:xray-xhttp、權限 0640;只開放這些副本,不授予整個無關憑證庫的讀取權。

現有續期機制須原子更新副本,驗證後只重新啟動此試驗服務。切換日常使用客戶端前先記錄該 hook。若尚無憑證流程,先另行建立;本文不啟動第二個爭用 TCP 80、443 的 ACME 守護程式。

步驟 2:編寫 XHTTP stream-up 設定

用 sudoedit 建立 /etc/xray-xhttp/server.json,以新 UUID 取代 REPLACE_NEW_UUID。此固定版本的 VLESS 入站使用 clients,出站使用 users;不要直接移植較新文件的入站欄位。[3]

{
  "log": {"loglevel": "warning"},
  "inbounds": [{
    "tag": "xhttp-trial",
    "listen": "0.0.0.0",
    "port": 8443,
    "protocol": "vless",
    "settings": {
      "clients": [{"id": "REPLACE_NEW_UUID"}],
      "decryption": "none"
    },
    "streamSettings": {
      "network": "xhttp",
      "security": "tls",
      "tlsSettings": {
        "alpn": ["h2"],
        "certificates": [{
          "certificateFile": "/etc/xray-xhttp/fullchain.pem",
          "keyFile": "/etc/xray-xhttp/privkey.pem"
        }]
      },
      "xhttpSettings": {
        "path": "/migration-stream/",
        "mode": "stream-up"
      }
    }
  }],
  "outbounds": [{"tag": "direct", "protocol": "freedom"}]
}

此範例只監聽 IPv4。域名 A 記錄須指向正確伺服器,不宣告未配置的 IPv6 入口。VLESS 的 none 欄位沒有提供傳輸加密;本例由 TLS 負責,亦沒有設定 Vision flow。

在客戶端的 0700 用戶目錄建立 0600 的 client.json:

{
  "log": {"loglevel": "warning"},
  "inbounds": [{
    "listen": "127.0.0.1",
    "port": 1081,
    "protocol": "socks",
    "settings": {"auth": "noauth", "udp": false}
  }],
  "outbounds": [{
    "tag": "new-entry",
    "protocol": "vless",
    "settings": {
      "vnext": [{
        "address": "xhttp.example.com",
        "port": 8443,
        "users": [{"id": "REPLACE_NEW_UUID", "encryption": "none"}]
      }]
    },
    "streamSettings": {
      "network": "xhttp",
      "security": "tls",
      "tlsSettings": {
        "serverName": "xhttp.example.com",
        "alpn": ["h2"],
        "allowInsecure": false
      },
      "xhttpSettings": {
        "path": "/migration-stream/",
        "mode": "stream-up"
      }
    }
  }]
}

一致路徑及明確模式讓試驗範圍可控。stream-up 採串流上載,另設下載路徑;真正的 TLS 終點須支援 H2。只重命名 gRPC 欄位,不會建立這些行為。[2][4]

步驟 3:檢查兩端檔案並啟動獨立服務

將 server.json 設為 root:xray-xhttp、0640。伺服器檔案以服務帳戶檢查,客戶端檔案以目前用戶檢查:

sudo -u xray-xhttp /opt/xray-xhttp/v26.3.27/xray run -test -config /etc/xray-xhttp/server.json
/opt/xray-xhttp/v26.3.27/xray run -test -config ./client.json

兩端都須成功退出。這不證明實際憑證信任、遠端認證或資料傳送成功;正式檔案亦不可保留示例佔位內容。

以 root 建立 /etc/systemd/system/xray-xhttp.service:

[Unit]
Description=Independent Xray XHTTP trial
After=network-online.target
Wants=network-online.target

[Service]
User=xray-xhttp
Group=xray-xhttp
WorkingDirectory=/opt/xray-xhttp/v26.3.27
ExecStart=/opt/xray-xhttp/v26.3.27/xray run -config /etc/xray-xhttp/server.json
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
UMask=0077

[Install]
WantedBy=multi-user.target

執行 sudo systemctl daemon-reload 及 sudo systemctl start xray-xhttp。確認此單元 PID 持有 TCP 8443,舊單元仍保留原監聽。啟動失敗時查看受限 journal。這個階段毋須先啟用開機自動啟動。

以指定執行檔完整路徑執行 xray run -config ./client.json,保持前景運作。只把試驗應用程式設為 SOCKS5 127.0.0.1:1081,並確認另一應用程式或客戶端仍經舊入口。排障時不要一次停止全部 Xray 程序。

如何驗證 XHTTP 設定的雙向傳輸?

準備你管理的 HTTPS 端點,提供已知下載內容、上載收據及刻意延長的回應。使用無敏感資料的測試檔,預先限制時間和大小。未獲同意,不向第三方診斷網站上載檔案。

curl --fail --show-error --noproxy '' --proxy socks5h://127.0.0.1:1081 https://check.example.net/download -o ./download.bin
curl --fail --show-error --noproxy '' --proxy socks5h://127.0.0.1:1081 --data-binary @./trial.bin https://check.example.net/upload

替換兩個受控網址,把下載內容及上載收據與原檔核對。再經舊客戶端實際本機連接埠執行同一任務,記錄完成情況、方向、時間及錯誤。首個頁面很快,不代表持續上載正常。

每次以客戶端副本做負例時,先停止上一個前台測試程式,再只用修改後的副本啟動同一回環連接埠,確認監聽屬於該程式。每次只改一個條件;下一項前恢復正確檔案並重做正例請求。

單項改動或檢查預期行為停止或復原措施
UUID、TLS 名稱、路徑及模式正確上載和下載均正確完成切換前先找出失敗方向
客戶端副本只換另一個新 UUID新代理請求認證失敗如成功,查繞過、程序身份及伺服器用戶列表
serverName 改為憑證未涵蓋的自有域名憑證名稱驗證失敗恢復正確名稱,保留 allowInsecure: false
客戶端路徑改為 /different-trial/試驗請求無法匹配恢復完整路徑;只改後綴可能仍匹配伺服器前綴
只把客戶端模式改成 packet-up明確 stream-up 伺服器拒絕 packet-up 上載恢復模式;模式檢查不代替 UUID 認證
新入口執行長請求,同時獨立觀察舊入口試驗可用,舊服務保留監聽及原有任務舊流量受影響便停止試驗
只重新啟動試驗服務新路徑的新請求恢復核對持久設定及憑證權限

指定版本檢查路徑前綴,並區分 packet-up 與 stream-up 上載處理。某些其他模式組合可能獲接受,不要宣稱所有不同模式都會被拒絕。[5]使用上面的不同前綴路徑及 packet-up 負例,每項之後恢復有效設定。

在已設定代理的瀏覽器開啟IP 位址工具,比較該請求與預期出口。這不涵蓋全部 DNS、IPv6、UDP 或應用程式。舊 gRPC 路徑若仍有獨立故障,參考gRPC 逾時排查,不要假設新路徑已修好舊故障。核心角色另見Xray 與 V2Ray 的作用。

甚麼時候切換,如何回退舊入口?

雙向資料、持續請求、負例、憑證續期處理及試驗重新啟動全部符合驗收條件後,才修改一個客戶端儲存的應用程式設定。保留舊設定。已建立連線不會自動換入口,讓其完成或有意重新連線;改設定後以新請求核實。

回退由客戶端開始:恢復舊設定或本機 SOCKS 入口,驗證新請求,再停止前景試驗客戶端。伺服器執行 sudo systemctl disable --now xray-xhttp,不編輯原有單元。保存私密復原證據後,只刪除試驗規則、UUID、設定及不再需要的憑證副本。確認此服務不再持有 TCP 8443,而舊入口仍正常。

日後升級先準備另一版本目錄,修改此單元前檢查兩端檔案,重做相同驗收矩陣。暫時保留相容回退副本,不能永久停留在有漏洞的核心。即使一個客戶端成功遷移,亦不可因此移除其他用戶仍依賴的舊入口。

總結

安全遷移保留原本可用路徑,再加入可獨立觀察的試驗。設定匹配、雙向資料、明確拒絕及可行復原是驗收條件;本文不聲稱作者部署已通過實測。

常見問題

可以把 gRPC 欄位改名便當成 XHTTP 嗎?

不可以。須安裝相容核心,在兩端建立匹配的傳輸設定,再分別檢查實際上載和下載,而非只改欄位。

為何 XHTTP 試驗要另用連接埠及服務?

獨立歸屬讓你停止試驗時毋須重新啟動舊入口,也較容易辨認監聽、設定檔選擇及回退對象的錯誤。

設定驗證成功代表 UUID 可用嗎?

不代表。語法檢查無法確認遠端授權,須先用正確 UUID 存取受控目的地,再換另一有效 UUID 檢查拒絕。

XHTTP 模式不同是否全部都會失敗?

不是,接受行為取決於指定實作。本文用 packet-up 客戶端配合明確 stream-up 伺服器,檢查這個特定組合的拒絕。

一次下載成功是否足以驗收遷移?

不足夠。還要測上載、持續請求、拒絕、重新啟動及復原;單一客戶端達到驗收條件前應保留舊入口。

改設定後,舊連線會轉往新入口嗎?

既有連線保留原來路徑。應有意切換客戶端設定,以新請求驗證新入口,之後才考慮退役舊服務。

遷移成功後可立即刪除舊伺服器設定嗎?

先核對剩餘用戶和復原需要。這個單一客戶端流程沒有授權刪除其他客戶端仍在使用的入口。

來源:

  1. Xray-core release v26.3.27 — https://github.com/XTLS/Xray-core/releases/tag/v26.3.27
  2. Project X: XHTTP mode discussion — https://github.com/XTLS/Xray-core/discussions/4113
  3. Pinned Xray VLESS configuration implementation — https://github.com/XTLS/Xray-core/blob/v26.3.27/infra/conf/vless.go
  4. Project X: transport configuration — https://xtls.github.io/en/config/transport.html
  5. Pinned Xray XHTTP server implementation — https://github.com/XTLS/Xray-core/blob/v26.3.27/transport/internet/splithttp/hub.go

Sources checked 2026 年 10 月 11 日。

延伸閱讀:

開啟 3 天免費試用

註冊即可免費體驗全部高級功能。

*只限新用戶;每位用戶只可獲得一次試用。

XHTTP 設定:遷移單台 Xray 入口並保留復原路徑 | AethoVPN