Я установил цепочку ВЫХОДОВ iptables по умолчанию на DROP пакеты. Затем я создал правило брандмауэра, позволяющее только пользователю ntp отправлять пакеты ntp:
iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT
Однако каждые 10-20 минут я видел:
ntpd[27769]: sendto(<snip>) (fd=22): Operation not permitted
Затем я удалил -m owner --uid-owner ntp
часть правила и добавила перед ней правило журнала:
iptables -A OUTPUT -p udp --dport 123 -j LOG --log-level debug \
--log-prefix "Spotted a NTP packet: " --log-uid
ntpd
снова начал работать, и в кольцевом буфере ядра я вижу:
Spotted a NTP packet: <snip> PROTO=UDP SPT=123 DPT=123 LEN=56 UID=0
Я использую --log-uid
переключиться на LOG
цель, и ntpd
запущен как пользователь ntp (uid = 38):
# ps auxf | grep ntpd
ntp 27769 0.0 1.0 4512 4508 ? SLs Jan04 0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid
Тем не менее, журнал показывает UID=0
. Я уверен, что ничто больше в системе не отправляет пакеты ntp, и поскольку я больше не получаю Operation not permitted
, Я уверен, что это на самом деле ntpd
это отправка пакета.
Я думаю, что меня устраивает то, что я не соответствую пользователю ntp для этих пакетов; тем не мение, может кто-нибудь объяснить, почему iptables не показывает UID=38
для этих пакетов?
Чтобы программа могла использовать порт меньше 1024, она должна быть root. Многие приложения, такие как NTP, запускаются, открывают порт как root, а затем сбрасывают привилегии определенной учетной записи для всего остального.
В вашем правиле iptables есть ошибка:
iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT
Если вы используете --uid-owner необходимо определить uid - числовое значение.
Для названия программы нужен другой вариант: --cmd-владелец. Правильное правило:
iptables -A OUTPUT -m owner --cmd-owner ntp -p udp --dport 123 -j
Подробное объяснение Вы можете прочитать в отличном книга по Оскар Андреассон.