Para um programa usar uma porta menor que 1024, ele deve ser root. Muitos aplicativos como o NTP serão iniciados, abra a porta como root e, em seguida, elimine privilégios para alguma conta definida para todo o resto.
Eu configurei minha cadeia OUTPUT iptables padrão para os pacotes DROP. Em seguida, criei uma regra de firewall para permitir que o usuário ntp enviasse os pacotes ntp:
iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT
No entanto, a cada 10 a 20 minutos eu veria:
ntpd[27769]: sendto(<snip>) (fd=22): Operation not permitted
Em seguida, removi a parte -m owner --uid-owner ntp
da regra e adicionei uma regra de log antes dela:
iptables -A OUTPUT -p udp --dport 123 -j LOG --log-level debug \
--log-prefix "Spotted a NTP packet: " --log-uid
ntpd
começou a trabalhar novamente e, no buffer de anel do kernel, eu vejo:
Spotted a NTP packet: <snip> PROTO=UDP SPT=123 DPT=123 LEN=56 UID=0
Estou usando a opção --log-uid
para o LOG
target e ntpd
está sendo executado como o usuário 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
No entanto, o log mostra UID=0
. Tenho certeza de que nada mais no sistema está enviando pacotes ntp, e já que não estou mais recebendo o Operation not permitted
, tenho certeza de que é de fato ntpd
que está enviando o pacote.
Eu acho que estou bem com a não correspondência do usuário ntp para esses pacotes; no entanto, alguém pode explicar por que o iptables não está mostrando UID=38
para esses pacotes?
Há um erro na regra "iptables":
iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT
Se você usar - uid-owner , será necessário definir uid - valor numérico.
Para o nome do programa, você precisa de outra opção: - cmd-owner . A regra correta é:
iptables -A OUTPUT -m owner --cmd-owner ntp -p udp --dport 123 -j
Explicação detalhada Você pode ler um ótimo livro Oskar Andreasson .