17.07.2011

Творческая неудача.

Попытался запустить DHCP-сервер с IPv6. Не получилось..

Машина была такая:

$ uname -a
OpenBSD host1.domain.ru 4.9 GENERIC.MP#819 amd64 Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz

Скачал gmake, затем скачал ISC DHCP Server 4.2.1-P1. Далее — обычным путем:

распаковал

  • ./configure
  • gmake
  • gmake install

Ну, были некритичные замечания, но сообщений об ошибках не было. Составляю несложный конфигурационный файл, скажем /etc/dhcpd6.conf:

subnet6 2001:0db8:0:a::/64 {
range6 2001:0db8:0:a:1::01 2a02:5800:0:a:1::99;
option dhcp6.name-servers 2001:0db8:0:a::144:1;
}

Создаю вручную файл для арендуемых адресов

touch /var/db/dhcpd6.leases

и запускаю DHCPD в режиме отладки:

/usr/sbin/dhcpd -6 -f -d -cf /etc/dhcpd6.conf re0

Вроде запустился нормально:

Internet Systems Consortium DHCP Server 4.2.1-P1
Copyright 2004-2011 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Wrote 0 leases to leases file.
Bound to *:547
Listening on Socket/7/re0/2001:0db8:0:a::/64
Sending on   Socket/7/re0/2001:0db8:0:a::/64

Пока все ОК (каламбур получается). Затем беру ноутбук с Windows7, отключаю (полностью) IPv4 и включаю IPv6 с получением адресов по DHCP.

Вот что вижу в отладке DHCP-сервера:

Solicit message from fe80::74c5:96cb:ac0c:c065 port 546, transaction ID 0xAF9AE000
Picking pool address 2001:0db8:0:a:1::99
Sending Advertise to fe80::74c5:96cb:ac0c:c065 port 546
send_packet6: Invalid argument
dhcpv6: send_packet6() sent -1 of 109 bytes

— то есть ничего хорошего.. Дальнейшая война с конфиг-файлом, чтение документации (весьма аскетичной, надо сказать) и гугление с яндексацией ни к чему не привели. Точнее — год назад кто-то упомянул, что это дело работает только на 32-бит платформе. Быстро запускаю то же самое на соседней 32-бит «старушке» — и результат тот же. Tcpdump подтверждает правду — пакеты на вход от клиента приходят нормально,  а к клиенту ничего не летит.

Иду на сайт ISC и подписываюсь на их рассылку для DHCP-юзеров. Излагаю ситуацию, проходит 1,2,3,4,5 дней — и никакой реакции ни от кого. Письмо точно дошло до листа, в дайджестах оно есть. Понимаю, что ISC мне ничего не должен, но все равно обидно.

Завтра попробую то же самое под FreeBSD, затем на очереди будет Ubuntu.

Для справки: по SLAAC этот же ноут генерирует адреса просто замечательно (при дефолтных настройках роутера). Для работы с DHCPv6 роутер был «уведен» с дефолтных настроек для RA).

Вот так..

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

