XMPP + I2P 實現匿名加密通信

匿名通訊是保障言論自由的重要手段,但是某些個人或組織對於獲取信息的貪婪也使匿名通訊愈發困難。好在捍衛自由的道路並不是孤獨的,如今的我們可以站在巨人的肩膀上使用 XMPP + OMEMO 進行加密通訊,也可以使用 Tor 或者 I2P 來匿名地訪問網路。那如果我們把這些特性結合起來,能夠創造出怎樣的結果呢?本文將用儘可能簡單的文字來介紹如何在自己的電腦上實現通過 I2P 網路進行 XMPP 通訊。

本文安裝環境爲「Arch Linux」,使用的是 C++ 版本的 i2pd,XMPP 伺服器使用的是 Prosody 加上 darknet 這個模塊。其他系統的安裝思路類似,本文參照這篇文章進行配置,並增加和修改了部分內容。

注意,本文 <...> 中的內容需要依照自己的實際情況自行替換。

目錄

安裝並配置 I2P 網路

如對本節內容有任何疑問可嘗試在如下資料中尋找答案:

連接 I2P 網路

首先我們需要安裝並配置 I2P:

$ sudo pacman -S i2pd
$ sudo systemctl start i2pd.service

不出意外的話,此時只需要在瀏覽器地址欄輸入 http://127.0.0.1:7070 就可以看到 i2pd webconsole 了,到此爲止 i2pd 就開始運行了。但由於 I2P 的特性,新安裝的 I2P 需要進行一段時間的 reseeding,這段時間的長短根據不同的網路質量會有所不同。因此筆者建議如果連接不上 I2P 網路,可以讓電腦運行一天左右再回來重新嘗試連接。具體如何瀏覽 I2P 的網站(也叫 Eepsite)就不在本文展開了。

連接困難、速度緩慢也是 I2P 很難被大衆接受的原因之一,很多人因爲安裝完成後不能馬上連接就放棄了,這也是很多 Decentralized 網路的困境,Tor 也或多或少有着類似的問題。這些問題都是由於 Decentralized 網路自身的運行機制決定的。關於這個問題的討論和本文關係不大所以就不展開討論了。總的來說,I2P 使用人數越多且每個人運行 I2P 的時間越久,那其使用體驗就會越好。所以筆者推薦電腦開機後直接默認運行 I2P,例如:

$ sudo systemctl enable i2pd.service

在等待 I2P 進行 reseeding 的同時,我們就可以進行下面的配置了。

創建一個新的 I2P tunnel

首先,在 tunnels.conf 文件中添加如下內容(我們通常能在 /etc/i2pd/tunnels.conf 中找到這個文件):

[prosody-s2s]
type=server
host=127.0.0.1
port=5269
inport=5269
keys=prosody.dat

配置完成後需要重新啓動 i2pd 服務,例如:

$ sudo systemctl restart i2pd.service

重新啓動之後,在瀏覽器中輸入 http://127.0.0.1:7070 進入 i2p webconsole,然後點擊 I2P tunnels,在 Server Tunnels 中可以看到我們剛剛添加的 prosody-s2s。記住其後面的地址,這將成爲 XMPP 伺服器的地址,後文會將其表示爲 <address>.b32.i2p

安裝並配置 XMPP 伺服器

如對本節內容有任何疑問可嘗試在如下資料中尋找答案:

安裝 Prosody

接下來我們開始安裝並配置 XMPP 伺服器,本文使用的是 Prosody 加上 darknet 這個模組。

首先,我們安裝 prosody 本體和 lua52-sec(添加對 TLS/SSL 的支持):

$ sudo pacman -S prosody lua52-sec

安裝 mod_darknet

然後我們需要安裝 mod_darknet,在這之前我們需要先安裝 lua-bit32

$ sudo pacman -S lua-bit32

接下來從 mod_darknet 原作者那裏下載並安裝 darknet 這個模組。通常情況下安裝路徑爲 /usr/lib/prosody/modules,具體安裝方法可以參考原作者的教程。

