Как связать нелокальный адрес IPv6?
Есть ли эквивалент для net.ipv4.ip_nonlocal_bind для ipv6? Нужно запустить мой nginx при загрузке на таком IP...
Мой Ubuntu не имеет этого IPv6, назначенного на eth0 достаточно быстро, несмотря на этот /etc/network/interface:
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
через несколько секунд после загрузки, чтобы все заработало: - /
NB: 1: 2: 3: 4:: 5 используется здесь только для демонстрации, у меня есть действительный IPv6-адрес на моем сервере.
5 ответов
net.ipv6.ip_nonlocal_bind
sysctl был добавлен в ядро 4.3, поэтому, если вы используете более современную систему, теперь вы можете решить эту проблему непосредственно с помощью sysctl, вместо того, чтобы обойти проблему с хаки сценариев инициализации.
Задержка наиболее вероятна из-за обнаружения дублированного адреса IPv6. Отключение этого (конечно) нарушит стандарт, но вы можете попробовать установить net.ipv6.conf.eth0.dad_transmits
до 0 (по умолчанию 1 в моей системе Ubuntu):
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) и брандмауэр отключает службу на интерфейсах, которые не должны ее предоставлять.
Вы можете просто настроить запись статического 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
Поскольку кажется, что для ipv6 такого параметра ядра нет, вы можете взломать сценарий инициализации nginx и добавить:
grep -q eth0 /etc/network/run/ifstate || ifup eth0
где-то перед командой запуска nginx?
Или, поскольку вы, похоже, используете debian или производную, вы можете попытаться изменить порядок своих сценариев инициализации по зависимости с помощью пакета. insserv
и переключиться на параллельный запуск сценария инициализации, установив переменную CONCURENCY=makefile
в /etc/default/rcS
(если вы используете Debian Squeeze, это конфигурация по умолчанию).
Я уверен, что вы решили свою проблему в течение последних четырех лет с момента начала этой публикации, но я остановился здесь, пытаясь найти решение для запуска nginx в системе CentOS 7 с поддержкой systemd с похожими проблемами, поэтому возможно, это поможет другим.
Мой nginx должен был появиться до того, как сеть для IPv4 и IPv6 была запущена, из-за чего он не запускался и оставался выключенным. RedHat имеет ошибку, из-за которой systemd 'After' network-online.target устанавливается до запуска IPv6, поэтому nginx выполняется до того, как он сможет связываться с адресами IPv6 в своей конфигурации.
К сожалению, поскольку это ошибка, мой единственный вариант заключался в том, чтобы ввести спящий вызов в определение службы systemd для nginx, чтобы при загрузке он спал достаточно долго, чтобы работала IPv6.