为EC2添加多个EIP公网地址并通过路由指定网络出口

一、前言

每个虚拟机(AWS叫EC2实例)默认都是有1个VPC内的私网IP,如果需要的话,可以为虚拟机绑定公网IP,在AWS上叫Elastic IP,简称EIP。一般情况下,一个虚拟机就绑定一个EIP。如果出现了需要在一个EC2实例上用多个EIP的场景,那么可以通过不同的方式实现。

二、实现方式

多EIP的实现方式有两种:

方式一:一个EC2实例1个网卡(AWS叫ENI),1个网卡上多个EIP。

方式二:一个EC2实例多个网卡,每个网卡1个EIP。

这两种实现方式,都受到EIP实例规格的限制。不过实例规格,可以接入的网卡和IP数量不一样。参考网址如下。

https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI

相关限制见截图。

这两种实现方式都可以实现1个EC2实例上多个EIP。如果是做堡垒机、跳板机、防火墙等跨多个subnet,分别接入不同网络的场景,就建议做方式二,使用多个network interface,即多个ENI网卡。如果是做爬虫等对外部网络访问需要多IP的,用方式一就可以了,即EC2实例只需要一个网卡,然后绑定多个EIP。

默认情况下,1个EC2实例只有1个网卡,且只有一个内网IP。这时候,绑定第一个EIP会报告成功,当绑定第二个EIP时候,就会把第一个踢下来,也就说绑不上去了。这里要采取的办法是,给这个网卡添加多个辅助IP,辅助IP是在本VPC内的私有IP,和虚拟机当前接入的subnet是一个网段的地址。每个辅助IP可以在额外绑定一个EIP。

因此,汇总如下,如果希望1个EC2绑定4个EIP,那么就要在EC2默认的网卡上,额外增加3个辅助IP,加上原来的内网IP,总计4个内网IP,然后绑定4个EIP公网IP。问题解决。

三、添加多个辅助IP并绑定EIP

1、首先找到要修改的EC2实例,选中之,点击“操作”,下拉框中选择“管理IP地址”,如下截图所示。

2、在弹出的对话框里边,选择Assign New IP,即可增加这块网卡对应的辅助IP(内网)。如下截图。

3、本次测试先使用4个EIP,因此对应的要增加3个新的辅助IP。IP地址可以手工也可以DHCP。建议都默认DHCP。如下截图,数量已经达到4。

在上边的截图中,可能有人会问这些IP不是一个网段啊,出了C类网段范围了。是的,这是因为这个子网设置为 172.31.16.0/20,子网掩码是/20而不是大家习惯的/24。因此,上图中看起来哪些乱七八糟的私网IP,其实还是在同一个网段。

4、分配多个辅助IP完成后,我们去EC2实例上,登录上去看下。执行ifconfig命令,发现并没有看到多出来的IP地址。如下截图。

5、如上截图的原因是,我们是选择的单网卡多IP的实现方式,因此网卡还就是eth0一个的。

接下来,可以用ip address 命令可以看到额外的IP。这里可以先重启下网络服务,然后执行 ip addr,即可看到额外添加的IP地址了。如下截图。

6、辅助IP好了,我们继续来分配EIP。首先要多申请几个EIP,在EIP界面下,点击申请就可以获得了。

7、申请完成之后,获得了一系列公网IP。

这里可以看到,公网IP在一个Region内,是不连续的,这样方便业务上使用。例如爬虫业务等,互相不连续,较好的模拟随机访问。

如下截图为公网IP清单。

8、接下来要将公网IP绑定到对应的EC2实例上。

在EIP界面,选中一个EIP,然后从“Actions”菜单下,选择“分配地址”按钮。如下截图。

9、在弹出的绑定EIP界面,首先选择要绑定的对象是“Instance”,即虚拟机EC2实例。

