I2P 隧道配置 ======================== 概述 -------- `tunnels.conf` 旨在支持多个 I2P 隧道。配置文件在类 Unix 系统上必须位于 `~/.i2pd`(按用户)或 `/var/lib/i2pd`(系统范围),在 Windows 上必须位于 `%APPDATA%/i2pd`(按用户)。 该文件使用 .ini 文件格式。它由多个具有唯一名称的节组成。 隧道类型 ------------ 节的类型由参数 type 指定。 可用的隧道类型: Type | Description ------------- | -------------------------------------- client | 到远程 I2P 目标的客户端隧道(TCP) server | 在 I2P 网络中设置任意 TCP 服务的通用服务器隧道 http | 在 I2P 中设置网站的 HTTP 服务器隧道 irc | 在 I2P 中设置 IRC 服务器的 IRC 服务器隧道 udpclient | 将本地 UDP 端点转发到远程 I2P 目标 udpserver | 将来自 N 个 I2P 目标的流量转发到本地 UDP 端点 socks | 用于使用 I2P 的自定义 Socks 代理服务 httpproxy | 用于使用 I2P 的自定义 HTTP 代理服务 签名类型 ------------ 在隧道配置中使用参数 `signaturetype = `。 可用的签名类型: Type | Code | Comment ------------------------------------ | ---- | ----------- DSA-SHA1 | 0 | 已弃用 ECDSA-P256 | 1 | 无(正在使用) ECDSA-P384 | 2 | 无(正在使用) ECDSA-P521 | 3 | 无(正在使用) RSA-2048-SHA256 | 4 | 已弃用 RSA-3072-SHA384 | 5 | 已弃用 RSA-4096-SHA512 | 6 | 已弃用 ED25519-SHA512 | 7 | 默认 *ED25519ph-SHA512* | 8 | 未实现 GOSTR3410-A-GOSTR3411-256 | 9 | 与 Java 路由器不兼容 GOSTR3410-TC26-A-GOSTR3411-512 | 10 | 与 Java 路由器不兼容 RED25519-SHA512 | 11 | 用于密钥盲化(加密 LeaseSet) ML-DSA-44 | 12 | 后量子 LeaseSet ------------ 可用的 LeaseSet 类型(在隧道配置中参数 `i2cp.leaseSetType = `): Type | Code | Comment ----------- | ---- | ----------- OLD | 1 | 已弃用 STANDARD | 3 | 默认 ENCRYPTED | 5 | 加密 LeaseSet。对 floodfill 隐藏信息 META | 7 | 未实现 0、2、4、6 类型保留给路由器(RouterInfo 类型)。 可用的 LeaseSet 加密类型(在隧道配置中参数 `i2cp.leaseSetEncType = `): Type | Code | Comment ------------------------------------ | ---- | ----------- ELGAMAL | 0 | 默认(仅用于兼容旧路由器) ECIES_P256_SHA256_AES256CBC | 1 | 与 Java 路由器不兼容 *ECIES_P384_SHA384_AES256CBC* | 2 | 未实现 *ECIES_P521_SHA512_AES256CBC* | 3 | 未实现 ECIES_X25519_AEAD | 4 | 默认 客户端隧道 -------------- 助记:我们可以以客户端身份连接到某人 每个客户端隧道必须包含一些必需参数,以及一些可选参数。 以下是一个客户端隧道的示例: ```ini [irc-out] type = client address = 127.0.0.1 port = 6668 destination = irc.ilita.i2p keys = irc.dat ``` 如果 keys 为空,则每次重启都会创建临时密钥。如果未找到密钥文件,将创建新密钥并存储到指定文件中。 如果 keys 以 transient 开头,将创建新密钥,但不会存储到文件中。 如果密钥文件包含相同的身份,客户端隧道可以共享同一个本地目标。 可选参数: Option | Description --------------------|-------------------- address | 隧道绑定的本地接口,“127.0.0.1”表示仅允许来自本地主机的连接,“0.0.0.0”表示允许来自任何地方的连接。(默认:127.0.0.1) port | 客户端隧道的端口。 signaturetype | 新密钥的签名类型。RSA 签名(4、5、6)不被允许,将会被改为 7。(默认:7) cryptotype | 新密钥的加密类型。实验性。应始终为 0 destinationport | 连接到目标上的特定端口。默认 0(指向目标端服务器侧的第一个隧道) keepaliveinterval | 以秒为单位,在此间隔后向目标发送 ping。(默认:0 - 不发送 ping) keys | 目标的密钥。当多个隧道相同,则每个隧道都会使用相同的目标。 因此,基于上述示例,如果你在本地主机上连接到 127.0.0.1:6668,i2pd 会将该连接通过隧道转发到 irc.ilita.i2p。 服务器/通用隧道 ---------------------- 助记:我们在网络中向他人提供某项服务 以下是一个服务器隧道的示例: ```ini [smtp-in] type = server host = 127.0.0.1 port = 25 keys = smtp-in.dat ``` 如果 keys 为空,则每次重启都会创建临时密钥。如果未找到 keys 文件,将创建新密钥并存储到指定文件中。 将从 keys 文件中加载目标地址,并发布该地址的 LeaseSet。 服务器隧道必须使用其自己的目标,例如主机 127.0.0.1 和端口 80。 port 是(非 I2P)IP 主机上 TCP 监听端口,本地目标监听后会连接到该端口。 此隧道类型应适用于除 HTTP 之外的任何协议,即使是带 SSL 加密的 HTTP(HTTPS)也用这个。 可选参数: Option | Description --------------------|-------------------- host | 服务器的 IP 地址(i2pd 会将来自 I2P 的数据发送到此地址) port | 服务器隧道的端口。 inport |(非 TCP 非 UDP)I2P 本地目标监听的端口;一个无符号 16 位整数。服务器隧道在本地目标上监听的端口(默认:与 port 相同) accesslist | 允许连接的以逗号分隔的 b32 地址列表(不带 .b32.i2p)。默认允许所有人 gzip | 若设为 false 则关闭内部压缩。(默认:false) signaturetype | 新密钥的签名类型。(默认:7) cryptotype | 新密钥的加密类型。实验性。应始终为 0 enableuniquelocal | 若为 true,连接到本地地址将显示为 127.x.x.x,其中 x.x.x 为传入连接对端 ident hash 的前 3 个字节。(默认:IPv4 为 true,IPv6 为 false) address | 隧道连接到 host 时所使用的本地接口 IP 地址。通常不使用 keys | 目标的密钥。当多个隧道相同,则每个隧道都会使用相同的目标。 服务器/HTTP 隧道 ------------------- http 隧道的配置与常规服务器隧道相同,但必须将 'Host:' 字段设置为配置中提供的地址。必要时 i2pd 也会解析它。 以下是一个 http 隧道的示例: ```ini [http-in] type = http host = 127.0.0.1 port = 80 keys = our-website.dat ``` 可选参数: Option | Description --------------------|-------------------- hostoverride | 在 'Host:' 头中发送的值,默认:与 host 参数相同 ssl | 对上游服务器使用 SSL 连接。可使用 `hostoverride` 参数设置 SNI 域。默认:false(自 2.44.0 起) 服务器/IRC 隧道 ------------------- IRC 隧道应通过 WEBIRC 连接到 IRC 服务器。它将 IP 地址(通常是 127.0.0.1)替换为用户的 .b32 I2P 地址。 可选参数: Option | Description --------------------|-------------------- webircpassword | 与 WEBIRC 命令一起发送的密码 UDP 隧道 ----------- UDP 隧道有两种类型:`udpclient` 和 `udpserver` `udpclient` 将 1 个本地 UDP 端点转发到 1 个远程 I2P 目标 ```ini [openvpn-client-simple] type = udpclient destination = something.b32.i2p port = 1194 ``` Option | Description --------------------|-------------------- destination | udpserver 隧道的 I2P 目标,必需参数 address | 绑定本地 UDP 端点的 IP 地址(默认:`127.0.0.1`) port | 绑定本地 UDP 端点的端口,必需参数 gzip | 若设为 false 则关闭内部压缩。(默认:false) keys | 目标的密钥。当多个隧道相同,则每个隧道都会使用相同的目标。 `udpserver` 将来自 N 个 I2P 目标的流量转发到 1 个本地 UDP 端点 ```ini [openvpn-simple-server] type = udpserver keys = openvpn.dat host = 127.0.0.1 port = 1194 ``` Option | Description --------------------|-------------------- address | 用于本地 UDP 端点的 IP 地址(默认:`127.0.0.1`) host | 要转发流量到的 IP 地址,必需参数 port | 要转发流量使用的 UDP 端口,必需参数 gzip | 若设为 false 则关闭内部压缩。(默认:false) keys | 目标的密钥。当多个隧道相同,则每个隧道都会使用相同的目标。 Socks 代理 ----------- 可以在 `tunnels.conf` 中定义 SOCKS 代理接口。 以下是一个 Socks 代理示例: ```ini [alt-socks] type = socks address = 127.0.0.1 port = 14447 keys = socks-keys.dat ``` Option | Description --------------------|-------------------- address | Socks 代理绑定的本地地址(默认:`127.0.0.1`) port | Socks 代理绑定的 TCP 端口 I2CP 参数 --------------- 这些 I2CP 参数对所有隧道类型通用,用于指定本地目标的设置。 Parameter | Description ------------------------------|-------------------- inbound.length | 入站隧道的跳数。默认 3,最大 8;数值越低越快,但去匿名风险越高 outbound.length | 出站隧道的跳数。默认 3,最大 8;数值越低越快,但去匿名风险越高 inbound.quantity | 入站隧道的数量。默认 5,最大 16 outbound.quantity | 出站隧道的数量。默认 5,最大 16 inbound.lengthVariance | 入站隧道随机增减的跳数,范围 -3 到 3。默认 0(自 2.42.0 起) outbound.lengthVariance | 出站隧道随机增减的跳数,范围 -3 到 3。默认 0(自 2.42.0 起) crypto.tagsToSend | 要发送的 ElGamal/AES 标签数量。默认 40;值过低可能导致隧道构建问题 crypto.ratchet.inboundTags | 每个标签集可生成的入站标签最大数量(默认:800) explicitPeers | 以逗号分隔的对等方 b64 地址列表(默认:未设置) i2p.streaming.initialAckDelay | 在发送 Ack 之前等待的毫秒数。(默认:200) i2p.streaming.answerPings | 启用发送 pong。1 或 true,0 或 false(默认:1) i2p.streaming.maxOutboundSpeed| 流的最大出站速度(字节/秒)。(默认:1730000000) i2p.streaming.maxInboundSpeed | 流的最大入站速度(字节/秒)。(默认:1730000000) i2p.streaming.profile | 带宽使用配置。1 - 批量(高),2 - 交互(低)。(默认:1) i2p.streaming.maxConcurrentStreams | 同时存在的流总数量上限。(默认:2048) i2p.streaming.maxWindowSize | 流的最大窗口大小(默认:512) i2p.streaming.dontSign | 在需要时不包含签名。仅当对端不验证签名时才启用(默认:false) i2cp.leaseSetType | 要发送的 LeaseSet 类型。1、3 或 5。(默认:3) i2cp.leaseSetEncType | 用于 LeaseSet 类型 3 或 5 的加密类型(逗号分隔)。(默认:0,4) i2cp.leaseSetPrivKey | 加密 LeaseSet 的解密密钥,base64。PSK 或私有 DH i2cp.leaseSetAuthType | 加密 LeaseSet 的认证类型。0 - 无认证(默认),1 - DH,2 - PSK i2cp.leaseSetClient.dh.nnn | 客户端名:客户端的公有 DH(base64),用于认证类型 1,nnn 为整数 i2cp.leaseSetClient.psk.nnn | 客户端名:客户端的 PSK(base64),用于认证类型 2,nnn 为整数 i2cp.dontPublishLeaseSet | 若设为 true 则不发布 LeaseSet。(默认:false) 其他示例 -------------- ```ini # 出站隧道示例,连接到远程服务 # 必需参数: # * type -- 始终为 "client" # * port -- 本地监听端口 # * destination -- I2P 主机名 # 可选参数(可省略) # * keys -- 我们的身份;若未设置,每次启动都会生成, # 若已设置且文件缺失,将生成密钥并写入该文件 # * address -- 绑定的本地接口 # * signaturetype -- 新目标的签名类型。0(DSA/SHA1)、1(EcDSA/SHA256)或 7(EdDSA/SHA512) [IRC] type = client address = 127.0.0.1 port = 6668 destination = irc.ilita.i2p keys = irc-keys.dat # # 入站隧道示例,用于本地服务 # 必需参数: # * type -- "server" 或 "http" # * host -- 我们服务的 IP 地址 # * port -- 我们服务的端口 # * keys -- I2P 中该地址的 LeaseSet 文件 # 可选参数(可省略) # * inport -- 可选,I2P 服务端口;若未设置,与 'port' 相同 # * accesslist -- 允许连接的 I2P 地址的逗号分隔列表, # 每个地址为 b32,且不含 '.b32.i2p' 部分 [LOCALSITE] type = http host = 127.0.0.1 port = 80 keys = site-keys.dat # [IRC-SERVER] type = server host = 127.0.0.1 port = 6667 keys = irc.dat ```