LINUX.ORG.RU
ФорумAdmin

isc-dhcp-server, bind9 и пробелы в именах хостов

 , , ,


1

1

Ситуация такая.
Есть isc-dhcpd-4.4.1 который смотрит в wifi.
И bind9, с динамической зоной для него.
Все это работает давно и замечательно, но как всегда есть essid'ы с пробелами.
Соответственно в dhcpd.leases я их вижу как set ddns-fwd-name = "Smart TV Pro.wan";.
А в dns как Smart\032TV\032Pro A 192.168.4.192.
Соответственно arp -a его не видит ? (192.168.4.192) at 38:e7:c0:e4:c8:42 [ether] on wlan0 ну и пропинговать соответственно никак.
По ip пингуется, адрес выдается.
Как можно заменять пробелы на пример подчеркиванием?
Что это сможет сделать? Сразу dhcp, или bind?
Или ничто?

★★★★★

Последнее исправление: hbars (всего исправлений: 1)

Ответ на: комментарий от vel

Гм. А переименовать телевизор не пробовал?

Сделай для него резервирование в dhcp, запись в dns и не долби нам мозги.

Выход так себе.
Ну а если его завтра не станет, или это просто был планшет или смарт который проходил мимо.

hbars ★★★★★
() автор топика
Последнее исправление: hbars (всего исправлений: 2)
Ответ на: комментарий от hbars
on commit {
    set clientIpHyphenated = binary-to-ascii(10, 8, "-", leased-address);

    # Check whether the client supplied a hostname with illegal characters,
    # e.g., "iHome SmartPlug-27C139" with a space or underscore in it.
    # This resolves failures when trying to update DNS forward maps:
    #   dhcpd: Unable to add forward map from
    #       iHome SmartPlug-27C139.JonathansSecretDomain.com. to 10.12.34.56: REFUSED
    if (option host-name ~~ "^[a-z0-9][a-z0-9\-]+[a-z0-9]$") {
        set valid-hostname-else-null = option host-name;
    } else {
        set valid-hostname-else-null = null;
    }

    # Get the client name from the first of the following:
    #   1. Client DHCP Option FQDN
    #   2. Client DHCP Option Hostname (and it is a valid hostname without spaces, underscores, etc)
    #   3. Name of static lease (host-decl-name)
    #   4. A generated name that looks like: "ip-10-12-34-56"
    #   5. "none", if all else fails. Shouldn't ever occur.
    set clientName = pick-first-value(
        option fqdn.hostname,
        valid-hostname-else-null,
        # Optional:
        # This can cause an annoying repetitive error in syslog and dhcpd.log that I suppressed:
        #   dhcpd[965395]: data: host_decl_name: not available
        # If you uncomment it, then also add my rsyslog code below.
        #host-decl-name,
        concat("ip-", clientIpHyphenated),
        "none"
    );

    # Set the dynamic hostname, which otherwise wouldn't have been set if the client didn't
    # request one. We also ensure above that it doesn't contain invalid characters, and that a
    # fallback hostname will be generated if needed.
    ddns-hostname = clientName;

    # Optional:
    # If the client supplied a hostname with illegal characters, log what we changed it to for ddns.
    # (e.g., "iHome SmartPlug-27C139" with a space or underscore in it.)
    #if (not (option host-name = valid-hostname-else-null)) {
    #    log(info, concat("Invalid hostname: \"", option host-name, "\" --> \"", clientName, "\""));
    #} elsif (not (option host-name = clientName)) {
    #    log(info, concat("Hostname overridden: \"", option host-name, "\" --> \"", clientName, "\""));
    #}
}

Лови энтерпрайз решение

Anoxemian ★★★★★
()

Соответственно arp -a

Причём тут arp? И всё он видит, ты же сам написал его ответ дальше 192.168.4.192 at 38:e7:c0:e4:c8:42.

пропинговать соответственно никак.

Опять враньё, ты же дальше пишешь:

По ip пингуется

firkax ★★★★★
()
Ответ на: комментарий от firkax

Соответственно arp -a

Причём тут arp? И всё он видит, ты же сам написал его ответ дальше192.168.4.192 at 38:e7:c0:e4:c8:42.

Он не видит имя хоста 192.168.4.192 в dns.
Разницу видишь:
android-7e718e5e0896bdba.wan (192.168.4.105) at 00:08:22:36:d3:fb [ether] on wlan0
и
? (192.168.4.192) at 38:e7:c0:e4:c8:42 [ether] on wlan0

пропинговать соответственно никак.

Опять враньё, ты же дальше пишешь:

По ip пингуется

По ip да. По имени нет.

hbars ★★★★★
() автор топика
Ответ на: комментарий от hbars

Имена хостов там чисто для иллюстрации, а сам arp занимается сопоставлением ip<->mac и ничем другим. И пинги всегда идут только по айпи и никак иначе, просто в программе ping для удобства есть и функционал предварительного запроса айпи по имени. Проблема то понятна (и вроде тебе даже решение уже дали), но надо ж нормально её описывать а не ссылаться на совершенно несвязанные с ней сущности (arp и пинги).

firkax ★★★★★
()
Ответ на: комментарий от Anoxemian

Лови энтерпрайз решение

Спасибо. Теперь все работает как надо.
Правда я здесь if (option host-name ~~ "^[a-z0-9][a-z0-9\-]+[a-z0-9]$") не осилил добавить _.
И так [a-z0-9\-_] пробовал, и так [a-z0-9\-\_]. Не находит. Хосты с _ тоже переименовывает.
Оставил как есть. Вполне устраивает.

hbars ★★★★★
() автор топика
Ответ на: комментарий от firkax

Имена хостов там чисто для иллюстрации, а сам arp занимается сопоставлением ip<->mac и ничем другим. И пинги всегда идут только по айпи и никак иначе, просто в программе ping для удобства есть и функционал предварительного запроса айпи по имени. Проблема то понятна (и вроде тебе даже решение уже дали), но надо ж нормально её описывать а не ссылаться на совершенно несвязанные с ней сущности (arp и пинги).

Это все понятно. Мне оно для другого нужно.
А именно то другое проверяет факт появления ip в dns.
Уже все нормально.

hbars ★★★★★
() автор топика
Ответ на: комментарий от Anoxemian

[a-z0-9_]

Это regexp. - это range от и до включительно, а в [] перечисление символов. Надо ли сам _ экраниповать не помню, но, вроде, это не спецсимвол, так что не надо.

Вот и я так думал, но не работает. Утром еще попробую.
Экранировать пробовал. То же самое. Переименовывает всех.

hbars ★★★★★
() автор топика
Последнее исправление: hbars (всего исправлений: 2)
Ответ на: комментарий от mky

Переименовывает или берёт ″option fqdn.hostname″?

Переименовывает. pick-first-value выбирает из concat(«ip-», clientIpHyphenated).
Т.е. option host-name ~~ «^[a-z0-9][a-z0-9\-_]+[a-z0-9]$» не отрабатывает. С \_ то же самое.

не осилил добавить _

Зачем? Подчёркивание точно так же запрещено, как и пробел.

Ну тогда все и нормально. Пусть переименовывает.
Хотя bind подчеркивания проглатывал и резолвил нормально.

hbars ★★★★★
() автор топика
Ответ на: комментарий от hbars

Хотя bind подчеркивания проглатывал

В прошлом веке не проглатывал. Вобще с ″_″ какой-то бред. Он не может быть в имени хоста (rfc1034, rfc1123, rfc2396), но может быть в имени домена, но при этом SSL/TLS сертификат на такое имя домена не дадут https://www.entrust.com/blog/2019/01/removal-of-underscores-from-domain-names.... ...

Регулярка простая, может делов не в ″_″, а в другом символе, может там какой непечатный символ или юникодный. Так что можете попробовать для конкретного имени хоста написать:

    if (option host-name ~~ "^[a-z0-9][a-z0-9\-]+[a-z0-9]$") {
        set valid-hostname-else-null = option host-name;
    } else {
        set valid-hostname-else-null = null;
    }
    if (option host-name = "ИМЯ_ХОСТА") {
        set valid-hostname-else-null = option host-name;
    }
Чтобы убедиться, что у вас все символы печатные. И если это сработает, значит что-то странное, можете сюда ИМЯ_ХОСТА запостить,

Хотя, если прочитать man, то регулярка написана направильно, должно быть: [a-z0-9_-].

To include a literal ']' in the list, make it the first character (following a possible '^'). To include a literal '-', make it the first or last character, or the second endpoint of a range. To use a literal '-' as the first endpoint of a range, enclose it in «[.» and ".]" to make it a collating element (see below). With the exception of these and some combinations using '[' (see next paragraphs), all other special characters, including '\', lose their special significance within a bracket expression.

mky ★★★★★
()