Linux:在非本机IP地址监听

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值