选择的时候,如果EC2实例很多,可能会看不太清楚对应关系,由此可以事先在EC2管理界面上设置友好显示名称。然后再回来EIP绑定界面,看起来“Name”这一列都是友好显示名称,就方便设置了。如下截图的红色框中都是预设好的友好显示名称。

10、在绑定EIP界面,选择好实例后,继续选择对应的私网IP(包含1个默认私网,3个辅助IP,总计4个私网IP)

注意,绑定关系必须是1对1。因此要看准确了顺序,一对一绑定。目前还不能批量绑定,需要一次手工选一个。如下截图。

11、好的,一番折腾后,绑定好四个,如下截图,每个私有IP都对应1个EIP。如下截图。

12、验证绑定成功。

刚才的界面,是在EIP管理界面下,把EIP绑定到内网IP。现在我们通过EC2实例的虚拟机管理界面,确认下绑定是否成功。

在EC2界面下,找到对应EC2实例,选中之,点击“操作”,下拉框中选择“管理IP地址”,然后可以看到私有IP和EIP已经绑定好了。如下截图。

四、验证对外使用不同的EIP访问

1、验证准备。

为了验证新绑定的公网IP可以独立工作,我们模拟一个环境,在当前Region之外的两地,分别创建两个EC2实例,这两个EC2实例的地址不同。然后,从本机,挑选出来一个对应关系,指定某个EIP出口和目标地址的关系。

暂定对外访问策略如下截图。

上边这张图的意思是,我们要模拟一个访问规则,去3.95.16.0/24这个网段,最终对外的流量是从18.140.74.97这个EIP流出去的。然后,去往18.216.148.0/24这个网段,流量是从18.140.46.229这个EIP流出去的。

2、模拟策略路由的iptables NAT规则。

为了模拟这种场景,我们写一个简单的iptables NAT规则。

注意,这里需要谨慎,规则不正确可能导致虚拟机断网!请事先做好备份!

规则编写如下截图。

这个规则里边的备注部分,就标记出来希望的网络流量和对应关系。可复制的文本如下。

# Generated by iptables-save v1.4.21 on Thu Aug 29 07:11:57 2019
*nat
:PREROUTING ACCEPT [4:180]
:INPUT ACCEPT [4:180]
:OUTPUT ACCEPT [16:1197]
:POSTROUTING ACCEPT [15:1137]

# Viginia, target=3.95.16.63
# private ip 172.31.24.26->18.140.74.97
-A POSTROUTING -s 172.31.16.0/20 -d 3.95.16.0/24 -j SNAT --to-source 172.31.24.26

# Ohio, target=18.216.148.234
# private ip 182.31.21.231->18.140.46.229
-A POSTROUTING -s 172.31.16.0/20 -d 18.216.148.0/24 -j SNAT --to-source 172.31.21.231

COMMIT
# Completed on Thu Aug 29 07:11:57 2019

现在要把这个iptables规则导入进来。通过iptables-restore命令执行。导入后,可以执行iptables-save命令验证下导入是否成功。

3、验证访问。

从本机,发起SSH链接,到第一个IP是3.95.16.0/24网段的节点。登录之后,我们可以检查自己的来源IP,看是不是多个EIP里边我们希望的那个出口地址。

如上截图的红色框部分确认,去往3.96.16.0/24网段的,是我们预期要使用的18.140.74.97这个EIP出口。

接下来测试另一个。在登录18.216.148.0/24网段的服务器,然后检查自己的来源IP地址。如下截图。

如上截图表示,当访问18.216.148.0/24网段的机器时候,使用的是18.140.46.229这个EIP作为出口。

由此测试成功,表明选择两个EIP分别作为不同网段的出口工作正常。

五、小结

本文测试了在一个EC2上,使用1个默认网卡,通过添加多个辅助IP的方法,绑定多个EIP。同时,使用iptables NAT策略模拟了不同路径的对外访问。以上信息来自于官网手册中的说明,仅供参考。

全文完。