Страница 1 из 1

ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-07 9:53:43
lamok
Привет всем...
Подскажите пожалуйста, как в ppp.linkup прописать выполнение скрипта, чтобы после поднятия связи по ППП он бы перезапускал named???
Заранее спасибо за подсказку...

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-07 10:20:11
ChihPih
А зачем перезапускать сервер имен в данном случае?

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-07 10:45:20
lamok
ChihPih писал(а):А зачем перезапускать сервер имен в данном случае?
потому после старта в rc.conf он запускается по поднятия PPPoE соединения и не работает правильно, нужно рестартовать.

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-07 11:08:55
skeletor
Запустить скрипт /etc/pf-anchor.sh после поднятия сессии:

Код: Выделить всё

itc:
      !bg /etc/pf-anchor.sh 
где itc имя вашего провайдера в файле /etc/ppp/ppp.conf
ПС. Отступ обязателен

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-07 11:24:42
lamok
т.е. в файле /etc/ppp/ppp.linkup пишу:

Код: Выделить всё

itc:
      !bg /etc/pf-anchor.sh 
создаю файл: /etc/pf-anchor.sh делаю исполняемым
и в нем пишу

Код: Выделить всё

/ect/rc.d/named restart 
???

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-07 11:45:13
skeletor
Почти. Ещё нужно добавить в самом начале

Код: Выделить всё

#!/bin/sh

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-07 16:59:00
ChihPih
А не проще использовать mac_portacl?

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-07 17:40:15
skeletor
Ну и каким местом оно тут?
Модуль mac_portacl(4) используется для ограничения привязки (binding) к локальным портам TCP и UDP, используя различные переменные sysctl. По сути mac_portacl(4) делает возможной привязку к привилегированным портам, т.е. к портам с номерами меньше 1024 для не-root пользователей.

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-07 19:04:04
ChihPih
Таким что bind тупо не может создать прослушивающий сокет на 53 порту, после сброса прав. Раз PPPoE поднимается позже, то соответственно на PPPoE соединении не обрабатываются DNS запросы. Данный модуль как раз таки гибче системной политики блочить любые попытки создания прослушивающих сокетов непривилегированными пользователями на портах net.inet.ip.portrange.reservedlow < x < net.inet.ip.portrange.reservedhigh.

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-10 13:28:41
skeletor
ChihPih писал(а):Таким что bind тупо не может создать прослушивающий сокет на 53 порту, после сброса прав.
Каких прав? DNS стартует раньше, чем будет получен адрес по pppoe и соответственно не найдя адрес - не слушает его. Перезапуск с уже полученным адресом показывает, что адрес успешно "слушается" bind'om.
Данная проблема может наблюдаться не только с bind'ом, а и с другими службами, которые используют полученный по pppoe адрес (например, vpn-сервером, и т.д.)

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-11 6:53:25
ChihPih
Каких прав? DNS стартует раньше, чем будет получен адрес по pppoe и соответственно не найдя адрес - не слушает его. Перезапуск с уже полученным адресом показывает, что адрес успешно "слушается" bind'om.
У меня все робит с mac_portacl без перезапусков.

Прав для создания привилегированного прослушивающего сокета (После старта bind сбрасывает права root,а ).
Если в bind,e директива задана вот так listen-on { any; }; , то bind будет привязываться к новым IP адресам, если ему оно позволено (точнее есть права у пользователя, под которым он работает, на создание прослушивающих сокетов на привилегированном порту).

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-11 8:16:52
_skeletor
Что за термин такой "сбрасывает права"? bind может работать от того пользователя, от какого укажите.
При указании listen-on { any; }; bind слушает все доступные на момент запуска интерфейсы/IP-адреса! Если после запуска появиться новый интерфейс или IP-адрес то без перезапуска он его слушать не будет!
Если вам это непонятно, почитайте про bind, проведите эксперименты и поймёте, как он работает.
Вот, не поленился, проделал (FreeBSD 9, bind 9.9.1.2)

Код: Выделить всё

bsd9# grep 'listen-on' /etc/namedb/named.conf
        listen-on       { any; };