配置 Prosody

上面的準備工作都做完後,我們就可以在 /etc/prosody/prosody.cfg.lua 中配置 Prosody 了,配置方法如下(其中 ... 爲省略的內容,請根據實際情況自行替換。如果遇到問題,看看是不是需要在配置文件中刪除掉未被使用的 VirtualHost):

interfaces = { "127.0.0.1" }
...
admins = { "admin@<address>.b32.i2p" }
...
modules_enabled = {
    ...
    "darknet";
}
...
darknet_only = true
...
authentication = "internal_plain"
...
VirtualHost "<address>.b32.i2p"
    certificate = "/var/lib/prosody/<address>.b32.i2p.crt"

配置完成後,記得重啓 Prosody 服務,例如:

$ sudo systemctl restart prosody

生成 SSL/TLS 證書

細心的看官可能發現配置中的證書並不存在。當配置並重啓之後,我們就可以爲 XMPP 伺服器地址生成一個 SSL/TLS 證書了:

$ sudo prosodyctl cert generate <address>.b32.i2p

這個證書通常會生成在 /var/lib/prosody/ 路徑下,具體路徑參照生成後的輸出內容並酌情修改配置文件的內容。

添加用戶

接下來我們爲 Prosody 添加 admin 用戶,按照提示輸入密碼:

$ sudo prosodyctl adduser admin@<address>.b32.i2p

不過因爲伺服器本身是在我們自己的電腦上,所以添加 admin 用戶的作用並不大,可以根據需求更改配置。

上述內容都完成後,可以選擇再次重啓 Prosody 服務使其加載之前變更的配置內容。同樣的,如果有需要,也可以開機直接運行 Prosody,例如:

$ sudo systemctl restart prosody
$ sudo systemctl enable prosody

安裝並配置 XMPP 客戶端

如對本節內容有任何疑問可嘗試在如下資料中尋找答案:

安裝 Gajim

伺服器配置完畢後,我們需要安裝和配置 XMPP 的客戶端。各位看官可以選擇自己喜歡的客戶端,筆者這裏使用的是 Gajim,其他客戶端的配置也大同小異。首先,我們需要安裝 Gajim:

$ sudo pacman -S gajim

鑑於 OMEMO 從 Gajim 1.8.0 版本開始已經被集成在 Gajim,我們已經無需對其進行額外配置,因此請直接跳轉到「登錄用戶」的部分。不過筆者依然保留了對 OMEMO 進行配置的內容供有需要的看官參照,但請注意這部分內容因爲所需 AUR 已被刪除,所以在「Arch Linux」中已經不可用。

那麼安裝完 Gajim 後,我們就可以開始配置 OMEMO 了。首先安裝配置 OMEMO 所需的內容:

$ sudo pacman -S python-axolotl python-qrcode

接下來我們需要安裝這個 AUR 叫做:gajim-plugin-omemo

$ git clone https://aur.archlinux.org/gajim-plugin-omemo.git
$ cd gajim-plugin-omemo
$ makepkg
$ sudo pacman -U gajim-plugin-omemo-<version>.pkg.tar.zst

安裝完成後,在 Gajim -> Plugins 中選中 OMEMO(默認情況下應該是已經選中了)。

登錄用戶

現在我們可以來嘗試登錄我們的賬戶了。打開 Gajim,選擇 Add Account,輸入用戶名(admin@<address>.b32.i2p)和密碼並勾選 Advanced Settings。然後選擇 Log In 進入 Advanced Settings,分別填寫 Hostname 和 Port 爲 127.0.0.15222,最後點擊 Log In 就可以成功登錄了。如果遇到「Certificate Verification Failed」的提示,則可以在查看證書內容與前文生成的證書相符後選擇「Add to Trusted Certificates」。

到此就配置成功啦,趕快找身邊的小夥伴聊天看看吧 (*•̀ㅂ•́)و