Linux:在非本机IP地址监听
最常见的场景是:
双机部署 nginx + keepalived(vip = virtual ip)实现高可用,对外提供的服务地址是 keepalived 配置的VIP。
出于安全考虑,要求 nginx 只能在 VIP 上监听服务端口。
但是VIP只会浮动在双机中的一个,另一个主机没有 VIP,不能创建监听服务。
此时可以通过修改内核配置参数,允许应用程序(nginx)在当前主机没有的IP上创建监听服务。
我自己的这类场景也类似:
由于某种原因,我要创建的监听服务,只能是在 VIP 上创建,但是其他主机也要启动应用程序在 VIP (虽然其他主机暂时没有 VIP )上创建。
默认情况下:
[root@localhost ~]# ip a | grep "inet\s"
inet 127.0.0.1/8 scope host lo
inet 192.168.75.138/24 brd 192.168.75.255 scope global dynamic noprefixroute ens33
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
我可以在 192.168.75.138 这个本地IP上创建监听服务:
[root@localhost ~]# nc -l 192.168.75.138 8080
(阻塞监听)
[root@localhost ~]# netstat -an | grep 8080
tcp 0 0 192.168.75.138:8080 0.0.0.0:* LISTEN
当我尝试在本机监听 192.168.35.139 上创建监听服务:
[root@localhost ~]# nc -l 192.168.75.139 8080
Ncat: bind to 192.168.75.139:8080: Cannot assign requested address. QUITTING.
因为本机没有 192.168.35.139 这个IP资源,因此创建监听服务失败。
修改内核参数
修改配置文件:
[root@localhost ~]# echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
加载配置文件:
[root@localhost ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
再次常见监听非本机IP地址的服务:
[root@localhost ~]# nc -l 192.168.75.139 8080
(阻塞监听)
查看监听情况:
[root@localhost ~]# ip a | grep "inet\s"
inet 127.0.0.1/8 scope host lo
inet 192.168.75.138/24 brd 192.168.75.255 scope global dynamic noprefixroute ens33
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
[root@localhost ~]# netstat -anp | grep 8080
tcp 0 0 192.168.75.139:8080 0.0.0.0:* LISTEN 39451/nc
关于 sysctl 更多请参考:
https://blog.csdn.net/test1280/article/details/106560899
其他参考:
1.https://blog.csdn.net/ygh3110001606/article/details/104669343/
2.https://blog.csdn.net/weixin_33836874/article/details/86315918