Я настроил DHCP-сервер для назначения моих клиентов ipv6. Однако ОПЦИИ «маршрутизаторы» и «подсеть» игнорируются.
Я читал, что ipv6 получает их не от DHCP, а от маршрутизатора.
Однако мне это кажется очень странным. Почему он получает статический IP от DHCP, а сетевая маска от маршрутизатора? Странная архитектура.
В любом случае, мне интересно, есть ли способ легко добавить эти «недостающие» функции в DHCPv6 или любую другую работу. Конечным результатом должно быть то, что я могу установить «ip6», «сетевую маску» и «шлюз» из одного центрального места на основе MAC-адреса клиента, точно так же, как я могу сделать с ipv4.
Я не хочу возиться с автоконфигурацией ipv6 и прочим.
Проблему шлюза я мог бы решить «плохим» способом, установив что-либо в событии «up» в конфигурации сети, но я не могу найти способ изменить сетевую маску интерфейса после того, как он был запущен.
Обычно предполагается, что IPv6 получает информацию об IP-адресе, маске сети и маршруте / шлюзе от самого маршрутизатора через «Объявление маршрутизатора» с использованием «Протокола обнаружения соседей».
Это полностью отличается от того, как работает IPv4. Существует так называемый DHCPv6, который, как предполагается, работает как DHCP для ipv6, но не имеет множества функций. Скорее всего, из-за того, как должен работать IPv6.
Однако многие из нас хотят иметь возможность назначать IPv6 нашим клиентам точно так же, как мы это делали бы с IPv4 и DHCP. Это возможно, но требует некоторых усилий.
Первое, что вам нужно сделать, это добавить 3 настраиваемых параметра OPTION к вашему DHCP-серверу.
Если вы используете DHCP-сервер ISC в Linux, ваш файл конфигурации должен выглядеть примерно так:
authoritative;
default-lease-time 86400;
max-lease-time 86400;
log-facility local7;
use-host-decl-names on;
option ipv6-address code 214 = ip6-address;
option ipv6-netmask code 215 = unsigned integer 8;
option ipv6-gateway code 216 = ip6-address;
subnet 88.xxx.xxx.128 netmask 255.255.255.224 {
option domain-name "example.com";
option domain-name-servers 8.8.8.8, 8.8.4.4;
option routers 88.xxx.xxx.128;
option subnet-mask 255.255.255.255;
option ipv6-netmask 112;
}
host ip-88-xxx-xxx-129.example.com {
hardware ethernet 16:xx:xx:xx:b3:8d;
fixed-address 88.xxx.xxx.129;
option host-name "ip-88-xxx-xxx-129.example.com";
option ipv6-address 2a01:xxx:xxx:2464::1:1;
option ipv6-gateway 2a01:xxx:xxx:2464::1:0;
}
host ip-88-xxx-xxx-130.example.com {
hardware ethernet 16:xx:xx:xx:af:aa;
fixed-address 88.xxx.xxx.130;
option host-name "ip-88-xxx-xxx-130.example.com";
option ipv6-address 2a01:xxx:xxx:2464::2:1;
option ipv6-gateway 2a01:xxx:xx:2464::2:0;
}
host ip-88-xxx-xxx-131.example.com {
hardware ethernet 16:xx:xx:xx:7a:73;
fixed-address 88.xxx.xxx.131;
option host-name "ip-88-xxx-xxx-131.example.com";
option ipv6-address 2a01:xxx:xxx:2464::3:1;
option ipv6-gateway 2a01:xxx:xxx:2464::3:0;
}
Как видите, я добавил 3 новых ОПЦИИ: «ipv6-адрес», «ipv6-netmask» и «ipv6-gateway». Вы устанавливаете их так же, как обычно, с IPv4.
Не забудьте перезапустить DHCP-сервер после внесения изменений.
Теперь клиентам нужно указать, чтобы они включали эти 3 настраиваемых ОПЦИИ при выполнении DHCP-запроса.
Это зависит от того, какой DHCP-клиент вы используете. Debian / Ubuntu использует «dhclient», и его конфигурация должна выглядеть примерно так:
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
option ipv6-address code 214 = ip6-address;
option ipv6-netmask code 215 = unsigned integer 8;
option ipv6-gateway code 216 = ip6-address;
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers,
dhcp6.domain-search, dhcp6.fqdn,
dhcp6.name-servers, dhcp6.sntp-servers,
ipv6-address, ipv6-netmask, ipv6-gateway;
Как видите, я добавил 3 пользовательских определения OPTION вверху, а затем сказал DHCP включить их в запрос.
Теперь попробуйте перезапустить свой клиент и посмотреть, правильно ли он получает IPv4, как раньше (как и должно).
После перезагрузки вы можете взглянуть на арендованный файл, созданный DHCP. Он содержит информацию, полученную с DHCP-сервера. В системе Debian / Ubuntu его можно найти в "/var/lib/dhcp/dhclient.eth0.leases". Если вы посмотрите в файл, вы должны увидеть что-то вроде этого:
lease {
interface "eth0";
fixed-address 88.xxx.xxx.136;
option subnet-mask 255.255.255.255;
option routers 88.xxx.xxx.128;
option dhcp-lease-time 86400;
option dhcp-message-type 5;
option domain-name-servers 8.8.8.8,8.8.4.4;
option dhcp-server-identifier 88.xxx.xxx.128;
option ipv6-address 2a01:xxx:xxx:2464::8:1;
option ipv6-netmask 112;
option host-name "ip-88-xxx-xxx-136.example.com";
option ipv6-gateway 2a01:xxx:xxx:2464::8:0;
option domain-name "example.com";
renew 6 2013/08/03 23:32:53;
rebind 0 2013/08/04 09:04:30;
expire 0 2013/08/04 12:04:30;
}
Как видите, 3 настраиваемых ОПЦИИ правильно нашли свой путь к клиенту.
Последнее, что вам нужно сделать, это добавить скрипт, который использует эти значения для настройки вашего интерфейса ipv6.
dhclient использует специальную систему ловушек, в которой он запускает скрипты на определенных этапах. Нам нужно, чтобы он запускался при получении ответа от DHCP-сервера.
Создайте файл "/etc/dhcp/dhclient-exit-hooks.d/ipv6" со следующим содержимым:
#**************************************
# This script sets ipv6 based on custom options
#**************************************
# To enable this script set the following variable to "yes"
RUN="yes"
if [ "$RUN" != "yes" ]; then
exit 0
fi
if [ "$reason" != "BOUND" ]; then
exit 0
fi
if [ ! -n "$new_ipv6_address" ] || [ ! -n "$new_ipv6_netmask" ] || [ ! -n "$new_ipv6_gateway" ]; then
exit 0
fi
ip addr add $new_ipv6_address/$new_ipv6_netmask dev $interface
ip -6 route add default via $new_ipv6_gateway dev $interface
Теперь перезагрузите клиент и наблюдайте за волшебством!
ОБНОВЛЕНИЕ 1: ipv6 перемещен из «ifup.d» для работы с привязкой к DHCP, чтобы сделать его чище.