Как связать нелокальный адрес 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.

Другие вопросы по тегам