如何绑定非本地IPv6地址?

如何绑定非本地IPv6地址?

是否有与 net.ipv4.ip_nonlocal_bind 等效的 ipv6 版本?需要在这样的 IP 上启动 nginx...

尽管有这个 /etc/network/interface,但我的 Ubuntu 无法在 eth0 上足够快地分配这个 IPv6:

iface eth0 inet6 static
    address 1:2:3:4::5
    netmask 64

启动过程中:

Starting nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
[emerg]: bind() to [1:2:3:4::5]:80 failed (99: Cannot assign requested address)

我需要/etc/init.d/nginx restart在启动后运行几秒钟才能使其正常工作:-/

注意:1:2:3:4::5 这里仅用于演示,我的服务器上有一个有效的 IPv6 地址。

答案1

sysctlnet.ipv6.ip_nonlocal_bind是在内核 4.3 中添加的,因此如果您运行的是更先进的系统,您现在可以直接使用 sysctl 解决此问题,而不是使用 init 脚本黑客来解决问题。

答案2

延迟很可能是由于IPv6 重复地址检测。关闭此功能(当然)会破坏标准,但您可以尝试设置net.ipv6.conf.eth0.dad_transmits为 0(在我的 Ubuntu 系统上默认为 1):

sysctl -w net.ipv6.conf.eth0.dad_transmits=0

使其永久化:

sudo /bin/bash -c 'echo "net.ipv6.conf.eth0.dad_transmits=0" > /etc/sysctl.d/99-disable-dad-eth0.conf'

当然,另一种选择是仅绑定到::(IPv6 全零,或任何 IPv6 地址)并在不应暴露它的接口上关闭该服务。

答案3

您只需在环回接口上配置一个静态 IPv6 地址条目即可。这将允许 nginx 监听 IP/PORT,即使该地址在 eth0 上尚不可用。

手动的:

/sbin/ip -6 addr add 2001:db8::ffff:1/64 dev lo

配置文件:

# File: '/etc/network/interfaces'

auto lo
iface lo inet loopback

iface lo inet6 static
    address 2001:db8::ffff:1
    netmask 64

答案4

我确信自从这篇文章开始以来,在过去四年中的某个时候你已经解决了你的问题,但我最终在这里尝试找到在启用 systemd 的 CentOS 7 系统上启动 nginx 并遇到类似问题的解决方案,所以也许这会对其他人有所帮助。

我的 nginx 会在 IPv4 和 IPv6 网络启动之前启动,导致它无法启动并保持关闭状态。RedHat 有一个错误,其中 systemd 的“After”network-online.target 是在 IPv6 启动之前设置的,因此 nginx 在绑定到其配置中的 IPv6 地址之前执行。

不幸的是,由于这是一个错误,我唯一的选择是在 nginx 的 systemd 服务定义中引入一个睡眠调用,这样它在启动时就会睡眠足够长的时间,从而启动 IPv6。

相关内容