如何在 VPS 自架 SimpleX SMP relay
在 VPS 自架 SimpleX SMP relay,涵蓋固定版本安裝、client 必需的 fingerprint、連接埠、非特權服務帳號、備份、TLS 與威脅模型。
自架 SimpleX 聊天伺服器的功能
若要自架 SimpleX 聊天伺服器,您需要在 VPS 上執行一個 daemon:smp-server,也就是 SMP(simplex messaging protocol)的 relay。它會保存聯絡人寫入及讀取的訊息佇列。另一個名為 xftp-server 的選用 daemon 可轉送檔案。兩者都來自同一個專案 simplexmq,各自只包含單一 binary、設定檔及 append-only log。
本文面向 operator,而非 app 使用者。relay 不保存帳號、聯絡人清單或聊天記錄。它保存的是佇列、部分尚未遞送的密文,以及用來識別自身的憑證。您需要負責的是服務持續運作、少量磁碟空間,以及經過您伺服器的 metadata。
以下每個 command、path、port 與 flag 都來自該專案自己的文件:SMP server hosting page、XFTP server page 及 protocol security document。凡涉及重要數字,下一處會標明其來源頁面。
為何沒有使用者識別資訊的網路仍需要 relay
SimpleX 沒有使用者名稱、電話號碼或帳戶 ID。聯絡人是一個單向佇列:位於某個 relay 上的地址,由一方寫入,另一方讀取。你的兩個聯絡人不共用任何可供伺服器相互關聯的識別資訊。
這些佇列仍必須儲存在某個位置,原因很簡單。兩支手機很少會在同一秒處於線上狀態。系統必須先接收訊息,並保留到另一台裝置提出要求為止。這就是 SMP relay 的完整工作。這也表示兩台裝置不會彼此直接連線,因此任一方都不會得知另一方的 IP(網際網路協定)位址。relay 會代為承擔這項暴露風險。
relay 的主機名稱是佇列地址的一部分,因此你從該 relay 發出的每個邀請連結都會包含它。閱讀本文結尾附近的威脅模型時,請記住這一點。
Relay 能看見與不能看見的內容
專案在 protocol/security.md 中將此列為威脅模型。安裝任何內容前都值得先閱讀,因為完成本指南後,該 relay 就由你管理。即使 relay 完全遭攻擊者控制,也無法得知訊息內容或類型,無法在不被察覺的情況下新增、重複或竄改個別訊息,也無法透過主動攻擊破解端對端加密。
同一頁也列出 relay 能 做的事。它可以得知 queue recipient 何時上線,可以計算有多少訊息通過某個 queue,也可以得知 recipient 的 IP 位址。它可以捨棄某個 queue 中之後的所有訊息,或謊報該 queue 的狀態。
因此,兩者的界線很清楚。機密性由 client 負責,自行架設不會影響這一點。中繼資料與可用性由 relay operator 負責,而自行架設會將這兩者都交給你。
開始前的必要條件
- 一台執行 Ubuntu 22.04 或 24.04 的 VPS。此專案會針對這兩個版本分別發布 x86-64 與 aarch64 的可執行版本。
- 一個 A 記錄指向 VPS 的網域名稱;如果使用 IPv6,還需要 AAAA 記錄。文件以
smp1.example.com為例。 - root 或
sudo存取權限,並在調整防火牆時保持另一個 SSH 工作階段開啟。 - 伺服器外部的備份儲存位置,因為設定目錄就是伺服器的身分識別。
在 ARM 執行個體上,請改用 aarch64 資產,而不是 x86-64。本指南的其他步驟都不需變更;ARM 與 x86 VPS 方案的選擇取決於價格與每核心速度,而不是此軟體是否能執行。
固定版本安裝,不使用「latest」
該專案提供安裝指令碼,會下載目前的版本,並註冊 simplex-servers-update 指令。這種方式可以運作,但仍應固定版本:如果 relay 的 binary 在執行期間自行變更,發生問題時就無法可靠地分析其行為。
截至 2026 年 8 月,目前的 simplexmq 版本為 v6.5.0,發布日期為 2026 年 4 月 29 日。請查看版本發布頁面以確認所需的 tag,然後在下方所有步驟中使用相同的 tag。
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將該雜湊值與相同 tag 的版本發布說明中提供的 SHA2-256 checksums 比對。該專案也會使用 SimpleX Chat key FB44AF81A45BDE327319797C85107E357D4A17FC 簽署版本 checksum;相關資訊記載於伺服器頁面。因此,您可以驗證簽章,而不必信任提供該雜湊值的頁面。
sudo install -m 755 -o root -g root /tmp/smp-server /usr/local/bin/smp-server請刻意將其安裝為 root 擁有。服務會以 smp 身分執行,因此即使服務遭到入侵,也無法改寫其啟動所使用的 binary。
初始化伺服器,並保存其輸出的 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 上建立佇列。若要限制為私有設定,請在 init 完成後,於/etc/opt/simplex/smp-server.ini的[AUTH]下設定create_password,不要在此處傳入--password,因為命令列內容會在執行期間出現在 shell history 和 process list 中。
Init 會產生憑證,並輸出你必須保存的 2 個值。第 1 個值是 fingerprint,也會以 base64 字串形式寫入 /etc/opt/simplex/fingerprint。第 2 個值是完整的伺服器位址,由 fingerprint 加上你的主機名稱組成。請立即複製並保存這 2 個值。
Init 也會建立 /etc/opt/simplex/ca.key。文件要求你將該檔案移至離線儲存體。原因如下:用戶端會固定信任該憑證授權單位的 fingerprint,因此持有 ca.key 的任何人都能簽發新的伺服器憑證,而用戶端會將其接受為你的伺服器憑證。之後只有在使用 smp-server cert 輪替伺服器憑證時,才需要取回該檔案。
請將 init 視為一次性步驟。你的位址中的 fingerprint 來自 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 檔案,為你保留一個無須額外設定的 rollback point。
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 上的每項服務使用專用帳號 中所述的做法相同,也能避免某個 network 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 內含密碼,因此掃描的人也能透過你的伺服器接收訊息。
有一項文件記載的行為常讓人感到意外。在應用程式中加入你的伺服器,只會影響之後建立的聯絡人。既有聯絡人仍會使用建立其佇列時所選的 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 unit 的結構相同,使用 User=xftp 與 ExecStart=/usr/local/bin/xftp-server start +RTS -N -RTS。初始化程序會以與 SMP 位址相同的格式輸出 xftp:// 位址,並在 /etc/opt/simplex-xftp/fingerprint 顯示其專屬 fingerprint。
需要預先處理連接埠衝突。XFTP server 的文件指定使用 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 會產生私有憑證授權單位與伺服器憑證,而該授權單位的指紋會包含在伺服器位址中。用戶端會將伺服器提供的內容與固定的指紋比對。專案將此機制描述為防止機器介於中間攻擊,保護用戶端與伺服器之間的連線。該埠不需要執行 ACME(automatic certificate management environment)用戶端,憑證輪替則是在 smp-server cert 執行,並設定 SMP_SERVER_CFG_PATH。
可選的資訊頁面使用另一張憑證。其 [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 的方式連線,但伺服器本身仍可透過公開 IP 找到。/var/lib/tor/simplex-smp/hostname 提供的 onion hostname 應加在伺服器 address 末尾的逗號後方。若也要隱藏伺服器的位置,則需要不同的設定;在 VPS 上執行真正的 onion service 會說明其中的取捨。各工具所隱藏的內容不同,這正是 Tor 與 VPN 的比較 的主題,且此處同樣直接適用。
威脅模型:自架服務會帶來哪些變化
自架服務帶來的好處。中繼佇列有哪些、何時被讀取,以及哪些位址連線等中繼資料,都位於你控制的機器上。你也能設定這些資料的保留時間。你不會再隸屬於可被一次要求提供大量資料的大型使用者群組。
以下明確說明自架服務無法帶來的效果:
- 加密方式不變。在你建置此服務之前,訊息已採用端對端加密;建置之後仍然採用端對端加密。自架服務是中繼資料的決策,不是密碼學的決策。
- 你的 VPS 提供者會看到前往你 IP 位址的網路流量,也會持有你的帳務資料。你只是將信任對象從訊息服務營運商轉移至主機代管營運商,並未移除信任關係。
- 你的 relay 規模很小。如果它只服務一個家庭,連線至該 relay 就能識別這個家庭,而你從中送出的每個邀請連結都會包含其主機名稱。繁忙的公開 relay 在這一點上能更有效隱藏你的身分,這就是實際的取捨。
- 可用性現在由你負責。磁碟已滿或主機故障都會導致訊息停止傳遞,而你的聯絡人無法繞過你改用其他路徑。
相同的原則也適用於你部署在自有主機上的任何私人服務,無論是此 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 無法讀取訊息內容或類型,無法在不被察覺的情況下修改個別訊息,也無法透過主動攻擊破解端對端加密。它可以看到佇列的收件者何時上線、計算通過佇列的訊息數量、得知收件者的 IP 位址、丟棄佇列中的後續訊息,或謊報該佇列的狀態。relay 由你管理後,你就擁有這些權限。
我需要網域名稱和 TLS 憑證嗎?
可正常使用的設定需要網域,而在確實沒有網域時,smp-server init 接受 --ip。訊息連接埠不需要由公開憑證機構簽發的憑證:init 會產生自己的憑證機構,而 client 會固定驗證 smp:// 位址中顯示的指紋。只有選用的網頁資訊頁面需要公開信任的憑證;該頁面會在 smp-server.ini 的 [WEB] 區段中,以 cert 和 key 設定。
如果我遺失 /etc/opt/simplex,會發生什麼事?
你提供給他人的所有位址都會停止運作。該目錄存放憑證機構,而其指紋已嵌入 server address,因此重建後會產生不同的指紋,也就會成為不同的 server。佇列位於該 relay 上的聯絡人,無法從 client 端修復。請依照文件指示,將目錄加密備份到主機外,並將 ca.key 離線保存,因為持有它的人可以冒充你的 relay。
我可以在同一台 VPS 上執行 SMP relay 和 XFTP file relay 嗎?
可以,但需要先解決一項衝突。XFTP server 的文件指定連接埠為 443,而預設的 SMP config 列出 port: 5223,443,因此兩者都會嘗試使用相同的 socket。將 443 指派給其中一個:為 SMP server 設定 port: 5223,或將 file relay 移至第二個 IP 位址或第二台 VPS。也請依實際可用的磁碟容量設定 storage quota,因為消耗磁碟空間和頻寬的是 file relay。