Что: 7aa88f79890fe720093162a03d0f78fcdefb0b99
Когда: 2018-08-22 22:17:32+03:00
Темы: ipv6 tip
IPv6 link-local адреса в /etc/hosts Сегодня коллега хотел было прописать на своём Arch GNU/Linux IPv6 link-local адрес в /etc/hosts. Не получилось. Поискал информацию и говорит что туда нельзя link-local, а только routable адреса. В FreeBSD оно работает без проблем. Казалось бы -- какая разница какого типа адрес? Но... Linux мир умудряется даже тут костылять. В FreeBSD уже с 9.0 версии есть возможность собрать ядро полностью без IPv4 поддержки -- IPv6 only. В GNU/Linux, быстрый поиск, показывает что вроде как нельзя такое сделать. Ещё я помню случай навсегда изменивший моё почтение к Linux-у (именно ядру): loopback блочное устройство на самом деле не такое уж и полноценное. Например мы можете сделать losetup, создав loopback block device, но например partition table с него не подгрузится -- для этого нужно использовать отдельный костыль в виде kpartx. В FreeBSD (тогда это была 5.x версия) -- без разницы loopback оно или нет: оно полноценно воспринимается системой, без каких-либо костылей и дополнительных телодвижений. Лично для меня все эти факты (IPv6-only, link-local в hosts, kpartx) показывают насколько нецелостен Linux и как много в нём подпорок которые не убрать просто так. Это говорит, как мне (разработчику) кажется, о плохом проектировании архитектуры всего что в ядре происходит.
From: kmeaw Date: 2020-10-12 14:35:48Z > Поискал информацию и > говорит что туда нельзя link-local, а только routable адреса. Зависит от реализации getaddrinfo. В musl такой проблемы нет. В glibc, действительно, getaddrinfo и inet_pton не понимают zone identifier в IPv6-адресах. > В FreeBSD уже > с 9.0 версии есть возможность собрать ядро полностью без IPv4 поддержки > -- IPv6 only. Я уже задавал этот вопрос на Хабре, но повторюсь, так как не получил ответа — а как оно работает в FreeBSD? Я сходу не могу придумать, как красиво отвязать реализацию TCP от IP (проблемы должны возникнуть, например, при вычислении pseudoheader checksum). > loopback блочное устройство на самом деле не такое уж и > полноценное. Например мы можете сделать losetup, создав loopback block > device, но например partition table с него не подгрузится Для поддержания partition table нужно резервировать device minor numbers. Поскольку пользователи гораздо чаще создают много loopback devices, чем разделов на одном loopback device, по-умолчанию размер выделяемого диапозона равен единице. Это несложно изменить, для этого есть параметр max_part у модуля loop: modprobe loop max_part=8 После чего вместь с /dev/loopX появятся устройства /dev/loopXpY. -- kmeaw
From: kmeaw Date: 2020-10-12 15:01:10Z Посмотрел в исходники glibc, и понял, что всё на самом деле не совсем так. Современные версии getaddrinfo вполне умеют scope identifier, и кладут его в правильное место — в sockaddr_in6.sin6_scope_id. А inet_pton(af=AF_INET6), которым пользуется парсер /etc/hosts, возвращает результат в виде struct in6_addr. По-другому эта функция не может работать (например, писать в sockaddr_in6 или записывать scope identifier куда-то ещё), потому что это часть POSIX. Проблема в glibc заключается в том, что парсер hosts использует inet_pton, а не некую внутреннюю часть getaddrinfo. Полноценный getaddrinfo он по понятным причинам использовать не может. В musl же для этого используется внутренняя функция __lookup_ipliteral, заполняющая уже внутреннюю struct address. Я пока не могу придумать хороший способ написать программу, которая бы, ограничиваясь только тем, что есть в POSIX, парсила бы IPv6 адрес в struct sockaddr_in6 без работающего getaddrinfo (с работающим легко, hints.ai_flags=AI_NUMERICHOST). Возможно, разработчики glibc считают, что плохо в реализации libnss/files-hosts использовать функцию getaddrinfo, которая, в свою очередь, сама использует libnss, порождая циклическую зависимость, ведь чтобы её разорвать, придётся знать детали реализации динамически загружаемой библиотеки (неизвестно какой, ведь через nsswitch.conf пользователь может указать любую). musl, в силу простоты своего дизайна, не пытается быть такой же расширяемой, поэтому механизма, похожего на nss, там просто нет. Поэтому и проблемы этой нет — функции могут использовать части друг-друга и завязываться на детали реализации.
From: Sergey Matveev Date: 2020-10-12 15:06:29Z
From: Sergey Matveev Date: 2020-10-12 15:11:39Z
Сгенерирован: SGBlog 0.34.0