configure:7535: gcc -c -g -O2 conftest.c >&5
In file included from conftest.c:35:
/usr//include/sys/socket.h:105: error: expected specifier-qualifier-list before 'off_t'
/usr//include/sys/socket.h:162: error: expected specifier-qualifier-list before 'u_int8_t'
/usr//include/sys/socket.h:180: error: expected specifier-qualifier-list before 'u_int8_t'
/usr//include/sys/socket.h:249: error: expected specifier-qualifier-list before 'uid_t'
/usr//include/sys/socket.h:394: error: expected specifier-qualifier-list before 'socklen_t'
/usr//include/sys/socket.h:420: error: expected specifier-qualifier-list before 'socklen_t'
/usr//include/sys/socket.h:476: error: expected specifier-qualifier-list before 'caddr_t'
In file included from conftest.c:35:
/usr//include/sys/socket.h:491: error: expected declaration specifiers or '...' before 'socklen_t'
/usr//include/sys/socket.h:492: error: expected declaration specifiers or '...' before 'socklen_t'
/usr//include/sys/socket.h:493: error: expected declaration specifiers or '...' before 'socklen_t'
/usr//include/sys/socket.h:494: error: expected declaration specifiers or '...' before 'uid_t'
/usr//include/sys/socket.h:494: error: expected declaration specifiers or '...' before 'gid_t'
/usr//include/sys/socket.h:495: error: expected declaration specifiers or '...' before 'socklen_t'
/usr//include/sys/socket.h:496: error: expected declaration specifiers or '...' before 'socklen_t'
/usr//include/sys/socket.h:497: error: expected declaration specifiers or '...' before 'socklen_t'
/usr//include/sys/socket.h:499: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'recv'
/usr//include/sys/socket.h:500: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'recvfrom'
/usr//include/sys/socket.h:501: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'recvmsg'
/usr//include/sys/socket.h:502: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'send'
/usr//include/sys/socket.h:503: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'sendto'
/usr//include/sys/socket.h:505: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'sendmsg'
/usr//include/sys/socket.h:506: error: expected declaration specifiers or '...' before 'socklen_t'
conftest.c: In function 'main':
conftest.c:41: error: 'struct sockaddr' has no member named 'sa_len'
configure:7541: $? = 1
configure: failed program was:
| /* confdefs.h. */

 

Итак, эксперимент не удался. Перехожу на FreeBSD:

$ uname -a
FreeBSD test.v6net.ru 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Sat Nov 21 15:48:17 UTC 2009     root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386

И точно таким же путем устанавливаю ISC DHCP сервер, затем копирую тот же самый конфигурационный файл, создаю файл для арендованных адресов, запускаю с теми же самыми ключами и включаю тот же самый ноутбук. Вот что вижу в отладке:

Internet Systems Consortium DHCP Server 4.2.1-P1
Copyright 2004-2011 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Wrote 0 leases to leases file.
Bound to *:547
Listening on Socket/5/em0/2001:0db8:0:a::/64
Sending on Socket/5/em0/2001:0db8:0:a::/64
Solicit message from fe80::74c5:96cb:ac0c:c065 port 546, transaction ID 0x7D6F2100
Picking pool address 2001:0db8:0:a:1::99
Sending Advertise to fe80::74c5:96cb:ac0c:c065 port 546
Request message from fe80::74c5:96cb:ac0c:c065 port 546, transaction ID 0x7D6F2100
Sending Reply to fe80::74c5:96cb:ac0c:c065 port 546

— налицо классический обмен. Вот что показывает ipconfig /all на ноутбуке:

Настройка протокола IP для Windows
Имя компьютера . . . . . . . . . : thech-PC
Основной DNS-суффикс . . . . . . :
Тип узла. . . . . . . . . . . . . : Гибридный
IP-маршрутизация включена . . . . : Нет
WINS-прокси включен . . . . . . . : Нет

Ethernet adapter LAN:

DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Realtek PCIe FE Family Controller
Физический адрес. . . . . . . . . : 60-EB-69-62-D5-94
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да
IPv6-адрес. . . . . . . . . . . . : 2001:0db8:0:a:1::99(Основной)
Аренда получена. . . . . . . . . . : 18 июля 2011 г. 15:05:07
Срок аренды истекает. . . . . . . . . . : 17 августа 2011 г. 15:05:06
Локальный IPv6-адрес канала . . . : fe80::74c5:96cb:ac0c:c065?(Основной)
Основной шлюз. . . . . . . . . :
IAID DHCPv6 . . . . . . . . . . . : 241232745
DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-14-76-0C-2B-60-EB-69-62-D5-94
DNS-серверы. . . . . . . . . . . : 2001:0db8:0:a::144:1
NetBios через TCP/IP. . . . . . . . : Отключен

То есть адрес получен! А вот что появилось в файле аренд:


# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.2.1-P1
server-duid "\000\001\000\001\025\266\316\007\0000H\216\326\356";
ia-na "i\353`\016\000\001\000\001\024v\014+`\353ib\325\224" {
cltt 1 2011/07/18 11:04:22;
iaaddr 2a02:5800:0:a:1::99 {
binding state active;
preferred-life 604800;
max-life 2592000;
ends 3 2011/08/17 11:04:22;
}
}


  *** Via IPv4 ***