如何绑定非本地IPv6地址?

是否有相当于ipv6的net.ipv4.ip_nonlocal_bind? 需要启动我的nginx启动这样一个IP …

尽pipe有这个/ 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后几秒钟运行/etc/init.d/nginx restart启动才能使其正常工作: – /

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

net.ipv6.ip_nonlocal_bind sysctl是在内核4.3中添加的,所以如果你正在运行一个更加net.ipv6.ip_nonlocal_bind系统,你现在可以直接用sysctl来解决这个问题,而不是解决初始化脚本hack的问题。

延迟很可能是由于IPv6重复地址检测 。 把它closures(当然)会打破标准,但是你可以尝试将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' 

当然,另一种select是只绑定到:: :(IPv6全零或任何IPv6地址)和防火墙closures服务的接口,不应该暴露它。

您可以简单地在Loopback接口上configuration一个静态的IPv6地址表项。 这将允许nginx监听IP / PORT,即使它在eth0上还没有可用的地址。

手册:

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

configuration文件:

 # File: '/etc/network/interfaces' auto lo iface lo inet loopback iface lo inet6 static address 2001:db8::ffff:1 netmask 64 

由于似乎没有这样的ipv6的内核参数,你可以破解nginx的初始化脚本,并添加:

 grep -q eth0 /etc/network/run/ifstate || ifup eth0 

在启动nginx之前的某个地方?

或者,因为您似乎使用debian或者derivatice,您可以尝试在insserv包的帮助下通过依赖重新sortinginit脚本,并通过在/etc/default/rcS设置variablesCONCURENCY=makefile来切换到并行初始化脚本lauchning /etc/default/rcS (如果您使用Debian Squeeze,这是默认configuration)。

在这篇文章开始的四年里,我确信你已经解决了你的问题,但是我最终在这里试图find一个解决scheme,在一个启用systemd的CentOS 7系统上启动nginx,也许这会帮助别人。

我的nginx会在IPv4和IPv6联网前出现,导致它无法启动并保持closures状态。 RedHat有一个错误,系统在'after'network-online.target之前设置了IPv6,所以在执行nginx之前,它可以绑定到它的configuration中的IPv6地址。

不幸的是,由于这是一个bug,我唯一的select是在nginx的systemd服务定义中引入一个sleep调用,以便在IPv6启动时足够长的睡眠时间。