//      listen-on-v6    { ::1; };
bsd9# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
        ether 00:0c:29:fa:d9:38
        inet 192.168.5.104 netmask 0xffffff00 broadcast 255.255.255.255
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
bsd9# /etc/rc.d/named start
wrote key file "/var/named/etc/namedb/rndc.key"
Starting named.
bsd9# sockstat | grep named
bind     named      14554 3  dgram  -> /var/run/logpriv
bind     named      14554 20 tcp4   192.168.5.104:53      *:*
bind     named      14554 21 tcp4   127.0.0.1:53          *:*
bind     named      14554 22 tcp4   127.0.0.1:953         *:*
bind     named      14554 23 tcp6   ::1:953               *:*
bind     named      14554 512 udp4  192.168.5.104:53      *:*
bind     named      14554 513 udp4  127.0.0.1:53          *:*
bsd9# ifconfig em0 alias 1.1.1.1/24
bsd9# ifconfig tun0 create
bsd9# ifconfig tun0 2.2.2.2/24 2.2.2.1
bsd9# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
        ether 00:0c:29:fa:d9:38
        inet 192.168.5.104 netmask 0xffffff00 broadcast 255.255.255.255
        inet 1.1.1.1 netmask 0xffffff00 broadcast 1.1.1.255
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        inet 2.2.2.2 --> 2.2.2.1 netmask 0xffffff00
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
bsd9# sockstat | grep named
bind     named      14554 3  dgram  -> /var/run/logpriv
bind     named      14554 20 tcp4   192.168.5.104:53      *:*
bind     named      14554 21 tcp4   127.0.0.1:53          *:*
bind     named      14554 22 tcp4   127.0.0.1:953         *:*
bind     named      14554 23 tcp6   ::1:953               *:*
bind     named      14554 512 udp4  192.168.5.104:53      *:*
bind     named      14554 513 udp4  127.0.0.1:53          *:*
Как видно, pid named'a не изменился, новые алиасы и интерфейсы он не слушает, что и следовало доказать.

ПС. Дальнейший спор на эту тему вести бессмысленно.

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-11 8:23:00
_skeletor
Вот дополнение

Код: Выделить всё

bsd9# nc -uv 192.168.5.104 53
Connection to 192.168.5.104 53 port [udp/domain] succeeded!
^C
bsd9# nc -uv 1.1.1.1 53
bsd9#

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-11 9:27:56
ChihPih
Что за термин такой "сбрасывает права"?
Выдержка из кода версии 9.9.1-P2

Код: Выделить всё

	/*
	 * For operating systems which have a capability mechanism, now
	 * is the time to switch to minimal privs and change our user id.
	 * On traditional UNIX systems, this call will be a no-op, and we
	 * will change the user ID after reading the config file the first
	 * time.  (We need to read the config file to know which possibly
	 * privileged ports to bind() to.)
	 */
	ns_os_minprivs();
Функция ns_os_minprivs()

Код: Выделить всё

void
ns_os_minprivs(void) {
#ifdef HAVE_SYS_PRCTL_H
	linux_keepcaps();
#endif

#ifdef HAVE_LINUXTHREADS
	ns_os_changeuser(); /* Call setuid() before threads are started */
#endif

#if defined(HAVE_LINUX_CAPABILITY_H) && defined(HAVE_LINUXTHREADS)
	linux_minprivs();
#endif
}
Функция ns_os_changeuser

Код: Выделить всё

void
ns_os_changeuser(void) {
	char strbuf[ISC_STRERRORSIZE];
	if (runas_pw == NULL || done_setuid)
		return;

	done_setuid = ISC_TRUE;

#ifdef HAVE_LINUXTHREADS
#ifdef HAVE_LINUX_CAPABILITY_H
	if (!non_root_caps)
		ns_main_earlyfatal("-u with Linux threads not supported: "
				   "requires kernel support for "
				   "prctl(PR_SET_KEEPCAPS)");
#else
	ns_main_earlyfatal("-u with Linux threads not supported: "
			   "no capabilities support or capabilities "
			   "disabled at build time");
#endif
#endif

	if (setgid(runas_pw->pw_gid) < 0) {
		isc__strerror(errno, strbuf, sizeof(strbuf));
		ns_main_earlyfatal("setgid(): %s", strbuf);
	}

	if (setuid(runas_pw->pw_uid) < 0) {
		isc__strerror(errno, strbuf, sizeof(strbuf));
		ns_main_earlyfatal("setuid(): %s", strbuf);
	}

#if defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_DUMPABLE)
	/*
	 * Restore the ability of named to drop core after the setuid()
	 * call has disabled it.
	 */
	if (prctl(PR_SET_DUMPABLE,1,0,0,0) < 0) {
		isc__strerror(errno, strbuf, sizeof(strbuf));
		ns_main_earlywarning("prctl(PR_SET_DUMPABLE) failed: %s",
				     strbuf);
	}
#endif
#if defined(HAVE_LINUX_CAPABILITY_H) && !defined(HAVE_LINUXTHREADS)
	linux_minprivs();
#endif
}
Можно дальше код разворачивать... Эта последовательность называется сброс прав. Ибо bind стартует под root,ом, потом переключается на пользователя, которого вы указываете, у которого ессно меньше прав.
При указании listen-on { any; }; bind слушает все доступные на момент запуска интерфейсы/IP-адреса! Если после запуска появиться новый интерфейс или IP-адрес то без перезапуска он его слушать не будет!
Если вам это непонятно, почитайте про bind, проведите эксперименты и поймёте, как он работает.
Вот, не поленился, проделал (FreeBSD 9, bind 9.9.1.2)
Походу предыдущие посты вы прочли по диагонали... У него нет прав создавать прослушивающие сокеты на новых IP адресах. Поставьте net.inet.ip.portrange.reservedlow = net.inet.ip.portrange.reservedhigh = 0 и повторите эксперимент.

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-11 12:52:03
skeletor
Причём тут права? Да и я не увидел термина сбрасывания прав :unknown: Есть "switch to minimal privs and change our user id", но переводиться оно по другому.

