在不使用 ec2-net-utils 的情况下,如何配置操作系统中的接口?
我需要配置大约 18 个公共 IP,以便在单个 EC2 实例上访问。每个公共 IP 都需要绑定到实例上的单个内部 IP。我配置了 2 个 ENI,并配备了必要的弹性 IP,这些都已连接到实例,但我无法让操作系统识别 ENI。
我一直在关注本教程但无法弄清楚如何扩展它以配置每个接口的多个 IP。此外,根据这个问题关于正确的做法是什么。
如果有人能给我指明正确的方向,我将不胜感激。我几乎在这上面浪费了两天时间!
以下是详细信息:
- 操作系统:Centos 7
- ENI1:辅助私有 IP = [10.0.1.97 ...10.0.1.106]
- ENI2:辅助私有 IP = [10.0.1.218 ... 10.0.1.226]
- VPC 网关 10.0.1.1
答案1
由于之前的答案比较杂乱,我将再提供一个带有工作流程的答案,只需使用 AWS CLI(您可以使用 AWS SDK 编写微调自动化脚本)(http://docs.aws.amazon.com/cli/latest/userguide/installing.html)
- 使用私有 IP 创建 ENI。(aws ec2 创建网络接口)记下 ENI ID
- 为VPC分配EIP。(aws ec2 分配地址 --域 vpc)记下 EIP-id
- 将 EIP 链接到 ENI-id,指向正确的私有 IP(aws ec2 关联地址)
- 创建或启动 EC2 实例,附加到 ENI。(aws ec2 附加网络接口)
一旦您将所有脚本放到位,使用适当的 ENI 重新创建 EC2 实例只需几分钟。
(更新后的答案如下)在 Linux 中,要为一个接口分配多个 IP 地址,正确的分配方法是向物理接口添加额外的 IP 地址。对于 ubuntu 等,对于第一个接口,它类似于 eth0:0、eth0:1,对于后续接口,则类似于 eth1:0、eth1:1。
这对于 Centos 来说稍有不同。
enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether ....
inet 192.168.1.150/24 brd 192.168.1.255 scope global enp0s3
inet 192.168.1.151/24 brd 192.168.1.255 scope global secondary enp0s3
inet 192.168.1.152/24 brd 192.168.1.255 scope global secondary enp0s3
所以正确的文档应该是这个。 http://www.unixmen.com/linux-basics-assign-multiple-ip-addresses-single-network-interface-card-centos-7/
简而言之,Centos 将自动为每个接口创建一个网络接口文件。只需转到 /etc/sysconfig/network-scripts/ 并检查每个文件名是否为 ifcfg-eth*(不要问我为什么上面的链接显示 enp0)。棘手的部分是您的 Centos 是否强制使用 NetworkManager,并且您必须按照 centos 文档 wiki.centos.org/FAQ/CentOS7 的要求进行配置
因此,您应该看到 m3.xlarge 至少有 4 个接口文件,例如 /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1 /etc/sysconfig/network-scripts/ifcfg-eth2 /etc/sysconfig/network-scripts/ifcfg-eth3
由于主界面应该正在运行,它会提示您正在运行的实例 IP 地址。因此,如果您打开 /etc/sysconfig/network-scripts/ifcfg-eth0,如果实例配置为 IP 10.0.1.10,您应该会看到此信息
IPADDR0="10.0.1.10"
要添加更多 IP 地址,只需按照 unixmen 链接所述操作即可,即
IPADDR1="10.0.1.97"
IPADDR2="10.0.1.98"
IPADDR3="10.0.1.99"
然后打开 ifcfg-eth1、ifcfg-eth2、ifcfg-eth3 并重复该任务。完成后,使用“systemctl restart network”重新启动。(备份所有配置文件,以便将来覆盖该文件)
接下来,您将使用路由部分。只需打印出您的 VPC 路由表和子网。现在在 /etc/sysconfig/network-scripts/ 中,您将处理 route-ethX,即 route-eth0、route-eth1、route-eth2、route-eth3。这意味着,您必须了解自己的网络才能配置此部分(应显示在您的 VPC 布局中)。由于您只提到了一个 VPC 网关 10.0.1.1,因此对于所有 route-* 文件,它应该是这样的
# I just assume your put all your 10.0.1.x in the CIDR /24 segments
#
# file route-eth0
# Assume your first ENI IP address is 10.0.1.10
# format : default via gateway-ip dev dev-name table route-table-number
default via 10.0.1.1 dev eth0 table 0
# format : network cidr dev dev-name src ENI-intrace-IP route-table-number
10.0.1.0/24 dev eth0 src 10.0.1.10 table 0
# file route-eth1
# Assume your 2nd ENI IP address is 10.0.1.11
default via 10.0.1.1 dev eth1 table 1
10.0.1.0/24 dev eth1 src 10.0.1.15 table 1
# file route-eth2
# Assume your 2nd ENI IP address is 10.0.1.12
default via 10.0.1.1 dev eth1 table 2
10.0.1.0/24 dev eth2 src 10.0.1.12 table 2
然后你按照你提到的文档说明,在 /etc/sysconfig/network-scripts 中创建一个 rule-ethX ,即 rule-eth0,rule-eth1 1. 增加表号以匹配 route-ethX 2. 将 IP 更改为 ENI 分配的内部网络地址。
# file rule-eth0 ,but as the doc suggest, you should skip this file.
# format : from ENI_IP/CIDR table <table_number>
from 10.0.1.10/32 table 0
#file rule-eth1
from 10.0.1.11/32 table 1
你应该使用本地 Vmware/virtualbox 虚拟网络适配器来设置 Centos 网络。这样你就不用担心突然
答案2
@mootmoot 的回答帮助我解决了这个问题,但为了完整起见,下面是最终让我完成工作配置的步骤。我相信有更好的方法可以做到这一点,但万一其他人也遇到困难...
我对 /etc/sysconfig/network-scripts 中的文件做了以下修改
我把接口定义在ifcfg-eth0单独并添加别名如下:
ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
USERCTL="yes"
PEERDNS="yes"
IPV6INIT="no"
DEFROUTE="no"
IPADDR0="10.0.1.XXX"
PREFIX0="24"
其中 10.0.1.XXX 是第一个次要的ENI 上的地址(主地址仍由 dhcp 配置,如默认地址中所述)ifcfg-eth0文件)
继续添加ifcfg-eth0:X文件,直到 ENI 中的所有 IP 都指定为止。
然后在文件中定义第二个设备ifcfg-eth1使用与上面的 eth0 别名和 ENI 的主 IP 地址相同的模板。
然后添加别名eth1通过定义名为ifcfg-eth1:0等等,如上所述。
定义以下路线文件:
路由-eth0
default via 10.0.1.1 dev eth0 table 1
路由-eth1
default via 10.0.1.1 dev eth1 table 2
其中 10.0.1.1 是 VPC 网关的地址
然后我需要为 eth2 中的所有 IP 和 eth1 中的所有辅助 IP 定义规则,如下所示:
规则-eth0
from 10.0.1.106 lookup 1
from 10.0.1.105 lookup 1
... etc
规则-eth1
from 10.0.1.41 lookup 1
from 10.0.1.226 lookup 1
... etc
我还添加了行
GATEWAYDEV=eth0
到 /etc/sysconfig/networking
希望这能帮助处于类似情况的人,感谢您的所有建议。
答案3
首先,我将始终检查 AWS EC2 网络接口限制。(参考:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)
例如,如果您创建 c1.medium 实例,则每个接口不能使用超过 2 个 ENI 和超过 6 个 IP 地址。如果您尝试在操作系统中创建 20 个虚拟网络接口,则会失败。
我不确定您要将 1 个公共 IP 绑定到 1 个内部 IP 的原因,除非您打算迁移到 IPv6,否则请将 ELB 放在 EC2 实例前面以将 IPv6 包装到 IPv4。 (因为 EC2 不支持 IPv6)
但是看看 AWS VPC 的设置方式,你不能像在物理服务器箱中使用 Centos 那样,你可以使它变得灵活,比如 eth0:0、eth0:1、...、eth0:20,
不幸的是,AWS ENI 和网络接口的情况并非如此。AWS 似乎为各个“私有 IP 地址”分配了唯一的 MAC。因此有限的私有 IP 与接口绑定。如上所述,您只能在 c1.medium 创建 2 个网络接口,每个接口最多有 6 个私有 IP。
(参考:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/MultipleIP.html)
您需要按照 AWS VPC 的方式思考,而不是物理机器可能提供的灵活方式。例如一些极端情况:
- VPC :CIDR 和实例 IP 地址必须相关。例如 10.1.0.0/19。连接依赖于 AWS VPC 路由表。
- 物理服务器和网络:您可以将多个 CIDR 用于所有机器。例如,一台服务器可以有 1 个网络接口,其 IP 地址来自两个或更多 CIDR,例如 10.1.0.0/19、172.16.0.0/19。eth0:1 10.1.0.15 eht0:2 172.16.7.15。您可以设置/添加/删除自己的路由。
看来您需要根据 AWS VPC 方式重新设计您的网络基础设施。
你可能会问,如果考虑弹性 IP 会怎么样?好吧,VPC 的 EIP 限制是 5。请记住,公共 IP 地址很少。也许用多个域来分割应用程序使用是一个更好的主意。
(更新)将公共 IP 地址与私有 IP 关联。(尝试使用 AWS cli 或 aws sdk 脚本,以便您可以使用脚本重新创建实例)
- 创建 EC2 实例,为每个网络接口分配多个私有 IP
- 进入VPC-Elastic IP,分配弹性IP
- 转到新分配的弹性 IP,选择关联,可以选择附加到特定的 EIP 和私有 IP 地址。
由于 aws 将每个 VPC 的 EIP 限制设置为 5,因此您需要检查软限制是否已提高。要进行测试,只需尝试分配 18 个 EIP,并指向单个私有 IP 地址。
您无法在 Centos 实例内分配 EIP。EIP 选项位于 EC2 和/或 VPC 控制台下。