由于新版本 (Corda 4) 的开发原因,我在升级库后在 Docker 上运行 JVM 进程时遇到了问题,因为到目前为止,我正在设置在 Docker 容器中运行的程序(节点)以监听所有接口(interface) (0.0.0.0) 在 AWS EC2 上以主机模式运行时,会将其绑定(bind)到所有网络接口(interface),监听所有接口(interface)并使用该转发。
现在最近,4,他们编码了https://github.com/corda/corda/blob/061db8b1a1ac1fa9f1a063caf7ce4f009aa283db/node/src/main/kotlin/net/corda/node/internal/Node.kt#L322阻止此功能。
结合 https://docs.corda.net/corda-configuration-file.html
In practice the ArtemisMQ messaging services bind to all local addresses on the specified port. However, note that the host is the included as the advertised entry in the network map. As a result the value listed here must be externally accessible when running nodes across a cluster of machines. If the provided host is unreachable, the node will try to auto-discover its public one.
这导致必须在节点配置中指定公共(public) IP,然后它会尝试绑定(bind)到该 IP,但它不能,因为 EC2 没有可见的公共(public) IP 作为直接网络接口(interface),只有一个内部路由接口(interface)(NIC ),在他们堆栈的后期被转换为公共(public) IP。
AWS EC2 实例 ifconfig:
br-9121696521bd Link encap:Ethernet HWaddr 02:42:56:7C:6A:27
inet addr:172.18.0.1 Bcast:172.18.255.255 Mask:255.255.0.0
...
docker0 Link encap:Ethernet HWaddr 02:42:78:C3:69:1B
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
...
eth0 Link encap:Ethernet HWaddr 02:5F:BE:63:67:82
inet addr:10.0.0.56 Bcast:10.0.0.255 Mask:255.255.255.0
...
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
...
veth0c214d6 Link encap:Ethernet HWaddr BE:2A:29:08:94:B3
inet6 addr: fe80::bc2a:29ff:fe08:94b3/64 Scope:Link
...
veth2b54799 Link encap:Ethernet HWaddr 66:81:E9:01:91:10
inet6 addr: fe80::6481:e9ff:fe01:9110/64 Scope:Link
...
veth60fffa5 Link encap:Ethernet HWaddr 7A:FE:10:33:A9:80
inet6 addr: fe80::78fe:10ff:fe33:a980/64 Scope:Link
...
vethe4f9a9a Link encap:Ethernet HWaddr EE:C7:CB:C8:25:85
inet6 addr: fe80::ecc7:cbff:fec8:2585/64 Scope:Link
结果:
- Corda 现在强制我在 node.conf 中设置 p2pAddress,然后将其发布到 NMS,并被其他节点用于与其通信。
- 我无法设置 EC2 公共(public) IP,因为 Corda 尝试使用该主机名“绑定(bind)”到 NIC,该主机名并未直接暴露给 EC2
- 我无法将它设置为 0.0.0.0 以使其绑定(bind)到所有 nic 并监听所有传入路由,因为它们在核心 Node.kt 中硬编码以在提供 0.0.0.0 时停止节点
- 我只能设置在外部不可见的容器/主机中可见的ip -> 节点不可达
- 我研究过试图欺骗 Docker 网络堆栈,将其本地 ip 表示为外部 ip,因为它是虚拟网络层,但它只为现有 NIC (10.0.x.x IP) 或环回 ip 提供子网划分能力范围(192.168.x.x 或 10.x.x 或 172.x.x.x)
- 这篇文章 Running corda nodes in different machines也恰恰说明了我的问题和我找到的解决方案,他们在 4.0 中关闭了
问题/可能性
选项 1(AWS/Docker):
通过 Docker IPAM/Pipeworks 将欺骗公共(public) IP 作为实际 NIC IP 在 EC2 中可见,或者通过使用虚拟接口(interface)伪装的 IP 伪装成特定于 Linux 的 IP?
选项 2(特定于 Corda):
更改配置以某种方式接受 0.0.0.0 或使 detectPublicIp 更智能并使用 NMS 发现其自己的 IP。我期望它具有这种智能,但后来我发现它只是查看可用的 NIC。它因 AMQ224000 错误而失败。
根据我的理解,Corda 4.0 无法在公共(public)云提供商 (Azure/AWS/GC) 上运行,因为它需要具有公共(public) IP 的 NIC,而 Azure/AWS/GC 可以做到这一点没有可用的,如果我错了,Corda 团队的人可以纠正我吗?
最佳答案
如果我理解正确,内部 Artemis 服务器无法绑定(bind),因为它使用(默认)现在必须是有效公共(public)地址的 p2pAddress。您也可以通过提供 messagingServerAddress 来覆盖它。参见 https://docs.corda.net/corda-configuration-file.html?highlight=messagingserveraddress了解更多详情。
关于linux - Corda 4.0 AWS 节点部署问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55072719/