问题背景:
为了给云服务器增加一个外网IP,实现单主机多 IP 部署,或者在一个CVM上接入到多个私有网络中,我们可以通过绑定弹性网卡的方式实现。但是绑定弹性网卡后,要从外部进行访问时,就需要正确的配置弹性IP及策略路由。
如果没有正确配置时,流量会根据子机内部的路由表的default路由对外发送,导致流出时的“路径”与入流量的“路径”不一致,导致被拒绝。
来,我们一起开始核对下是否有漏掉策略路由配置时的某些关键步骤!
1.首先需要检查我们的弹性网卡是否已经正确绑定到子机
我们可以在云服务器控制台中确认是否有绑定弹性网卡,从服务器列表点击服务器的实例ID,进入实例详情页
点击弹性网卡面板查看是否有“弹性网卡”,以及是否绑定了公网IP(EIP)
或者进入到系统内部,通过 ip address 命令查看是否有新的网卡
2.检查是否正确配置内网IP到弹性网卡中
打开您的弹性网卡控制台,确认您弹性网卡的MAC地址,并点击IPv4地址管理,确认内网IP的地址
并且到云服务器CVM中对比是否正确配置内网IP到该MAC地址的网卡中,同样的可以通过 ip address 命令查看网卡上的ip,注意确定MAC地址是否一致
如果不一致,可以对比一下网卡的配置文件,是否有不正确的地方
Centos7系统一般存放在"/etc/sysconfig/network-scripts"目录,保存在 ifcfg-网卡名称 文件。
代码语言:javascript复制DEVICE='eth1' # 此处填写ip address中查看到的需配置的弹性网卡名称,请根据实际填写
NM_CONTROLLED='yes'
ONBOOT='yes'
IPADDR='192.168.1.62' # 此处填写弹性网卡上的内网IP地址,请根据实际填写
NETMASK='255.255.255.0' # 此处填写子网掩码,请根据实际填写
#GATEWAY='192.168.1.1' # 默认以eth0作为默认网关,如果需要使用弹性网卡作为主网关,可以在取消此处注释
修正配置文件后可以通过命令 systemctl restart network (Centos 7) 重启网络服务
3.检查是否有设置策略路由表文件
为了使我们的流量从哪个网卡进入,就需要使用iproute2组件的策略路由,配置文件一般为 "/etc/iproute2/rt_tables"。
我们需要在该文件中新增两个表,格式为"表的代号 表名",其中表的代号需要在255以下,但是0/253-255已经作为预留表,我们可用的为1-252。此处我以"10 eth0"/"20 eth1"作为例子。
代码语言:javascript复制#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
10 eth0
20 eth1
确认此处已配置好后,我们保存文件即可。
4.检查是否有将每个网卡的默认网关增加到策略路由表
配置好策略路由表后,我们需要针对每个网卡确认是否配置好该网卡的默认路由到策略路由表中
首先检查默认路由表,通过命令 ip route show
然后需要检查table 10的路由表是否有配置,通过命令 ip route show table 10
额哦,这里没有输出,可没有配置好,我们通过命令行配置下。
代码语言:txt复制ip route add default dev [网关名 如eth0] via [该网卡的网关 如172.16.0.1] table [策略路由表的代号 如10]
设置正确的效果如下:
可以看到策略路由表10,已经有eth0网卡的默认路由
同样的我们要检查表20,也就是eth1网卡,弹性网卡的默认路由
此处的配置只能临时保存,如果我们需要保证重启服务器或重启网络服务后,无需繁琐地再人工配置一次,我们可以利用网卡配置文件把策略保存下来
如果在使用Centos7系统,我们来到"/etc/sysconfig/network-scripts"目录,编辑一个文件 route-网卡名 (如route-eth0)
代码语言:javascript复制vim /etc/sysconfig/network-scripts/route-eth0
default dev [网卡名 如eth0] via [该网卡的网关 如172.16.0.1] table [策略路由表的代号 如10]
对的,很简单,只需要写一行即可,"目标(default) dev 网卡 via 网关 table 路由表代号"
写好后 systemctl restart network 重启网络测试下
Great!
在此处,特别需要注意的点是:
1.每个table都需要检查,因为不同的table设置了不同网卡的默认路由
2.一定要确认网关与网卡名,是否一致的,很容易敲错命令,将eth0的网关配置到eth1上。
5.检查是否配置策略路由规则
在配置好上面这些步骤,我们的系统就已经能知道哪个路由表该走哪个网关出去了,但是还不知道某个网卡来的流量,要到哪个路由表上,下面我们就一起来检查下。
首先我们查看下现有的规则
代码语言:javascript复制# ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
很明显的,这里仅有我们一些默认的路由表,接下来一起进行配置
代码语言:javascript复制ip rule add from [主网卡的ip] table [主网卡的策略路由表代号]
ip rule add from [弹性网卡的ip] table [弹性网卡的策略路由表代号]
可以看到 ip rule list 命令已经有对应规则了,到此策略路由配置完成,可以尝试ping一下两个外网ip
成功了,我们可以在另一个主机上,成功的ping通两个外网ip!
同样的,ip rule add命令,仅能临时生效,我们还是需要写入到配置文件中。
我们来到"/etc/sysconfig/network-scripts"目录,编辑一个文件 rule-网卡名 (如route-eth0)
代码语言:javascript复制vim /etc/sysconfig/network-scripts/rule-eth0
from [网卡的ip] table [网卡的策略路由表代号]
配置好后我们测试下重启网络服务
能自动的完成路由和规则添加!
在此处,特别需要注意的点是:
一定要确认该处是需要指定我们的网卡ip,而不是网关ip,以及是否加到了对应的table中。