在 FreeBSD 利用 I2P 架設 deep web site

I2P 也是一個老東西,不過這東西一直都沒有成熟過,到目前還屬於未完全開發的狀態,檯面上的社群也小得可憐。
它比較少被人們注意,是因為它幾乎不被用來當作跳板,因為不像 Tor 一樣有一大堆 exit nodes,它主打的就是 I2P 網路內部的服務。
I2P 網路內部提供的服務非常多樣性,mail、IRC、instant messaging 等服務都有,甚至可以用 BitTorrent 和 ed2k 等方式進行 file sharing。
但是這網路的缺點就是慢,加上使用的人少,導致貢獻頻寬的人少,讓這網路可說是慢上加慢,但隱密性確實是強過 Tor 的。

在 FreeBSD 9.x 的系統中安裝 i2p這篇裡我已經提過怎麼安裝,至於設定方面也沒有什麼難度,因為都是網頁設定而已。
如果你的機器在遠端而本機是 Windows,那就去下載 plink,然後寫個 .bat 檔,內容可以像這樣:
plink.exe -2 -P 22 -pw "遠端主機密碼" -L localhost:7657:localhost:7657 遠端主機帳號@遠端主機IP
執行以後,你只要瀏覽器開 http://localhost:7657 就可以進入 I2P 的控制台頁面了。

仿照上面再做一個 batch 把上面的 7657 都改成 4444,然後把瀏覽器的 proxy 設到 localhost 4444,這樣就可以去逛 .i2p 虛擬網域下的網站,當然前提是得等你的 I2P 網路先 bootstrap 完成。
如果你覺得這樣切換很麻煩,可以考慮寫個 proxy.pac 餵給瀏覽器吃,遇到 .i2p 就走 proxy,否則就直連。
當然如果你不想透過遠端主機來連接 I2P 網路,你可以在本機上也安裝一個,這樣直接走 localhost 4444 就能出去,只是你本機橋接遠端 localhost:7657 的 port 就得改一下。

剛進入 I2P Router Console 會看到這樣的畫面:
i2p-01
點下面的 Configure Bandwidth 就能進入這個畫面開始做各種設定:
i2p-02
這設定原則上是根據你 ISP 給你的頻寬大小來設,但裡面能填寫的數字有上限,如果你是對稱 1Gbps 的網路,你就填一個可填的最大值吧。
Share 的 % 數是你想要貢獻給整個 I2P 網路的比例,設定成 0% 的話,你就不會成為中繼點,但這樣做很不好,總之自己選個適當的 % 數吧。
再來切到 Network 分頁:
i2p-04
你同時有 IPv4 和 IPv6 位址的話基本上都會偵測到,總之把想要用的選起來,IPv4 和 IPv6 誰優先也選好,大致上就差不多了。
如果你很信賴自動偵測機制,也可以什麼都不動,但我的個性就是喜歡去手動設。
其餘設定可以自己逛,FreeBSD 剛裝完其實不是最新的這個 0.9.16-0 版,去 Update 分頁那邊看看就知道怎麼升級,可以不用再透過 ports。

再來要去點左上方 I2P INTERNALS 標題下方那堆小字裡的 Addressbook,然後切到 Subscriptions 分頁去加一些網址:
i2p-03
至於要加什麼,可以參考官方的 FAQ:I'm missing lots of hosts in my addressbook. What are some good subscription links?
如果要和上圖一樣的設定,可以複製下面的內容:

相關的說明當你點進 Addressbook 以後,應該在 Overview 分頁裡就已經簡單瞭解到它是怎麼運作的了。
在 I2P 的世界裡其實並沒有所謂的網域註冊商存在,所以看上面網址的檔名就知道,那些文字檔和 /etc/hosts 的作用其實是相似的。
如果你去開來看,就會發現裡面是 hostname=base64 的結構,譬如:
blog.tinlans.i2p=ilnPp7mxILdEie5x6B-obyVn07Q3JLuWWsTfDlGGupAyFg3hw5tr-YyiAf6DxatMuO0fQpuLCsF2~z0U1DImCEfnMlBtGKYpiIgjcY3UiwDEkPhU8tQp-9Dcxshk0weaSaDOxSVb906EBGxxLmURasWvyUKAt~3djZuEXDivISbT8TTzpwnj1Oi3NLGpsip~ej8IAAWhmmlTtSBdWyBGdWXFTv9D~4OwtDQdvoChZcCC-Nw-luQmcL1pIiWDZqSIzB6lZG6pmPddrHxi9KuRSM18-KXTgRyZSz5ppRPnrU383hndCwBgKxLSHJcyLEtmJH9pr334jQsoyrt3y5986v-n9FepPziC22g2UxSSmIB3fYGohi-QhNdQpdX3GMkBeoZn5M~r~KC5nAEcZQNP1PvtWcUcPbUufrc~Dt0wqledtqzwEu7e9vTIOdxmJbnIGq5kBWnbDDPoBkElx0y3mDZVE4joEMhJUiqUAqGb3Cys6aVq8GWAIJ8cgy8eNecDBQAEAAEAAA==
base64 的部分類似 clearnet 中的 IP 位址,而你只要將這樣的紀錄加入 address book 中,就可以將它對應成左邊的 blog.tinlans.i2p。

在 I2P 的生態系裡沒有所謂的 DNS 服務,每個人可以各自維護自己的 address book,所以難免會有所衝突。
當生態回歸原始的時候,當然就是比誰早到,還有誰的拳頭比較大,可以讓大家都聽他的話了。
這生態系公認的大家長是 stats.i2p,因為大部分的人都訂閱他家的 address book,所以只要跟他註冊成功,就能將其廣泛散佈。
其它幾個 address book 訂閱服務提供者之間其實也有培養默契,彼此之間會互相進行同步,所以實質上的生態和 clearnet 中沒有差太多。
只是因為在匿名網路下你無法證明你是你,所以一旦註冊成功,幾乎每家都不允許你再做修改,而且幾乎都是人工審核,效率十分低落。

隨著你的 address book 內容越來越豐富,你可以探索的 I2P 網路範圍就越大,否則的話有很多謎之網址你是開不起來的,因為你沒有對應的 base64 或 base32 位址。
這邊提到的 base32 位址是可以從 base64 轉換過來的,這是為了可以提供像 .onion 網域那樣提供較短的網址,譬如 ylkch2nkrwehakx4z6wiyjbeqwlgasknukdkex6r6yq4xusrjnda.b32.i2p 就是本站的 base32 位址。
由於大部分的 address book 訂閱服務提供者都會禁止一些非法網站跟他們註冊,或者要求討論區之類的網站訂定符合他們要求的英文版規章,所以你會發現很多網站的網址是這種 b32 網址,而沒有簡短易記的名稱。
其中也有一些會提供你 address helper,或者讓你點一個連結就能將他們網址加入 address book 中。
這類網站要不就是站長很懶得跟那些 address book 訂閱服務提供者打交道,要不就是非常地下化的犯罪網站,這應該很容易判斷才對。

基礎設定就到此為止,再來說明怎麼架設 eepsite,也就是 I2P 網路下的 deep web site。
I2P 安裝完成以後其實就有一個預設的 eepsite,但預設並沒有啟動,實際上你也不見得需要啟動它,除非你想寫 JSP 或者做一些特別的事。
其實架設方法自己看說明照著做就會了,照一開始的方式去橋接 localhost:7658 再用瀏覽器打開,你就會看到這一頁:
i2p-05
現在你應該知道為什麼我一直很懶得講了,因為上面都已經講得差不多了,雖然有些內容已經過時,譬如 local destination 結尾已不必然是 AAAA。

