如何在 VPS 自架 SimpleX SMP relay 伺服器
在 VPS 自架 SimpleX SMP relay,涵蓋固定版本安裝、用戶端需要的 fingerprint、連接埠、非特權服務帳號、備份、TLS 與威脅模型。
自架 SimpleX 聊天伺服器的功能
若要自架 SimpleX 聊天伺服器,您需要在 VPS 上執行一個 daemon:smp-server,也就是 SMP(simplex messaging protocol)的 relay。它會保存聯絡人寫入及讀取的訊息佇列。另一個名為 xftp-server 的選用 daemon 可轉送檔案傳輸。兩者都來自同一個專案 simplexmq,而且各自都是由單一 binary、設定檔及 append-only log 組成。
本文是寫給操作人員,而不是應用程式使用者。relay 不保存帳號、聯絡人清單或聊天記錄。它保存佇列、部分尚未傳遞的 ciphertext,以及一份用來識別它的憑證。您需要負責的是服務可用性、少量磁碟空間,以及通過您伺服器的 metadata。
以下每個 command、path、port 和 flag 都來自專案自己的文件:SMP server hosting page、XFTP server page 及 protocol security document。凡是涉及重要數字,都會在旁邊標明其來源頁面。
為何沒有使用者識別資訊的網路仍需要 relay
SimpleX 沒有使用者名稱、電話號碼或帳戶 ID。聯絡人是一個單向佇列:位於某個 relay 上的地址,由一方寫入,另一方讀取。兩個聯絡人不共用任何可讓伺服器相互關聯的識別資訊。
這些佇列仍必須儲存在某處,原因很簡單。兩支手機很少會在同一秒上線。某個元件必須先接收訊息並暫存,直到另一台裝置提出要求。這就是 SMP relay 的全部工作。這也表示兩台裝置不會彼此直接連線,因此任何一方都不會得知另一方的 IP(internet protocol)位址。這項暴露風險改由 relay 承擔。
relay 的主機名稱是佇列地址的一部分,因此會包含在你從該 relay 發出的每個邀請連結中。閱讀接近結尾的威脅模型時,請記住這點。
轉送站能看見與不能看見的資訊
該專案在 protocol/security.md 中將這些內容列為威脅模型。安裝任何元件前都值得先閱讀,因為完成本指南後,該轉送站就由你管理。即使轉送站完全受攻擊者控制,也無法得知訊息的內容或類型,無法在不被察覺的情況下新增、複製或破壞個別訊息,也無法透過主動攻擊破解端對端加密。
同一頁也列出轉送站能做的事。它可以得知佇列收件者何時上線,可以計算通過佇列的訊息數量,也可以得知收件者的 IP 位址。它可以丟棄佇列中之後的所有訊息,或謊報該佇列的狀態。
因此,兩者的分工很明確。機密性由用戶端負責,自行代管不會影響這部分。中繼資料與可用性由轉送站管理者負責,而自行代管會將這兩項都交由你管理。
開始前的準備
- 執行 Ubuntu 22.04 或 24.04 的 VPS。此專案發布的二進位檔正是針對這兩個版本建置,並提供 x86-64 與 aarch64 架構。
- 一個 A record 指向 VPS 的網域名稱。如果使用 IPv6,還需要 AAAA record。文件以
smp1.example.com為範例。 - root 或
sudo存取權限,以及在調整防火牆時保持開啟的第二個 SSH 工作階段。 - 可在伺服器外部儲存備份的位置,因為設定目錄就是伺服器的身分識別資料。
在 ARM instance 上,請改用 aarch64 資產,不要使用 x86-64。本指南的其他內容不變,而 選擇 ARM 或 x86 VPS 方案取決於價格與每核心速度,不取決於此軟體是否能執行。
安裝固定版本,不要使用「latest」
專案提供安裝指令碼,會擷取目前的版本並註冊 simplex-servers-update 指令。這個方式可以運作,但仍應固定版本:如果 relay 的二進位檔在執行期間自行變更,發生問題時就難以判斷原因。
截至 2026 年 8 月,目前的 simplexmq 版本是 v6.5.0,發布日期為 29 April 2026。請查看版本發布頁面並選擇所需的標籤,然後在下方所有步驟中使用相同標籤。
sudo useradd -m smp
sudo install -d -o smp -g smp -m 755 /etc/opt/simplex /var/opt/simplexuseradd -m smp 不會設定密碼,因此沒有人能直接以 smp 登入。執行其他操作前,請先自行建立這兩個目錄,因為 /etc/opt 屬於 root,權限模式為 755,smp 使用者將無法在其中寫入自己的設定目錄。
VER=v6.5.0
curl -fL "https://github.com/simplex-chat/simplexmq/releases/download/$VER/smp-server-ubuntu-24_04-x86-64" -o /tmp/smp-server
sha256sum /tmp/smp-server請將該雜湊值與版本發布說明中、相同標籤所發布的 SHA2-256 checksum 進行比對。專案也會使用 SimpleX Chat 金鑰 FB44AF81A45BDE327319797C85107E357D4A17FC 簽署版本 checksum。相關資訊記載於伺服器頁面,因此您可以驗證簽章,而不是直接信任取得雜湊值的頁面。
sudo install -m 755 -o root -g root /tmp/smp-server /usr/local/bin/smp-server請刻意將其安裝為 root 所有。服務會以 smp 身分執行,因此即使服務遭到入侵,也無法改寫它所啟動的二進位檔。
初始化伺服器,以及它輸出的 2 個 secret
sudo su smp -c "smp-server init --yes --store-log --daily-stats --no-password --fqdn=smp1.example.com"--store-log(-l) 會將佇列以僅可附加的日誌寫入/var/opt/simplex/smp-server-store.log,因此 relay 在重新啟動後仍能保留狀態。沒有這項設定時,重新啟動會捨棄所有佇列,所有經由你的 relay 路由的聯絡方式都會停止運作。--daily-stats(-s) 會將計數器以 CSV 格式寫入/var/opt/simplex/smp-server-stats.daily.log。--fqdn會將你的網域名稱寫入產生的憑證。如果沒有網域,請改用--ip。--no-password允許任何人於你的 relay 上建立佇列。若要限制為私有,請在初始化完成後,於/etc/opt/simplex/smp-server.ini的[AUTH]下設定create_password,不要在此處傳入--password,因為命令列會在執行期間出現在 shell 歷程記錄與程序清單中。
Init 會產生憑證,並輸出你必須保存的 2 個值。第 1 個值是指紋,也是一個 base64 字串,同時會寫入 /etc/opt/simplex/fingerprint。第 2 個值是完整的伺服器位址,由指紋加上主機名稱組成。現在請複製這 2 個值。
Init 也會建立 /etc/opt/simplex/ca.key,文件指示你將該檔案移至離線儲存體。原因值得特別說明:用戶端會固定信任該憑證授權單位的指紋,因此持有 ca.key 的任何人,都能簽發用戶端會接受為你伺服器的新憑證。只有在之後使用 smp-server cert 輪替伺服器憑證時,才需要將它取回。
請將 init 視為一次性步驟。位址中的指紋來自 init 產生的憑證授權單位,因此重新產生該授權單位會得到不同的位址,先前提供的位址也會失效。
以無特權使用者在 systemd 下執行
請依文件內容原樣寫入 /etc/systemd/system/smp-server.service:
[Unit]
Description=SMP server systemd service
[Service]
User=smp
Group=smp
Type=simple
ExecStart=/usr/local/bin/smp-server start +RTS -N -RTS
ExecStopPost=/usr/bin/env sh -c '[ -e "/var/opt/simplex/smp-server-store.log" ] && cp "/var/opt/simplex/smp-server-store.log" "/var/opt/simplex/smp-server-store.log.bak"'
LimitNOFILE=65535
KillSignal=SIGINT
TimeoutStopSec=infinity
[Install]
WantedBy=multi-user.target上游 unit 也包含 AmbientCapabilities=CAP_NET_BIND_SERVICE。這一行是必要的,因為程序會以 smp 身分執行,而 1024 以下的連接埠會對非 root 程序關閉。沒有這一行時,daemon 無法繫結 80 或 443。若要提供這些連接埠,請加入此設定。LimitNOFILE=65535 很重要,因為每個已訂閱的用戶端都會持有一個開啟的 TCP 連線,而預設限制遠低於繁忙 relay 的需求。ExecStopPost 會在每次停止時,將 store log 複製到 .bak 檔案,讓你保留一個可用的回滾點。
sudo systemctl daemon-reload
sudo systemctl enable --now smp-server
sudo systemctl status smp-server
sudo journalctl -fu smp-server正常啟動時,日誌會記錄伺服器位址。接著確認 socket 確實已開啟:
sudo ss -tlnp | grep -E ':(443|5223)'兩行都應該列出 smp-server。讓 daemon 使用專用帳號執行,且不授予 sudo 權限,與 VPS 上的每項服務使用專用帳號 所述的做法相同。這能避免某個網路 daemon 的錯誤進一步取得 root shell。
要開放哪些連接埠,以及哪個連接埠應保持關閉
文件列出 3 個連接埠:5223/tcp、443/tcp 和 80/tcp。5223 是 SMP 傳輸連接埠。隨附的設定會在 [TRANSPORT] 下設定 port: 5223,443,因此相同的通訊協定也會在 443 上回應。這很重要,因為許多限制嚴格的網路只允許對外連線至 443。80 只有在需要選用的資訊頁面及其重新導向至 HTTPS 時才需要。
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 5223/tcp
sudo ufw enable不要開放 5224。這是控制連接埠,文件會透過 nc 127.0.0.1 5224 從伺服器本機存取它。它會顯示伺服器狀態並刪除佇列,因此應限制在 loopback,並在 [AUTH] 下設定管理員和使用者密碼。如果你不熟悉這項工具,VPS 上的 ufw 基礎說明規則順序,以及如何避免把自己鎖在伺服器外。
還有一項控制措施很容易被忽略。多數供應商會在控制面板中執行獨立於伺服器上 ufw 的網路防火牆。連接埠即使在 ufw 中開放,仍可能在封包到達伺服器前遭到丟棄。
用戶端需要的伺服器位址
smp://<fingerprint>[:<password>]@<public_hostname>[,<onion_hostname>]這段字串就是完整的用戶端設定。將它貼到應用程式的伺服器設定中,或讓其他人掃描應用程式顯示的 QR code。文件指出,QR code 內含密碼,因此掃描該 QR code 的人也能透過你的伺服器接收訊息。
有一項文件記載的行為讓所有人都感到意外。在應用程式中加入你的伺服器,只會影響之後建立的聯絡人。現有聯絡人仍會留在建立其佇列的 relay 上,不會自動遷移。這也是你在替換 relay 後,無法隔天就將舊 relay 關閉的原因。
新增 XFTP 檔案中繼站
XFTP(SimpleX file transfer protocol)負責網路中的檔案傳輸部分,是使用獨立位址的個別 daemon。根據專案的 XFTP 公告,中繼站完全不會取得檔案中繼資料:它們只會看到個別區塊,每個區塊大小為 256kb、1mb 或 4mb,存取權限則由匿名認證資料授予。傳送者可以將同一個檔案的區塊分散到多個中繼站,因此你的伺服器保存的是檔案片段,而不是完整檔案。
sudo useradd -m xftp
sudo install -d -o xftp -g xftp -m 755 /etc/opt/simplex-xftp /var/opt/simplex-xftp /srv/xftp
curl -fL "https://github.com/simplex-chat/simplexmq/releases/download/$VER/xftp-server-ubuntu-24_04-x86-64" -o /tmp/xftp-server
sudo install -m 755 -o root -g root /tmp/xftp-server /usr/local/bin/xftp-server
sudo su xftp -c "xftp-server init -l --fqdn=xftp1.example.com -q '20gb' -p /srv/xftp/"它的設定檔位於 /etc/opt/simplex-xftp/,狀態資料位於 /var/opt/simplex-xftp/,檔案區塊則儲存在 -p 所指定的位置。systemd 單元的結構相同,使用 User=xftp 與 ExecStart=/usr/local/bin/xftp-server start +RTS -N -RTS。初始化程序會以與 SMP 相同的格式輸出 xftp:// 位址,並在 /etc/opt/simplex-xftp/fingerprint 顯示自己的指紋。
必須預先處理連接埠衝突。XFTP 伺服器文件指定的連接埠是 443,而 SMP 設定也列出 443。同一個位址上的同一個連接埠不能由兩個程序同時繫結,因此在單一 VPS 上必須調整其中一項設定。最簡單的作法是在 SMP 的 [TRANSPORT] 區段中設定 port: 5223,將 443 留給檔案中繼站;代價是位於受限網路中的用戶端無法使用 443 fallback。其他選項包括在同一台 VPS 上設定第二個 IP 位址,或使用第二台 VPS。
請依實際情況設定配額。-q '20gb' 代表你可提供的磁碟空間承諾。檔案中繼站會消耗磁碟空間與頻寬;訊息中繼站幾乎不會消耗這兩項資源。
磁碟上的內容,以及備份可還原的項目
有兩個目錄很重要。/etc/opt/simplex/ 是身分資料:smp-server.ini、伺服器憑證與金鑰、ca.key,以及 fingerprint。/var/opt/simplex/ 是狀態資料:smp-server-store.log 儲存佇列中的項目;啟用 restore_messages: on 時,也會儲存尚未傳送的訊息,並與每日統計檔案放在一起。
sudo systemctl stop smp-server
sudo tar czf /root/simplex-backup.tgz -C / etc/opt/simplex var/opt/simplex
sudo chmod 600 /root/simplex-backup.tgz
sudo systemctl start smp-server請先確認該封存檔的用途。它不是訊息封存檔:佇列中的項目是使用 relay 從未持有的金鑰加密的密文,而隨附的 [STORE_LOG] 設定檔本身也會在 21 天後讓訊息失效。因此,它是伺服器身分的副本,其中也包含 ca.key;取得該檔案的人可以向你的聯絡人冒充你的 relay。請將它加密,並儲存在該伺服器之外。
備份的價值在於還原。將 /etc/opt/simplex 放回新的 VPS,讓相同的 DNS 名稱指向該 VPS,指紋就不會變更,因此你提供的每個地址仍可運作。如果遺失該目錄,就無法復原:重新安裝會產生新的指紋,也會產生新的地址,所有經由你的 relay 路由的聯絡人都會失去連線。
TLS:兩張憑證,各自負責不同工作
SMP 傳輸不使用公開憑證授權單位。Init 會產生私有授權單位與伺服器憑證,而該授權單位的指紋會包含在伺服器位址中。用戶端會將伺服器提供的內容與這個固定指紋比對。專案將此描述為防止用戶端與伺服器之間的連線遭受 machine-in-the-middle 攻擊。該埠不需要執行 ACME(automatic certificate management environment)用戶端,憑證輪替則是在設定 SMP_SERVER_CFG_PATH 的情況下手動執行 smp-server cert。
選用的資訊頁面使用另一張憑證。其 [WEB] 區段會指定 static_path、https: 443、cert: /etc/opt/simplex/web.crt 與 key: /etc/opt/simplex/web.key。瀏覽器不認得你的私有授權單位,因此公開信任的憑證應用在這個位置。文件中的 Docker 快速入門正是為此讓 Caddy 置於伺服器前方,並自動簽發憑證。
透過 Tor 連線至 relay
文件中的 Tor 章節會從 Tor Project repository 安裝 Tor,並在 /etc/tor/torrc 中加入 hidden service:
SOCKSPort 0
HiddenServiceNonAnonymousMode 1
HiddenServiceSingleHopMode 1
HiddenServiceDir /var/lib/tor/simplex-smp/
HiddenServicePort 5223 localhost:5223
HiddenServicePort 443 localhost:443請仔細閱讀兩行模式設定。Single hop 且 non-anonymous 表示不會隱藏 relay 本身的位置。onion address 速度快,並讓用戶端能以不向你揭露其 IP address 的方式連線;但伺服器本身仍可透過其 public IP 找到。/var/lib/tor/simplex-smp/hostname 提供的 onion hostname 應加在 server address 末尾,並以逗號分隔。若也要隱藏伺服器的位置,則需要不同的設定;在 VPS 上執行真正的 onion service 說明了其中的取捨。各工具所隱藏內容的差異,是 Tor 與 VPN 的比較 的主題,這裡同樣直接適用。
威脅模型:自架服務帶來的變化
自架服務能帶來的好處。中繼資料(存在多少佇列、何時讀取,以及哪些位址建立連線)會放在你控管的機器上,你也能設定資料保留多久。此外,你不再屬於一個可被一次要求提供大量資料的龐大資料池。
自架服務無法帶來的好處如下:
- 加密方式不會改變。在建置這項服務之前,訊息已採用端對端加密;建置之後仍然採用端對端加密。自架服務是中繼資料的決策,不是密碼學的決策。
- VPS 供應商會看見通往你 IP 位址的網路流量,也會持有你的計費資料。你只是把信任對象從訊息服務營運商改成主機代管營運商,並沒有移除信任。
- 你的 relay 規模很小。如果它只服務一個家庭,連線到它就能辨識該家庭,而它的主機名稱也會出現在你從該 relay 傳送的每個邀請連結中。繁忙的公開 relay 在這一點上能更好地隱藏你的身分,而這才是真正的取捨。私有搜尋伺服器也有相同特性,因此 SearXNG 在你自己的 VPS 上實際隱藏的內容,取決於有多少人和你共用該執行個體。
- 可用性現在由你負責。磁碟空間耗盡或主機故障,都會導致訊息停止傳遞,而你的聯絡人無法繞過你來傳送訊息。
同樣的道理也適用於你放在自有主機上的任何私有服務,無論是這個 relay,還是 在你自己的 VPS 上架設 WireGuard VPN。你是在選擇由哪一方看見中繼資料,而不是讓中繼資料消失。
無法運作時
服務啟動後立即停止。 先查看 sudo journalctl -u smp-server -n 50。繫結失敗訊息會指出無法使用的連接埠。接著執行 sudo ss -tlnp | grep :443,確認目前是哪個程序已佔用該連接埠。在剛建置的伺服器上,通常是 nginx、Caddy,或你一小時前安裝的 XFTP server。
Init 無法寫入設定。 在 /etc/opt/simplex 尚未存在前,以 smp 使用者執行 smp-server init 會發生權限錯誤,因為 /etc/opt 的擁有者是 root。先以正確的擁有者建立目錄,再重新執行 init。
用戶端無法連線到 relay。 使用 dig +short smp1.example.com 檢查名稱是否解析到正確的位址。接著從筆記型電腦,而不是從伺服器測試連接埠:nc -vz smp1.example.com 5223。如果從外部連線失敗,但 ss 顯示伺服器上的 socket 處於開啟狀態,問題可能出在供應商的網路防火牆。這是與 ufw 分開的控制項。
聯絡人無法透過 relay 連線。 你分享的位址中,指紋必須符合 /etc/opt/simplex/fingerprint 目前的內容。如果你在 [AUTH] 下設定 create_password,位址也必須包含該密碼,否則用戶端無法建立佇列。
在應用程式中加入伺服器後,沒有任何資料移動。 這是預期行為。只有新的聯絡人會使用新加入的 relay。現有聯絡人仍會使用原本已有的佇列。
FAQ
自行託管 SimpleX server 會讓我的訊息更安全嗎?
不會,而且這是設計使然。SimpleX 會在裝置之間對訊息進行端對端加密,因此無論由誰執行 relay,都不會持有金鑰。自行託管會改變能觀察這些訊息周邊中繼資料的人:有哪些佇列、何時被讀取,以及哪些 IP 位址正在連線。這是中繼資料的決策。如果自行託管的理由是更強的加密,原本就已經具備這項加密。
SimpleX relay operator 實際上能看到什麼?
專案的 protocol/security.md 對此有明確說明。relay 無法讀取訊息內容或類型,無法在不被察覺的情況下修改個別訊息,也無法透過主動攻擊破解端對端加密。relay 可以看到佇列的收件者何時上線、計算通過佇列的訊息數量、得知收件者的 IP 位址、丟棄佇列中的後續訊息,或謊報該佇列的狀態。relay 歸你所有後,你便擁有這些能力。
我需要網域名稱和 TLS 憑證嗎?
可用的設定需要網域,而如果確實沒有網域,smp-server init 接受 --ip。訊息連接埠不需要由公開憑證機構簽發的憑證:init 會產生自己的憑證機構,client 會固定比對出現在 smp:// 位址中的指紋。只有選用的網頁資訊頁面需要公開信任的憑證;該頁面會在 smp-server.ini 的 [WEB] 區段中設定為 cert 和 key。
如果我遺失 /etc/opt/simplex,會發生什麼事?
你提供給他人的所有位址都會停止運作。該目錄存放憑證機構,而其指紋已嵌入你的 server 位址,因此重建後會產生不同的指紋,也就代表不同的 server。佇列位於該 relay 上的聯絡人,無法從 client 端修復。請將該目錄加密備份至主機外,並依文件指示將 ca.key 離線保存,因為持有它的人可以冒充你的 relay。
我可以在同一台 VPS 上執行 SMP relay 和 XFTP file relay 嗎?
可以,但必須解決一項衝突。XFTP server 的文件指定連接埠為 443,而預設 SMP 設定列出 port: 5223,443,因此兩者都需要同一個 socket。將 443 指派給其中一個:為 SMP server 設定 port: 5223,或將 file relay 移至第二個 IP 位址或第二台 VPS。也請依實際可用的磁碟容量設定儲存配額,因為消耗磁碟空間與頻寬的是 file relay。