То, что вы привели куски кода - причём тут это? Вы ещё приведите куски кода GPT, MBR и покажите мне, что там действительно всё работает как надо. Вы доказали, что 2+2=4, но вопрос был совершенно другой.

Вы у себя включили mac_portacl, сделали изменения в sysctl, может ещё что-то и в итоге у вас работает как-то. Вам это нравиться - хорошо. Но для решения проблемы незачем городить огород. Причём решается это штатными средствами.
Есть такое выражение: можно и микроскопом гвозди забивать, но зачем?

Вы скажите, почему
1) бинд запустился?
2) бинд не стал слушать новый адрес после добавления alias'a и создания tun'a?
3) как мне нужно настроить mac_portacl, что бы у меня налету бинд подхватывал новые интерфейсы ? Как у вас это настроено? Приведите примеры.

Ответьте на вопросы.

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-11 19:45:59
ChihPih
пля, туго (((, ну да лан поехали...
Да и я не увидел термина сбрасывания прав Есть "switch to minimal privs and change our user id", но переводиться оно по другому.
Bind стартует под рутом (у которого нет ограничений), и потом переключается под простого пользователя, у которого гораздо меньше прав. Доходит надеюсь - было много, стало мало, то есть он сбрасывает права (привилегированного пользователя до уровня простого). Надеюсь щас ферштеен )))

Теперь о преблеме
Итак, в системе есть привилегированные порты. Привилегированными портами называеются порты, которые лежат в диапазоне
net.inet.ip.portrange.reservedlow...net.inet.ip.portrange.reservedhigh. Ессно, что в этот диапазон входит порт 53. С этим ясно.
В целях безопасности слушающие сокеты на портах такого рода может создавать только пользователь root, любого другого система пошлет лесом с ошибкой (при создании) - нет прав. С этим тоже разобрались.
Идем далее, уже к практической части. Бинд, с каким-то интервалом (а может еще каким-то образом. искать в исходниках не хочу) проверяет на всех IP-адресах ли он повесил слушающие сокеты (или проверяет, действительны ли они, ну там не выключен ли интерфейс или еще че...). Если нет, то создает/удаляет. Едем далее...
Старт системы:
1. Стартует bind, вешает сокеты на все доступные айпишники. Сбрасывает права. линк пппое в дауне в этот момент.
2. Поднимается канал пппое, присваиваются айпишники, все ок.
3. Через некоторое время bind делает проверку на предмет - все ли айпишники я прослушиваю. Если нет, то создает.
Но так как у него уже нет прав создавать прослушивающие сокеты на 53 порту, то он обламывается и вытекает эта проблема. Так же в логах можно увидить вот такие строки:

Код: Выделить всё

29-Dec-2011 20:43:34.282 network: could not listen on UDP socket: permission denied
29-Dec-2011 20:43:34.308 network: creating IPv4 interface ng0 failed; interface ignored
29-Dec-2011 21:43:34.283 network: could not listen on UDP socket: permission denied
29-Dec-2011 21:43:34.283 network: creating IPv4 interface ng0 failed; interface ignored
29-Dec-2011 22:43:34.284 network: could not listen on UDP socket: permission denied
29-Dec-2011 22:43:34.284 network: creating IPv4 interface ng0 failed; interface ignored
Вот эта фигня и заставила найти решение. оно было найдено в использовании модуля mac_portacl.

Что делаем:
Ессно, подгружаем модуль. И в sysctl.conf пишем следующее:

Код: Выделить всё