回到左邊欄 I2P INTERNALS 下面那串小字,這次是點 I2PTunnel,然後你就會在右半邊的 I2P Server Tunnels 裡看到預設的 I2P webserver。
上面那張圖裡教的就是叫你進去改它然後啟動它,這樣你就有了一個基本的 eepsite 了,但如果你不熟 jetty 且不想玩 JSP 的話,我會建議你橋接回一般的 http daemon。
如果你不想用改的,另外造一個也很簡單,New Server Tunnel 選成 HTTP,然後點 Create 就可以了:
i2p-06
再來就是填寫最上面的設定,比較重要的也只有 Website Name 和 Private key file:
i2p-07
Website Name 就是你想要的 i2p 網址,這個可以去 address book 的 Router 分頁做查詢看看有沒有衝突,以免之後無法去註冊。
Private key file 你就選個名字,因為是新建的,所以等下按了 Save 按鈕後會自己造出來。
Local destination 也是等下按了 Save 按鈕會自己造出來的,留空就好。
Auto start 當然是要勾上了,除非你是想每次重開機以後再自己手動過來開,或者想要避風頭,不然實在找不到理由不勾。
Target Host 這邊填寫的 IP 和 port,就是你 http daemon 要 listen 的 IP 和 port。
至於 http daemon 的設定檔,除了 server name 或 alias 要把 Website Name 的網址加上外,還必須加上等下提到的 base32 位址。
在按下 Save 之前,最下面那個 Signature type 建議也可以照需求選一下,不過目前支援 DSA-SHA1 以外的就 stats.i2p 一家,這家的 TOS 又特別嚴,可以自己根據網站性質考量看看。

按完 Save 以後再回到這頁,會發現 Local destination 出現了一大串字,那個就是 base64 位址,點右邊的「Add to local addressbook」加入 private address book。
加入成功後,你就會在 address book 的 private 分頁看到你這間 eepsite 的網址了,同時也有個 b32 的連結,可以取得 base32 位址。
如果你不想去找任何 address book 訂閱服務的提供者註冊,那麼可以只發佈 b32 的連結出去,其實逛習慣 .onion 網域的人也不算太難適應這些。
當然你也可以仿照剛剛那個「Add to local addressbook」的連結格式,做一個方便你訪客把你網址加入 master address book 的連結,不一定非要去找誰註冊不可。
譬如本站的話可以做成這種連結:
http://127.0.0.1:7657/susidns/addressbook.jsp?book=master&hostname=blog.tinlans.i2p&destination=ilnPp7mxILdEie5x6B-obyVn07Q3JLuWWsTfDlGGupAyFg3hw5tr-YyiAf6DxatMuO0fQpuLCsF2~z0U1DImCEfnMlBtGKYpiIgjcY3UiwDEkPhU8tQp-9Dcxshk0weaSaDOxSVb906EBGxxLmURasWvyUKAt~3djZuEXDivISbT8TTzpwnj1Oi3NLGpsip~ej8IAAWhmmlTtSBdWyBGdWXFTv9D~4OwtDQdvoChZcCC-Nw-luQmcL1pIiWDZqSIzB6lZG6pmPddrHxi9KuRSM18-KXTgRyZSz5ppRPnrU383hndCwBgKxLSHJcyLEtmJH9pr334jQsoyrt3y5986v-n9FepPziC22g2UxSSmIB3fYGohi-QhNdQpdX3GMkBeoZn5M~r~KC5nAEcZQNP1PvtWcUcPbUufrc~Dt0wqledtqzwEu7e9vTIOdxmJbnIGq5kBWnbDDPoBkElx0y3mDZVE4joEMhJUiqUAqGb3Cys6aVq8GWAIJ8cgy8eNecDBQAEAAEAAA==#add

如果你是有心要經營,而且是合法的站台,可以直接到這裡註冊:http://stats.i2p/i2p/addkey.html
不過必須詳讀他的 TOS,不要看都不看就送出申請,很容易被打槍:
i2p-08
一個大前提就是你的網站必須要有內容,再來就是不能有他不准的東西,特定性質的網站必須照他規定做。
再來就是要有耐心,不要等一兩天沒看到他審過就重新申請,那是純人工審閱,請至少耐心等個 3 ~ 5 天。
一旦註冊通過,在這頁就會出現你申請的網址:http://stats.i2p/cgi-bin/newhosts.cgi
如果過幾天後看到當年度的 rejected 數字增加,自己的網址又沒被加上去,那就是違反了什麼他的規矩吧。