Главная Файлы Форум Галерея Гостевая книга Обратная связь Карта сайта Поиск
 

 

Моё место работы

СитиСервис
  • Заправка и ремонт лазерных картриджей
  • Ремонт любых принтеров и копиров
  • Оригинальные и совместимые картриджи
  • Доставка бесплатно (от 2-х картриджей)
  • Накопительная система расчётов для корпоративных клиентов
Телефон
+7 (4722) 373-983
8-980-326-01-23
Адрес E-mail
mybelpost@gmail.com

Привет, Гость

Войти
Идентификация
Я забыл свой пароль
Регистрация

Разделы -> Статьи -> Debian GNU/Linux -> isc-dhcp-server и ди...

isc-dhcp-server и динамический DNS

Если провайдер время от времени изменяет адреса DNS.
Если у Вас не настроен свой DNS, то интернет будет пропадать у клиентов. Т.к. в настройках isc-dhcp-server DNS прописывается жестко.
В подобной ситуации можно подправить файл /etc/init.d/isc-dhcp-server
Указав в нём путь, где брать новые DNS и файл, в котором нужно вносить изменения.
Для этого логинимся на сервере, где работает isc-dhcp-server под root.
Открываем на редактирование файл /etc/init.d/isc-dhcp-server к примеру вот так:

mcedit /etc/init.d/isc-dhcp-server

Вписываем в этот файл функцию, которая будет разбирать файл с DNS полученными от провайдера.
Т.е. файл /etc/resolv.conf

Функция:
dns_add()
{
dns=$(grep nameserver /etc/resolv.conf | awk '{ print $2 }' | sed -n '/./{s/^/, /;H};${g;s/|//1;s/\n//g;p}' | sed 's/^,/option domain-name-servers/');
sed -i "s/^option domain-name-servers.*/$dns\;/" /etc/dhcp/dhcpd.conf;
}
Её нужно вписать сразу под строкой:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

Далее необходимо дописать под строками

case "$1" in
    start)

Вот это

dns_add

и под строкой с restart | force-reload)
тоже вписать

dns_add

Т.е. в момент старта и рестарта должна вызываться наша новая функция.

Ниже мой рабочий скрипт /etc/init.d/isc-dhcp-server
#!/bin/sh
#
#

### BEGIN INIT INFO
# Provides:          isc-dhcp-server
# Required-Start:    $remote_fs $network $syslog
# Required-Stop:     $remote_fs $network $syslog
# Should-Start:      $local_fs slapd $named
# Should-Stop:       $local_fs slapd
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: DHCP server
# Description:       Dynamic Host Configuration Protocol Server
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin
dns_add()
{
dns=$(grep nameserver /etc/resolv.conf | awk '{ print $2 }' | sed -n '/./{s/^/, /;H};${g;s/|//1;s/\n//g;p}' | sed 's/^,/option domain-name-servers/');
sed -i "s/^option domain-name-servers.*/$dns\;/" /etc/dhcp/dhcpd.conf;
}

test -f /usr/sbin/dhcpd || exit 0

DHCPD_DEFAULT="${DHCPD_DEFAULT:-/etc/default/isc-dhcp-server}"

# It is not safe to start if we don't have a default configuration...
if [ ! -f "$DHCPD_DEFAULT" ]; then
    echo "$DHCPD_DEFAULT does not exist! - Aborting..."
    if [ "$DHCPD_DEFAULT" = "/etc/default/isc-dhcp-server" ]; then
        echo "Run 'dpkg-reconfigure isc-dhcp-server' to fix the problem."
    fi
    exit 0
fi

. /lib/lsb/init-functions

# Read init script configuration
[ -f "$DHCPD_DEFAULT" ] && . "$DHCPD_DEFAULT"

NAME=dhcpd
DESC="ISC DHCP server"
# fallback to default config file
DHCPD_CONF=${DHCPD_CONF:-/etc/dhcp/dhcpd.conf}
# try to read pid file name from config file, with fallback to /var/run/dhcpd.pid
if [ -z "$DHCPD_PID" ]; then
    DHCPD_PID=$(sed -n -e 's/^[ \t]*pid-file-name[ \t]*"(.*)"[ \t]*;.*$/\1/p' < "$DHCPD_CONF" 2>/dev/null | head -n 1)
fi
DHCPD_PID="${DHCPD_PID:-/var/run/dhcpd.pid}"

test_config()
{
    if ! /usr/sbin/dhcpd -t $OPTIONS -q -cf "$DHCPD_CONF" > /dev/null 2>&1; then
        echo "dhcpd self-test failed. Please fix $DHCPD_CONF."
        echo "The error was: "
        /usr/sbin/dhcpd -t $OPTIONS -cf "$DHCPD_CONF"
        exit 1
    fi
}

