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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章