Linux绑定IP与net.ipv4.ip_nonlocal_bind不存在

时间:2020-01-09 10:41:15  来源:igfitidea点击:

如何允许Linux进程绑定到Linux系统或服务器上尚不存在的IP地址?
您需要设置net.ipv4.ip_nonlocal_bind,它允许进程将bind()绑定到非本地IP地址,这对于诸如Nginx,HAProxy,keepalived等负载平衡器的应用程序非常有用。
本教程说明如何使用net.ipv4.ip_nonlocal_bind Linux内核选项绑定不存在的IP地址。

为什么在Linux操作系统下使用net.ipv4.ip_nonlocal_bind?

HAProxy充当负载平衡器(LB)和基于TCP和HTTP的应用程序的代理服务器。
同样,Keepalived软件使用VRRP协议为Linux提供了高可用性(HA)和负载平衡功能。
它充当IP故障转移(虚拟IP)软件,将流量路由到正确的后端。
我们可以将HAProxy(或Nginx)与Keepalived结合使用,为我们的应用程序构建一个两节点高可用性集群。

但是,HAPorxy,Nginx和Keepalived中的LB需要具有绑定到非本地IP地址的能力。
问题是我们可以一次将一个IP(虚拟IP)地址分配给一个节点。
因此,其他运行Nginx/HAProxy的节点将拒绝启动。
您通常会看到如下错误:

Nginx:无法绑定套接字。

我们希望允许正在运行的LB实例绑定到非本地的IP,以进行故障转移。

net.ipv4.ip_nonlocal_bind不存在的Linux绑定IP

使用sysctl命令查找net.ipv4.ip_nonlocal_bind的当前值:

# sysctl net.ipv4.ip_nonlocal_bind
# sysctl net.ipv6.ip_nonlocal_bind

我们也可以如下使用cat命令:

cat /proc/sys/net/ipv4/ip_nonlocal_bind

要绑定Linux下尚不存在的IP,请运行:

sudo sysctl -w net.ipv4.ip_nonlocal_bind=1

Linux绑定IP net.ipv4.ip_nonlocal_bind

我们也可以使用以下语法:

echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind

对于IPv6:

sudo sysctl -w net.ipv6.ip_nonlocal_bind=1

永久绑定到Linux中的非本地IP地址

编辑/etc/sysctl.conf或/etc/sysctl.d/99-custom.conf

sudo vi /etc/sysctl.d/99-custom.conf

追加以下行:

## allow Nginx to start and bind to non local IP ##
net.ipv4.ip_nonlocal_bind=1

保存并关闭文件。
要加载更改,请运行:

sudo sysctl -f /etc/sysctl.d/99-custom.conf

了解sysctl命令选项

-w选项允许将值写入Linux内核变量。

-a选项显示所有变量。
有关更多信息,请执行以下man命令:

man sysctl

或者

sysctl --help

输出示例:

Options:
  -a, --all            display all variables
  -A                   alias of -a
  -X                   alias of -a
      --deprecated     include deprecated parameters to listing
  -b, --binary         print value without new line
  -e, --ignore         ignore unknown variables errors
  -N, --names          print variable names without values
  -n, --values         print only values of a variables
  -p, --load[=<file>]  read values from file
  -f                   alias of -p
      --system         read values from all system directories
  -r, --pattern <expression>
                       select setting that match expression
  -q, --quiet          do not echo variable set
  -w, --write          enable writing a value to variable
  -o                   does nothing
  -x                   does nothing
  -d                   alias of -h
 
-h, --help     display this help and exit
-V, --version  output version information and exit

总结

您学习了如何将net.ipv4.ip_nonlocal_bind设置为1,以在Linux下配置高可用负载均衡器(LB)。