net.inet.ip.portrange.reservedlow=0
net.inet.ip.portrange.reservedhigh=0
security.mac.portacl.rules=uid:53:udp:53,uid:53:tcp:53
После чего все работает. Надеюсь щас-то понятно как оно происходит, итак разжевал.

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-12 14:59:28
skeletor
1) засунь своё "пля" себе подальше. Если не умеешь себя вести на форуме - лучше не заходи и не пиши.
2) я проделал всё, как ты описал, но бинд так и не стал слушать новые ИПы и новые интерфейсы. Пункт3 не сработал (я подождал 10 минут - можно ждать и час и 2, но кому нужен DNS сервер, который стартонёт через час?). Как оказалось нужно было подождать всего лишь ещё 50 минут, но мне было лень ждать.

Покопавшись в инете, нашёл интересное обсуждение http://www.mail-archive.com/bind-users@ ... 13319.html как раз в тему. Так вот, там один чел тоже вклинился с mac_portacl, но его "мягко" послали. Итого: существуют (на мой взгляд) несколько решений
- через скрипт в pppoe restart демона named'a (решение универсальное и годиться как для Linux так и для FreeBSD, Solaris, OpenBSD и может других)
- через скрипт в pppoe rndc reconfig (решение универсальное и годиться как для Linux так и для FreeBSD, Solaris, OpenBSD и может других)
- добавить в конфиг named'a параметр interface-interval 1; который заставит проверять наличие новых интерфейсов каждую минуту (решение универсальное и годиться как для Linux так и для FreeBSD, Solaris, OpenBSD и может других), но зачем это надо? как часто у вас добавляются новые интерфейсы, а зачем создавать лишнюю нагрузку (хоть и небольшую) на сервер?

Решение от тебя (если вообще оно рабочее) - сугубо завязано на freebsd и требует лишних движений. Хочется привести сюда картинку про буханку хлеба и троллейбус.

ПС. Зачем себе усложнять жизнь, если всё можно решить намного проще?

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-12 15:45:44
ChihPih
1) засунь своё "пля" себе подальше. Если не умеешь себя вести на форуме - лучше не заходи и не пиши.
Есть кэп
2) я проделал всё, как ты описал, но бинд так и не стал слушать новые ИПы и новые интерфейсы. Пункт3 не сработал (я подождал 10 минут - можно ждать и час и 2, но кому нужен DNS сервер, который стартонёт через час?). Как оказалось нужно было подождать всего лишь ещё 50 минут, но мне было лень ждать.

Покопавшись в инете, нашёл интересное обсуждение http://www.mail-archive.com/bind-users@ ... 13319.html как раз в тему. Так вот, там один чел тоже вклинился с mac_portacl, но его "мягко" послали. Итого: существуют (на мой взгляд) несколько решений
- через скрипт в pppoe restart демона named'a (решение универсальное и годиться как для Linux так и для FreeBSD, Solaris, OpenBSD и может других)
- через скрипт в pppoe rndc reconfig (решение универсальное и годиться как для Linux так и для FreeBSD, Solaris, OpenBSD и может других)
- добавить в конфиг named'a параметр interface-interval 1; который заставит проверять наличие новых интерфейсов каждую минуту (решение универсальное и годиться как для Linux так и для FreeBSD, Solaris, OpenBSD и может других), но зачем это надо? как часто у вас добавляются новые интерфейсы, а зачем создавать лишнюю нагрузку (хоть и небольшую) на сервер?
Не получилось, твои проблемы. В рассылке никто не настаивал (и уж тем более "мягко" никого никуда не отсылали) на mac_portacl, было как предложение для FreeBSD. Поскольку там возникла та же проблема с недостатком прав. Поф что через час - вторичный DNS никто не отменял.
Решение от тебя (если вообще оно рабочее) - сугубо завязано на freebsd и требует лишних движений. Хочется привести сюда картинку про буханку хлеба и троллейбус.
Ну так топик, как собственно и форум, посвящен в основном ОС FreeBSD.
ПС. Зачем себе усложнять жизнь, если всё можно решить намного проще?
Это так сложно - прописать одну строчку в loader.conf и три в sysctl.conf, все пальцы об клаву смозолить можно.

Re: ppp.linkup как прописать перезапуск named?

Добавлено: 2012-09-12 16:31:08
snorlov
ChihPih писал(а): Это так сложно - прописать одну строчку в loader.conf и три в sysctl.conf, все пальцы об клаву смозолить можно.
Предложенное тобой действие хорошо, если софт юзает один порт, а если это ipfw, который к примеру заблокирует интерфейс tun0... Так что решение skeletor'а универсальнее и кстати те же 2-и строчки, но в только в другом файле...