---
layout: post
title: i2pd在服务器上的使用体验
tags: [i2p, 隐私, 网络]
---

  Java果不其然是垃圾😁，i2p还是得靠其他语言支撑！<!--more-->    

# 起因
  前几天[我在服务器上体验了Tor](/2022/11/16/tor.html)，让我的代理在访问互联网的同时也能访问洋葱网络上的网站。其实我整完这个之后也想整出能访问i2p的功能，只是我之前体验了下官方的I2P客户端，体验不是一般的差，再加上还是Java写的，导致我对i2p的印象不怎么好。   
  不过最近我看到有一个使用C++实现的i2p，叫[i2pd](https://github.com/PurpleI2P/i2pd)。其他先不说，只要不是Java写的首先加一分，闭着眼睛都知道它的体验一定比官方的Java I2P体验要好得多。随后我就按照官网的文档在我的服务器上安装了一下。   

# 探索过程
  安装完成之后使用也非常的简单，虽然它也有Web管理界面，但是为了安全我的服务器上开了几层防火墙，也懒得配置所以也没有登进去看一眼。不过使用还是相当简单的，它和官方的I2P一样也是可以直接用4444端口的HTTP代理连接隐形网络，为了能让我的电脑也能上，我也在我的v2ray配置文件基于上次写的照猫画虎的加了几句规则：   
```json
{
  "log": {
    "loglevel": "warning"
  },
  "routing": {
    "domainStrategy": "AsIs",
    "strategy": "rules",
    "settings": {
      "rules": [
        {
          "type": "field",
          "domain": [
            "regexp:\\.onion$"
          ],
          "outboundTag": "tor"
        },
        {
          "type": "field",
          "domain": [
            "regexp:\\.i2p$"
          ],
          "outboundTag": "i2p"
        },
        {
          "type": "field",
          "outboundTag": "block",
          "protocol": [
            "bittorrent"
          ]
        }
      ]
    }
  },

  "inbounds": [
    {
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      },
      "listen": "/dev/shm/proxy.sock",
      "protocol": "vless",
      "settings": {
        "udp": false,
        "clients": [
          {
            "id": "***",
            "alterId": 0,
            "flow": ""
          }
        ],
        "decryption": "none",
        "allowTransparent": false
      },
      "streamSettings": {
        "network": "ws",
        "security": "none",
        "wsSettings": {
          "path": "***",
          "headers": {
            "Host": "***"
          }
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    },
    {
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "127.0.0.1",
            "port": 9050
          }
        ]
      },
      "tag": "tor"
    },
    {
      "protocol": "http",
      "settings": {
        "servers": [
          {
            "address": "127.0.0.1",
            "port": 4444
          }
        ]
      },
      "tag": "i2p"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}
```
  顺便再提醒一下，这样的配置**不能**匿名，仅仅是一种更方便访问隐形网络的方式，如果有匿名需要，建议使用Firefox或者Tor浏览器，安装I2P的插件并设置相应的代理，或者使用[i2pdbrowser](https://github.com/PurpleI2P/i2pdbrowser)（也是基于Firefox的）。   
  另外如果只是访问还有一种更加不匿名的方式，i2p也有类似tor2web那样的东西，不过很少，我找了一圈只找到了[i2phides.me](https://i2phides.me/)可以用。当然也是强烈不推荐的，在不知明细的情况下使用这种东西是会被中间人攻击+记录访问日志的。   
  配置好之后试着用电脑上了一下，体验相当好，比之前在手机和电脑上安装的官方的I2P Java客户端速度快多了，随便开了几个网站感觉甚至比上次配置的Tor速度还快，不过这可能只是延迟比较低，之后我找了几个文件下载Tor的实际网速还是更快一些，I2P虽然感觉延迟低但是实际下载速度也只有1Mb/s左右。   
# 建站体验
  隐形网络比洋葱网络感觉更好的一点大概就是它有一套自己的域名解析系统，洋葱网络访问的时候基本上没办法记忆，想整个好看的域名还得算。隐形网络的话有了域名解析系统就可以不用花大力气去算vanity address了。不过我搞这个也算是玩了，算一个也挺好。想整的话可以用i2pd提供的一套工具[i2pd-tools](https://github.com/PurpleI2P/i2pd-tools)，里面有个叫vain的工具可以用来算vanity address。不过实际上试了一下感觉没有Tor里的[mkp224o](https://github.com/cathugger/mkp224o)好用，速度慢是一方面，比较离谱的是它还能计算出错，6位以下的自定义字母倒是能正常计算，6位以上的就会计算错误，好不容易计算出一个，结果检验的时候报“bad key file format”……看那个仓库好像人家也不怎么想解决的样子，大概也因为有域名解析系统的原因，网上也没有其他人开发这样的程序……   
  算好喜欢的私钥之后，就可以进行建站了，他们这个配置文件感觉比Tor客户端的要好，配置也很简单，按照[i2pd的文档](https://i2pd.readthedocs.io/en/latest/tutorials/http/#host-anonymous-website)就行了，不过他们这个有个缺点就是好像不支持Unix Domain Socket连接，这样我就得再占掉一个端口，比较令人遗憾……另外这个私钥官方没有说放到哪里，我找了一下，需要放到“/var/lib/i2pd/”路径下，这个应该是它以服务形式启动之后默认的工作目录。   
  配置好之后网站就可以访问了，不过既然它有域名解析系统，还是免费的，肯定还是要注册一个的。注册也很简单，上面提到的i2pd-tools里面有个regaddr程序，把自己想要的域名和私钥按照说明传进去，把输出的结果粘贴到 <http://reg.i2p/add> 或者 <http://stats.i2p/i2p/addkey.html> 里面，然后过段时间等他们收录了之后就可以使用了。

# 感想
  虽然i2pd的体验还不错，不过也许是官方使用的是Java编写的客户端，导致用户量很少，网站也非常少，以致于感觉访问i2p的网站都似乎失去了意义……不像洋葱网络那样，随便搜一搜就能找到互联网肯定找不到的东西。 ~~（所以Java什么时候死啊😂）~~
