На машине 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 для получения своей адресации. Но поскольку это виртуальное устройство, возможно, оно полагается на инфраструктуру, которой вы не можете ожидать.