AWS NIC 配置

AWS NIC 配置

我正在尝试为特定用例设置 EC2 实例。为此,我将需要 2 个具有公开 IP 地址的 ENI。(两者都应该可以 ping 通)

到目前为止我已经完成以下步骤:

  • 连接来自同一子网的 2 个网络接口
  • 运行实例
  • 创建了 2 个弹性 IP 地址,附加到实例的每个 ENI 卡上。

我可以在 EC2 实例网络接口部分看到以下结果。

公共IP

但我无法 ping 通3.104.193.180

此外我ip address给出了以下结果...

ubuntu@ip-172-31-37-139:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
    link/ether 06:ce:dd:28:5b:b8 brd ff:ff:ff:ff:ff:ff
    inet 172.31.37.139/20 brd 172.31.47.255 scope global dynamic eth0
       valid_lft 3460sec preferred_lft 3460sec
    inet6 fe80::4ce:ddff:fe28:5bb8/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
    link/ether 06:a6:9a:4a:98:c6 brd ff:ff:ff:ff:ff:ff
    inet 172.31.41.29/20 brd 172.31.47.255 scope global dynamic eth1
       valid_lft 3460sec preferred_lft 3460sec
    inet6 fe80::4a6:9aff:fe4a:98c6/64 scope link
       valid_lft forever preferred_lft forever

我的问题是...

  • 我应该怎么做才能让另一个 IP 暴露/可 ping?
  • 我应该如何知道服务器内部的两个弹性 IP?

答案1

要获取与给定接口关联的公共 IP 地址,首先从接口获取 MAC 地址,然后从实例元数据服务 (IMDS) 检索您要查找的信息。因此,在上面的示例中,eth1 具有 MAC 地址06:a6:9a:4a:98:c6,因此您可以使用以下命令获取公共 IPv4 地址:

curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:1d:90:af:65:a3/public-ipv4s

更多信息请参阅AWS 文档

关于您的连接问题,首先,请仔细检查与您的每个 ENI 关联的 VPC 路由、ACL 和安全组配置。这些详细信息很容易配置错误,如果您错过某些内容,可能会导致流量下降。请先检查这些详细信息,然后再回来阅读本文的其余部分。当您有多个 ENI 与一个实例关联时,还会出现另一个更微妙的问题,这可能是您的问题。

AWS VPC 实施了严格的反欺骗保护。这是一件好事,因为它可以保护 AWS 及其客户免于在实例因某种原因受到损害时参与各种形式的网络攻击。但是,在将多个 ENI 附加到实例时,您需要考虑到这一点。

问题是基本路由行为仅由目的地传出数据包的来源。这意味着对传入数据包的响应可能不会通过接收原始数据包的同一接口传输。但对于 VPC,这被视为“欺骗”数据包,因为响应数据包中的源地址与 ENI 关联的任何私有 IP 地址都不匹配。

考虑以下接口配置和路由表:

admin@ip-10-0-0-115:~$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    altname enp0s5
    inet 10.0.0.115/24 brd 10.0.0.255 scope global dynamic ens5
       valid_lft 2801sec preferred_lft 2801sec
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    altname enp0s6
    inet 10.0.0.8/24 brd 10.0.0.255 scope global dynamic ens6
       valid_lft 2889sec preferred_lft 2889sec


admin@ip-10-0-0-115:~$ ip ro
default via 10.0.0.1 dev ens5
10.0.0.0/24 dev ens5 proto kernel scope link src 10.0.0.115
10.0.0.0/24 dev ens6 proto kernel scope link src 10.0.0.8

在本例中,10.0.0.8 是分配给 ens6 的地址。发往此 IP 地址的入站数据包将通过 ens6 接收并按预期处理。但对该数据包的出站响应将根据上述路由表进行路由,并通过 ens5 传出并被 VPC 丢弃。

您可以像这样测试:

admin@ip-10-0-0-115:~$ ip ro get 8.8.8.8 from 10.0.0.8
8.8.8.8 from 10.0.0.8 via 10.0.0.1 dev ens5 uid 1000
    cache

请注意,即使 10.0.0.8 已分配给 ens6,设备也是 ens5!VPC 会丢弃此流量!

为了确保您的数据包由 VPC 传送,您需要实现策略路由。广义上讲,策略路由是指您的系统使用除目的地之外的其他信息来做出路由决策的情况。在这种情况下,您还需要考虑源 IP 地址。我们在这里需要做的是确保任何源地址为 10.0.0.8 的传出数据包都通过 ens6 离开。

Linux 中的策略路由通常使用ip(8)命令进行配置。要使具有上述路由表的实例工作,您需要创建特定于 ens6 的辅助路由表。操作辅助表的工作方式与操作“主”表一样,只是您指定了表 ID。因此,在这种情况下,我们可以像这样添加到本地网络的路由和通过网关到表 10000 的默认路由:

admin@ip-10-0-0-115:~$ sudo ip ro add 10.0.0.0/24 dev ens6 table 10000
admin@ip-10-0-0-115:~$ sudo ip ro add default via 10.0.0.1 table 10000
admin@ip-10-0-0-115:~$ ip ro show table 10000
default via 10.0.0.1 dev ens6
10.0.0.0/24 dev ens6 scope link

并根据下表创建一条规则,以路由从 10.0.0.8 传出的流量:

admin@ip-10-0-0-115:~$ sudo ip rule add from 10.0.0.8/32 table 10000 pref 10000
admin@ip-10-0-0-115:~$ ip rule
0:      from all lookup local
10000:  from 10.0.0.8 lookup 10000
32766:  from all lookup main
32767:  from all lookup default

请注意规则 10000 的存在,表明来自 10.0.0.8 的流量将通过表 10000 进行路由。

我们可以再次确认这一点ip ro get

admin@ip-10-0-0-115:~$ ip ro get 8.8.8.8 from 10.0.0.8
8.8.8.8 from 10.0.0.8 via 10.0.0.1 dev ens6 table 10000 uid 1000
    cache

注意,它是根据表 10000 进行路由,但更重要的是,它将通过设备 ens6 发送!

当您的实例上附加了多个 ENI 时,Amazon Linux 会自动设置这样的策略路由规则。我不知道 Ubuntu 是否这样做,所以您可能需要在这方面做一些研究,并可能针对您的特定情况实施自己的自动化。

相关内容