Назад | Перейти на главную страницу

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

В 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 all-zeroes или любой 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 работал.