Hmc blog

Linux无法监听ifconfig里没有的IP地址

2020-04-16 · 2 min read
运维

当一台云服务器拥有两块网卡时,我们期望一个服务(Nginx)监听在网卡A公网IP的80端口,而另外一个服务监听在网卡B公网IP的80端口上。

像往常一样,修改每个服务的配置为监听指定公网IP,默认情况下,在实际操作中两个服务至少有一个服务启动失败。

假设使用的是阿里云的云服务器(其他云服务商可能也有这个共性),网卡A上的公网IP是创建ECS时分配的公网IP,网卡B是后续绑定的弹性网卡,并且绑定了弹性公网IP。在这台服务器上执行ifconfig命令,发现没有公网IP,仅显示了两个内网IP。这个问题导致了服务绑定不上公网IP。原因是创建ECS时分配的公网IP在ECS内是不可见的,而弹性公网IP的可见性由其绑定模式决定,修改绑定模式可以让弹性公网IP在ECS内可见。
所以在最好的情况下,这台服务器执行ifconfig会显示两个内网IP跟一个公网IP。还有一个公网IP不可见就不能正常运行我们的两个服务。
要解决这个问题只需要在/etc/sysctl.conf文件里增加一行配置:

net.ipv4.ip_nonlocal_bind = 1

这个配置1表示内核允许绑定非本地存在的IP地址,反之默认为0不允许。
再执行

sysctl -p

重新加载内核文件。
再启动两个服务就能正常运行了。