# single arg is -v for messages, -q for none
check_status()
{
    if [ ! -r "$DHCPD_PID" ]; then
    test "$1" != -v || echo "$NAME is not running."
    return 3
    fi
    if read pid < "$DHCPD_PID" && ps -p "$pid" > /dev/null 2>&1; then
    test "$1" != -v || echo "$NAME is running."
    return 0
    else
    test "$1" != -v || echo "$NAME is not running but $DHCPD_PID exists."
    return 1
    fi
}

case "$1" in
    start)
        dns_add
        test_config
        log_daemon_msg "Starting $DESC" "$NAME"
        start-stop-daemon --start --quiet --pidfile "$DHCPD_PID" \
            --exec /usr/sbin/dhcpd -- \
            -q $OPTIONS -cf "$DHCPD_CONF" -pf "$DHCPD_PID" $INTERFACES
        sleep 2

        if check_status -q; then
            log_end_msg 0
        else
            log_failure_msg "check syslog for diagnostics."
            log_end_msg 1
            exit 1
        fi
        ;;
    stop)
        log_daemon_msg "Stopping $DESC" "$NAME"
        start-stop-daemon --stop --quiet --pidfile "$DHCPD_PID"
        log_end_msg $?
        rm -f "$DHCPD_PID"
        ;;
    restart | force-reload)
        dns_add
        test_config
        $0 stop
        sleep 2
        $0 start
        if [ "$?" != "0" ]; then
            exit 1
        fi
        ;;
    status)
        echo -n "Status of $DESC: "
        check_status -v
        exit "$?"
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|force-reload|status}"
        exit 1 
esac

exit 0

После подобного редактирования, при каждом старте / рестарте скрипт будет проверять файл /etc/resolv.conf
И вносить изменения в настройки isc-dhcp-server - файл /etc/dhcp/dhcpd.conf

Для автоматической проверки совпадения DNS в настройках isc-dhcp-server и файле /etc/resolv.conf
Можно создать скрипт, который будет выполняться cron-ом.
Для этого командуем от root вот так:

mcedit /usr/bin/dnsadd.sh

Вписываем вот такое содержимое:
#! /bin/bash
# Скрипт предназначен для автоматического изменения настроек isc-dhcp-server
# при динамически изменяемом DNS
#
# Этот сценарий должен выполняться ежеминутно
# Пример строки для cron:
# */1 *    *   *   *    /usr/bin/dnsadd.sh
#

dnsa=$(grep nameserver /etc/resolv.conf | awk '{ print $2 }' | sed -n '/./{s/^/, /;H};${g;s/|//1;s/\n//g;p}' | sed 's/^,/option domain-name-servers/; s/$/\;/');
dnsb=$(grep '^option domain-name-servers' /etc/dhcp/dhcpd.conf);

if [[ "$dnsa" != "$dnsb" ]]; then
    /etc/init.d/isc-dhcp-server restart;
    service dansguardian stop;
    service squid stop;
    service squid start;
    service dansguardian start;
fi
Делаем файл сценария исполнимым скомандовав:

chmod 755 /usr/bin/dnsadd.sh

И теперь отдаём этот скрипт на ежеминутное выполнение cron-у от имени root.
Можно скомандовав:

crontab -e

И вписав в самый конец файла вот это:

*/1 * * * * /usr/bin/dnsadd.sh

Всё! Теперь крон будет ежеминутно сверять DNS-ы и при их не совпадении изменит настройки isc-dhcp-server.
Плюс перезапустит сервисы dhcpd, squid и dansguardian
Почему-то без перезапуска squid и dansguardian клиенты не могут попасть в интернет.
Если у Вас будет иначе, то можете исключить строки рестарта прокси и фильтра из скрипта.

Опубликовано: Константин, Автор/источник: Сакрюкин К.В. 26 Январь 2016 13:20:45

Комментировать

Вы не залогинены! Регистрация

Афоризмы, мысли

Человечество погибнет от безмерия - от неумения остановиться!
И не важно в чём.

/Сакрюкин К.В./

Счётчик

Сейчас на сайте - 1 (0 зарег.)
Всего хитов1178 
Сегодня хитов1178 
Сегодня хостов291 

Откуда гости наши?

 
Powered by ReloadCMS 1.5.0.
© 2004-2012 ReloadCMS Team
RSS AggregationPHP powered
Генерация страницы: 0.29
  Яндекс.Метрика
    Сакрюкин К.В.   Яндекс цитирования    
 
Здесь всё можно копировать и цитировать, но рабочая ссылка на мой сайт обязательна!