linux - Corda 4.0 AWS 节点部署问题

标签 linux docker networking amazon-ec2 corda

由于新版本 (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

结果:

  1. Corda 现在强制我在 node.conf 中设置 p2pAddress,然后将其发布到 NMS,并被其他节点用于与其通信。
  2. 我无法设置 EC2 公共(public) IP,因为 Corda 尝试使用该主机名“绑定(bind)”到 NIC,该主机名并未直接暴露给 EC2
  3. 我无法将它设置为 0.0.0.0 以使其绑定(bind)到所有 nic 并监听所有传入路由,因为它们在核心 Node.kt 中硬编码以在提供 0.0.0.0 时停止节点
  4. 我只能设置在外部不可见的容器/主机中可见的ip -> 节点不可达
  5. 我研究过试图欺骗 Docker 网络堆栈,将其本地 ip 表示为外部 ip,因为它是虚拟网络层,但它只为现有 NIC (10.0.x.x IP) 或环回 ip 提供子网划分能力范围(192.168.x.x 或 10.x.x 或 172.x.x.x)
  6. 这篇文章 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/

相关文章:

linux - 了解 Unix 中的 I/O 重定向

angular - 访问在Docker容器中运行的Angular应用

docker - Docker通过存储驱动程序overlay2增加容器的默认存储空间

python - 使用 Python 在 Pi 启动时写入 MySQL 数据库

linux - 如何使子函数的返回导致父函数的返回?

docker - IBM zCX-zCX实例启动时如何自动启动Docker应用程序

linux - 绕过 Linux 集群网关 - 从桌面直接进入节点

java - Java 中的通用 QoS 消息批处理和压缩

c++ - 使网络更改永久化 - C++

linux - 查找列是否在范围内