LINUX.ORG.RU
ФорумAdmin

Kea-dhcp на может запустить PID-файл и открыть 67-ой порт

 ,


0

1

Полдня потратил на поиск проблемы, почему rc-service kea-dhcp4 start вываливается в crashed, пока не стартанул kea от root’a

В общем в /etc/init.d/kea-dhcp4 есть строка command_user="${KEA_USER}:${KEA_GROUP}", которая пытается запустить сервис от пользователя dhcp
dhcp:x:300:300:user for dhcp daemon:/dev/null:/sbin/nologin
С права и овнерами на директории всё согласно офдокам! Нихрена не взлетает, но если запустить сервис ручками так -> sudo -u root kea-dhcp4 -d -c /etc/kea/kea-dhcp4.conf то всё запускается!
Не хотелось бы так делать, но чё-т по-другому ничего в голову не приходит. Может кто чего подскажет?


Читай доки. Там, возможно, что-то есть.

А так, порты ниже 1024 может открывать только root.

В nginx, к примеру, master процесс запускается от root, а процессы, что обрабатывают запросы от www-data.

Вот из wiki:

On startup, the server detects available network interfaces and attempts to open UDP sockets on all interfaces listed in the configuration file. Since the DHCPv4 server opens privileged ports, it requires root access; this daemon must be run as root.

https://kea.readthedocs.io/en/latest/arm/dhcp4-srv.html.

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

А так, порты ниже 1024 может открывать только root.

Емнип, можно сделать через capabilities

sudo setcap 'cap_net_bind_service=+ep' /path/to/binary

Это не про KEA (с ним пока не знаком). Так, к слову

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

Нафига то в дефолтном инит-скрипте запуск от dhcp?

cat /etc/init.d/kea-dhcp4
---------------
: ${KEA_USER:=dhcp}
: ${KEA_GROUP:=dhcp}
---------------
command_user="${KEA_USER}:${KEA_GROUP}"
---------------

Ну и ставили бы тогда рута.

Мне кажется, что всё равно я что-то-где-то неправильно делаю. Запуск должен быть от dhcp

Dodik
() автор топика
Последнее исправление: Dodik (всего исправлений: 1)
Ответ на: комментарий от Dodik

Я не знаю на чём ты запускаешь, но не от root без установки разрешений просто так не запустишь.

Как бы не казалось странным, но писатели init.d сценариев запуска, так же как и systemd unit`ов ошибаются.

Выше тебе дали ответ как дать бинарнику возможность открывать порты ниже 1024 при запуске не от root.

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

Запуск должен быть от dhcp

Кому должен? По факту написано без знания особенностей Linux теми, кто писал сценарий запуска.

Либо меняй пользователя, либо давай разрешения.

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

Спасибо за уточнение. Я догадывался, что можно что-то такое сделать, но в целом никогда не делал.

kostik87 ★★★★★
()
Ответ на: комментарий от router
#!/sbin/openrc-run
# Copyright 2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

: ${KEA_USER:=dhcp}
: ${KEA_GROUP:=dhcp}
: ${KEA_CONFIG:=/etc/kea/${RC_SVCNAME}.conf}

description="kea ${KEA_SVC} services"
command="/usr/sbin/kea-${KEA_SVC}"
command_args="-c ${KEA_CONFIG}"
command_user="${KEA_USER}:${KEA_GROUP}"
pidfile="/run/kea/$(basename ${KEA_CONFIG%.*}).kea-${KEA_SVC}.pid"
required_files="${KEA_CONFIG}"
start_stop_daemon_args="--background --make-pidfile"

extra_commands="check_kea_svc checkconfig"
extra_started_commands="reload"

check_kea_svc() {
	if [ "${RC_SVCNAME}" = "kea" ]; then
		eerror "You are not supposed to run this script directly."
		eerror "Create a symlink for the kea service you want to run."
		eerror "Symlinks should have been created during installation."
		return 1
	fi

	case "${KEA_SVC}" in
	dhcp4)
	    capabilities="^cap_net_bind_service,^cap_net_raw"
	    ;;
	dhcp6|dhcp-ddns)
	    capabilities="^cap_net_bind_service"
	    ;;
	ctrl-agent)
	    ;;
	*)
	    eerror "KEA_SVC is undefined or invalid!"
	    eerror "It should be defined in /etc/conf.d/${RC_SVCNAME}"
	    return 1
	    ;;
	esac
}

checkconfig() {
	${command} -t ${KEA_CONFIG} 1>/dev/null 2>/dev/null || return 1
}

reload() {
	checkconfig || return 1
	ebegin "Reloading ${RC_SVCNAME}"
	start-stop-daemon --signal HUP --pidfile ${pidfile}
	eend $?
}

start_pre() {
	check_kea_svc || return 1

	if [ $(stat -c "%U:%G" ${KEA_CONFIG}) != "root:${KEA_GROUP}" ] ; then
		eerror "${KEA_CONFIG} config file is not owned by root:${KEA_GROUP}"
		eerror "you should reset the ownership:"
		eerror "chown root:${KEA_GROUP} ${KEA_CONFIG}"
		return 1
	fi

	if [ "${RC_CMD}" != "restart" ]; then
		checkconfig || return 1
	fi
}

stop_pre() {
	if [ "${RC_CMD}" != "restart" ]; then
		checkconfig || return 1
	fi
}
Dodik
() автор топика
Ответ на: комментарий от Dodik
	dhcp4)
	    capabilities="^cap_net_bind_service,^cap_net_raw"

Проверь, что у бинарника выставлены капабилитис:

getcap /usr/sbin/kea-dhcp4

Даже само расположение его в /usr/sbin указывает, что он должен бы запускаться от root.

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

getcap /usr/sbin/kea-dhcp4

Пусто =(

Я сейчас ещё раз глазами пробежался по скрипту и вижу в функции start_pre() условие, что если запуск не от "root:${KEA_GROUP}, то он должен выкидывать ошибку. Получается он всё-таки запускает демон от рута, но в реале статус в краше

Ничего не понимаю…=(

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

При передёргивании скрипта в логе вообще не может найти процесс

kea-dhcp4[23731]: start-stop-daemon: no matching processes found
Dodik
() автор топика
Ответ на: комментарий от Dodik

Попробуй выставить те, что указаны в сценарии запуска, как писал @router.

А по поводу остальной логики - либо разбирайся и правь, если нужно, либо делай просто запуск от root.

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

Сейчас попробовал стартануть так -> kea-dhcp4 -c /etc/kea/kea-dhcp4.conf всё взлетело ровно!
Вероятно всё-таки в инит-скрипте чё-т не так. Буду разбираться. @kostik87 @router спасибо за участие!

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

Обычно в таких случаях демон пускается от рута и после открытия сокета сбрасывает привилегии сам

no-dashi-v2 ★★★★
()
Последнее исправление: no-dashi-v2 (всего исправлений: 1)

В общем на вторые сутки я устал приседать с этой censored kea и просто переделал init-скрипт на более простой и понятный. Может кому пригодится, оставлю тут

#!/sbin/openrc-run

name="kea-dhcp4"
description="Kea DHCPv4 Server"
command="/usr/sbin/kea-dhcp4"
command_args="-c /etc/kea/kea-dhcp4.conf"
command_user="dhcp"
pidfile="/run/kea/kea-dhcp4.pid"
start_stop_daemon_args="--background --make-pidfile --pidfile ${pidfile}"

depend() {
    need net
}

Всё! Проблем с запуском нет

Dodik
() автор топика

Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария