Расчет значения domain-search для опции 119 DHCP на Mikrotik

Новости

Приветствую коллеги! Сегодня у меня появилась необходимость передавать опцию 119 — поиска домена (domain-search) на микротике (MikroTik). Оказалось это хитрая задача. Итак поехали.

Опция 119 DHCP позволяет DHCP серверам сообщать клиентам использовать более одного домена поиска DNS. Это задокументировано в RFC 3397.

Сервер DHCP, встроенный в RouterOS от MikroTik (который я использую дома, на работе и в офисах нескольких клиентов), не имеет встроенной поддержки опции 119 в DHCP сервере, опции поиска домена (domain-search). Тем не менее, у него есть способ настроить произвольные параметры, указав номер кода (т.е. 119) и исходное значение в специальном виде.

Документация MikroTik объясняет, как создать произвольный вариант опций, подобно нашему случаю. Но в документации нет каких-либо подробностей о том, что фактически должен содержать какой-либо конкретный вариант опций (например, 119). Я попробовал несколько разных вариантов, и, хотя опция отправлялась DHCP сервером (я проверил это с помощью Wireshark), значение, которое я отправлял, не было принято клиентом как список доменов, которые я пытался использовать (или что-либо вменяемое для этого).

Значение, необходимое для этой опции, должно использовать «DNS-кодирование (DNS encoding)» и еще необходимо использовать «сжатие DNS (DNS compression )», как описано в RFC 1035, раздел 4.1.4. Такое «сжатие» сложно сделать вручную, поэтому я написал Perl-скрипт, чтобы сделать это для себя.

#!/usr/bin/perl -w
#
# dhcp119
# John Simpson <[email protected]> 2016-07-31
#
# Shows the raw value needed for DHCP option 119, aka "domain-search", for
# one or more domain names.
#
# Implements DNS compression as described in RFC 3397, using the scheme
# originally described in RFC 1035 section 4.1.4.
# https://tools.ietf.org/search/rfc1035#section-4.1.4
#
###############################################################################
#
# MIT License
#
# Copyright (c) 2016 John Simpson
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################

require 5.003 ;
use strict ;

use Getopt::Std ;

my %opt = () ;
my $do_debug = 0 ; # -d
my $allow_ext = 0 ; # -e

###############################################################################

sub usage(;$)
{
my $msg = ( shift || '' ) ;

print <<EOF ;
$0 [-e] [-d] [-h] domain [...]

Shows the raw value needed for DHCP option 119, aka "domain-search", for
one or more domain names. Implements DNS compression as described in
RFC 3397.

-e Allow extended characters. The original DNS standard, RFC 1034,
required that DNS labels could contain only letters, digits, and
hyphens. The rules have since been relaxed, and any character is
technically allowed, although they tend to be avoided except for
international names.

-d Debugging. Shows the internal table of domain names and positions,
used for DNS compression.

-h Show this help message.

EOF

if ( $msg )
{
print $msg ;
exit 1 ;
}

exit 0 ;
}

###############################################################################
###############################################################################
###############################################################################
#
# Process the command line options

getopts( 'hde' , \%opt ) ;
$opt{'h'} && usage() ;
$do_debug = ( $opt{'d'} ? 1 : 0 ) ;
$allow_ext = ( $opt{'e'} ? 1 : 0 ) ;

###############################################################################
#
# Process the domain names on the command line

my $out = '' ; # output as raw bytes
my %pos = () ; # domain => position within $out
my @seq = () ; # order that domains were added to $out (for debug output)

if ( $#ARGV < 0 )
{
usage "ERROR: no domain names specified\n" ;
}

while ( my $name = shift @ARGV )
{
########################################
# Make sure the name is a valid DNS domain name

if ( length($name) > 255 )
{
die "ERROR: name \"$name\" is longer than 255 characters\n" ;
}

unless ( $allow_ext )
{
if ( $name =~ m|[^a-z0-9\-\.]|i )
{
die "ERROR: name \"$name\" contains invalid characters\n" ;
}
}

########################################
# Process each label within the name

my $remain = $name ;
my $compressed = 0 ;

while ( $remain ne '' )
{
########################################
# If the remaining name has already been seen,
# * add a reference to it to the output
# * remember that it's a compressed name
# (so we don't end with "00")
# * we're finished with this name

if ( exists $pos{$remain} )
{
$out .= "\xC0" . chr( $pos{$remain} ) ;
$remain = '' ;
$compressed = 1 ;
last ;
}

########################################
# Remember the name we're adding, in case
# a later name needs to refer back to it

$pos{$remain} = length( $out ) ;
push( @seq , $remain ) ;

########################################
# Extract the first label from the remaining name

my ( $label , $x ) = split( /\./ , $remain , 2 ) ;
$remain = ( $x || '' ) ;

if ( length($label) > 63 )
{
die "ERROR: label \"$label\" is longer than 63 characters\n" ;
}

########################################
# Add the length followed by the label itself to the output string

$out .= chr( length( $label ) ) . $label ;
}

########################################
# If we didn't end with a compression reference,
# add a zero byte to end this name.

unless ( $compressed )
{
$out .= "\x00" ;
}
}

if ( length( $out ) > 255 )
{
die "ERROR: the output string is larger than 255 bytes\n" ;
}

########################################
# Show $out as a sequence of hex numbers

map { printf '%02X' , ord $_ } split( // , $out ) ;
print "\n" ;

########################################
# Debugging - show the entries in %pos

if ( $do_debug )
{
print "\n" ;
map { printf "%02X %s\n" , $pos{$_} , $_ } @seq ;
}

 

Готоый скрипт можно скачать от сюда: dhcp119.sh

 

Чтобы создать строку поиска домена (domain-search), содержащую домены «edu-cisco.org» и «sedicomm.com», выполните следующую команду:

./dhcp119.sh edu-cisco.org sedicomm.com
096564752D636973636F036F7267000873656469636F6D6D03636F6D00

 

И затем пишем команду на Mikrotik в таком виде:

/ip dhcp-server option add \ name="domain-search" \ code=119 \ value=096564752D636973636F036F7267000873656469636F6D6D03636F6D00

 

Должно получиться что-то подобное:

 

Спасибо за уделенное время на прочтение статьи!

Если возникли вопросы, задавайте их в комментариях.

Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!

Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Cisco от Академии Ciscoкурсы Linux от Linux Professional Institute на платформе SEDICOMM University.

Курсы Cisco и Linux с трудоустройством!

Спешите подать заявку! Осталось пару мест. Группы стартуют 22 июля, а следующая 19 августа, 23 сентября, 21 октября, 25 ноября, 16 декабря, 20 января, 24 февраля.
Что Вы получите?
  • Поможем стать экспертом в сетевом администрировании и получить международные сертификаты Cisco CCNA Routing & Switching или Linux LPI.
  • Предлагаем проверенную программу и учебник экспертов из Cisco Networking Academy и Linux Professional Institute, сертифицированных инструкторов и личного куратора.
  • Поможем с трудоустройством и сделать карьеру. 100% наших выпускников трудоустраиваются.
Как проходит обучение?
  • Проводим вечерние онлайн-лекции на нашей платформе или обучайтесь очно на базе Киевского офиса.
  • Спросим у вас об удобном времени для практик и подстроимся: понимаем, что времени учиться мало.
  • Если хотите индивидуальный график — обсудим и осуществим.
  • Выставим четкие дедлайны для самоорганизации. Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
А еще поможем Вам:
  • отредактировать резюме;
  • подготовиться к техническим интервью;
  • подготовиться к конкурсу на понравившуюся вакансию;
  • устроим на работу в Cisco по программе Cisco Incubator, New Graduate и Experienced. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.
Чтобы учиться на курсах Cisco CCNA Routing & Switching и Linux LPI, подайте заявку или получите бесплатную консультацию.
Новости

Больше похожих постов

Как ликвидировали опасных польских хакеров: часть 2, специалист по защите информации обязанности Минск

Как ликвидировали опасных польских хакеров: часть 2, специалист по защите информации обязанности Минск

54
0
Недавно польская полиция арестовала нескольких членов хакерской группировки. По всей видимости, эти злоумышленники нападали на различные организации. Также они терроризировали…
Как ликвидировали опасных польских хакеров: часть 1, информационная безопасность специальность зарплата Минск

Как ликвидировали опасных польских хакеров: часть 1, информационная безопасность специальность зарплата Минск

55
0
В Польше правоохранительные органы арестовали крайне опасную хакерскую группировку. По всей видимости, киберполиция долго готовилась к этой операции. Однако на…

3 комментария. Оставить новый

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Most Viewed Posts
Меню