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

Как в Linux я могу автоматически назначить IPv6-адрес интерфейсу на основе его IPv4-адреса во время загрузки?

На машине CentOS 6 у меня есть сервер с двумя сетевыми адаптерами: eth0 и eth1. eth0 имеет адрес 192.168.0.1.

Я хотел бы создать сценарий, который анализирует IP-адрес eth0 и назначает похожий IPv6-адрес на eth1 во время загрузки.

В этом случае я бы хотел, чтобы у eth1 был адрес fc00 :: 192: 168: 0: 1/64.

Я знаю, что чтобы назначить этот адрес, мне нужно запустить команду

ip address add fc00::192:168:0:1/64 dev eth1

Однако я пытаюсь найти способ вычислить IP-адрес, который будет назначен eth1, на основе IP-адреса eth0 и запустить этот скрипт во время загрузки.

Причина, по которой я делаю это вместо статического назначения адресов обоим интерфейсам, заключается в том, что я пытаюсь превратить этот сервер в шаблон виртуальной машины и автоматически развернуть его с новыми настройками IP. К сожалению, инструмент, который я использую, на самом деле не поддерживает IPv6.

Думаю, мой вопрос состоит из двух частей:

Не уверен, что это даже хорошая идея, но осторожно, я бы сделал что-то вроде:

hexip='fe80::'
ip=$(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1 | sed 's/\./:/g')
hexip="${hexip}${ip}"

ip address add "$hexip/64" dev eth1 

Он нужен вам в каком-нибудь файле запуска, который запускается после уровня запуска 3. Думаю, /etc/rc.local подойдет?

Фактически вы можете просто добавить к своему IPv4-адресу префикс IPv6; IPv6 поддерживает такую ​​смешанную нотацию. 2001: 0DB8 :: 192.168.1.1 - это вполне допустимый IPv6-адрес, нет необходимости преобразовывать его в шестнадцатеричный формат или заменять точки.

Конечно, вы хотите проверить это - то, что это действительный IP-адрес, не означает, что CentOS обрабатывает его правильно.

Не ответ на ваш вопрос, а несколько советов от человека, имеющего большой опыт работы с IPv6 ...

Эта идея может показаться полезной, но на практике гораздо проще, например, просто возьмите последнюю часть IPv4-адреса и настройте ее вручную в ifcfg-eth0.

Одна из моих машин 83.247.10.7, а подсеть IPv6, в которой он находится, 2001:9e0:803::/64. Этот механизм даст ему 2001:9e0:803:0:83:247:10:7. Я просто даю это 2001:9e0:803::7 вручную. Намного проще :) Вот мой ifcfg-eth0:

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes

IPADDR=83.247.10.7
NETMASK=255.255.255.224

IPV6INIT=yes
IPV6ADDR=2001:9e0:803::7/64

Эти две лишние строчки вас не убьют и намного лучше, чем какой-нибудь скрипт, который пытается сделать что-то столь тривиальное автоматически.

Ваш пример в вопросе использует fc00:: это несуществующая подсеть, которую вы не увидите в реальной жизни, и поэтому идея выглядит неплохо. С реальными адресами эта идея не сильно поможет, а может, и усугубит ситуацию ...

Одно предложение по возможному улучшению.

Извлеките биты подсети и биты идентификатора хоста из адреса IPv4. Используйте биты идентификатора хоста в качестве смещения для хоста IPv6; используйте биты подсети в качестве поиска некоторой карты для использования соответствующего префикса IPv6. Таким образом, вы можете гибко согласовывать топологию вашей сети.

Но на самом деле все это должно быть частью решения IPAM, а виртуальные машины должны использовать DHCP и DHCPv6 для получения своей адресации. Но поскольку это виртуальное устройство, возможно, оно полагается на инфраструктуру, которой вы не можете ожидать.