Linux 使用 net.ipv4.ip_nonlocal_bind 绑定不存在的 IP
您需要设置net. ipv4 .ip_nonlocal_bind和net. ipv6 .ip_nonlocal_bind ,这允许进程将 bind() 到非本地 IP 地址,这对于诸如 Nginx、HAProxy、keepalived、WireGuard、OpenVPN 等负载均衡器等应用程序非常有用。本页介绍如何使用net. ipv4 .ip_nonlocal_bind和net. ipv6 .ip_nonlocal_bind Linux 内核选项绑定不存在的 IP 地址。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 是的 |
要求 | Linux 终端 |
类别 | 系统管理 |
操作系统兼容性 | Alma • Alpine • Amazon Linux • Arch • CentOS • Debian • Fedora • Linux • Mint • openSUSE • Pop!_OS • RHEL • Rocky • Stream • SUSE • Ubuntu |
预计阅读时间 | 4 分钟 |
为什么在Linux操作系统下使用net.ipv4.ip_nonlocal_bind?
HAProxy 充当基于 TCP 和 HTTP 的应用程序的负载均衡器 (LB) 和代理服务器。同样,Keepalived 软件使用 VRRP 协议为 Linux 提供高可用性 (HA) 和负载平衡功能。它充当 IP 故障转移(虚拟 IP)软件,将流量路由到正确的后端。我们可以将 HAProxy(或 Nginx)与 Keepalived 结合起来,为我们的应用程序构建一个双节点高可用性集群。
但是,HAPorxy、Nginx 和 Keepalived 中的 LB 需要绑定到非本地 IP 地址的能力。问题是我们可以一次将一个 IP(虚拟 IP)地址分配给一个节点。因此运行 Nginx/HAProxy 的其他节点将拒绝启动。您经常会看到以下错误:
Nginx:无法绑定套接字。
我们希望允许正在运行的 LB 实例绑定到非本地的 IP 以实现故障转移。
Linux 使用 net.ipv4.ip_nonlocal_bind 绑定不存在的 IP
使用 sysctl 命令查找net.ipv4.ip_nonlocal_bind的当前值。例如,下面是如何显示 IPv4 和 IPv6 值:
我们也可以使用cat 命令,如下所示:
要在 Linux 下绑定尚不存在的 IP,请运行:
# sysctl net.ipv4.ip_nonlocal_bind
# sysctl net.ipv6.ip_nonlocal_bind
# cat /proc/sys/net/ipv4/ip_nonlocal_bind
$ 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 地址
使用文本编辑器(例如 vim/nano)编辑/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 IPv4 and IPv6 ## net.ipv4.ip_nonlocal_bind=1 net.ipv6.ip_nonlocal_bind=1按ESC++:和键保存并关闭文件wq!。要加载更改,[Enter]请运行以下 sysctl 命令:
$ sudo sysctl -f /etc/sysctl.d/99-custom.conf
如果需要在重启自动完成后启动或重新启动服务怎么办?
将它们放入/etc/rc.local文件中。例如:
#!/bin/sh # add your commands # call your scripts here # Restart the postfix because of LXD interface takes too much time to come # online on AWS EC2 VM and postfix fails as lxdbr0 IP wasn't available to Postfix for binding /bin/sleep 180 && /bin/systemctl restart postfix.service # last line must be exit 0 exit 0
有关详细信息,请参阅“如何在启动 Linux 系统时启用 systemd 上的 /etc/rc.local shell 脚本”
了解 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
有关更多信息,请参阅“如何在 Linux 上重新加载 sysctl.conf 变量”。
结论
您学习了如何将 net.ipv4.ip_nonlocal_bind 设置为 1,以在 Linux 下配置高可用性负载均衡器 (LB)。有关更多信息,请参阅“使用 KeepAlived 处理 nginx 故障转移”和 Linux 内核文档。