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