概述
NTCP2(提案111)在会话请求阶段不拒绝来自不同网络ID的连接。 当前必须在会话确认阶段拒绝连接,当Bob检查Alice的RI时。
同样,SSU在会话请求阶段不拒绝来自不同网络ID的连接。 当前必须在会话确认阶段之后拒绝连接,当Bob检查Alice的RI时。
此提案更改了两种传输的会话请求阶段,以一种向后兼容的方式纳入网络ID。
动机
应当尽快拒绝来自错误网络的连接,并将其对等方列入黑名单。
目标
防止测试网和分叉网络的交叉污染
在NTCP2和SSU握手中添加网络ID
对于NTCP2, 接收方(入站连接)应能够识别网络ID不同, 以便可以将对等方的IP列入黑名单。
对于SSU, 接收方(入站连接)无法在会话请求阶段将其列入黑名单,因为 入站IP可能被伪装。更改握手的加密足够。
防止从错误的网络重新播种
必须向后兼容
非目标
- NTCP 1不再使用,因此不会更改。
设计
对于NTCP2, 对值进行XOR运算只会导致加密失败, 接收方没有足够的信息来将发起者列入黑名单, 因此不推荐这种方法。
对于SSU, 我们将在会话请求中的某个位置对网络ID进行XOR运算。 由于这必须是向后兼容的,我们将XOR运算(id - 2) 因此对于当前网络ID值2,它将是一个无操作。
规范
文档
为有效网络ID值添加以下规范:
| 用途 | NetID编号 |
|---|---|
| 保留 | 0 |
| 保留 | 1 |
| 当前网络(默认) | 2 |
| 保留未来网络 | 3 - 15 |
| 分叉和测试网络 | 16 - 254 |
| 保留 | 255 |
更改默认值的Java I2P配置为"router.networkID=nnn"。 更好地记录这个设置,并鼓励分叉和测试网络将该设置添加到他们的配置中。 鼓励其他实现对这个选项进行实现和文档记录。
NTCP2
在会话请求消息中使用选项(字节0)的第一个保留字节来包含当前为2的网络ID。 它包含网络ID。 如果非零,接收方应检查其与本地网络ID的最低有效字节是否一致。 如果不匹配,接收方应立即断开连接并将发起者的IP列入黑名单。
SSU
对于SSU,在HMAC-MD5计算中加入一个((netid - 2) « 8)的XOR。
现有:
HMAC-MD5(encryptedPayload + IV + (payloadLength ^ protocolVersion), macKey)
'+'表示附加,'^'表示异或。
payloadLength是一个2字节无符号整数
protocolVersion是一个字节0x00
新的:
HMAC-MD5(encryptedPayload + IV + (payloadLength ^ protocolVersion ^ ((netid - 2) << 8)), macKey)
'+'表示附加,'^'表示异或,'<<'表示左移。
payloadLength是一个2字节无符号整数,big endian
protocolVersion是两个字节0x0000,big endian
netid是一个2字节无符号整数,big endian,合法值为2-254
重新播种
在重新获取su3文件时添加一个参数?netid=nnn。 更新重新播种软件以检查netid。如果存在且不等于"2", 应当拒绝获取,并给出错误代码,可能是403。 为重新播种软件添加配置选项,以便为测试或分叉网络配置备用netid。
注意事项
我们无法强制测试网络和分叉更改网络ID。 我们能做的最好的事情是文档记录和沟通。 如果我们确实发现与其他网络的交叉污染,我们应该尝试 联系开发人员或运营者,解释更改网络ID的重要性。
问题
迁移
对于当前的网络ID值2,这是向后兼容的。 如果有人在运行不同网络ID值的网络(测试或其他), 此更改则不向后兼容。 然而,我们不知道有谁在这样做。 如果仅仅是一个测试网络,这不是一个问题,只需同时更新所有路由器。