
Como posso configurar /etc/syslog.conf
o arquivo para salvar informações de log iptables
em um arquivo específico.
Quero salvar essas informações separadamente, para poder extrair o que desejo com facilidade e rapidez.
Responder1
registro de sistema
Dê uma olhada na página de manual do iptables
. Mostra um alvo chamado LOG
que pode fazer o que você quiser.
Exemplo
Defina o nível de registro como
LOG
4.# DROP everything and Log it iptables -A INPUT -j LOG --log-level 4 iptables -A INPUT -j DROP
Configure
syslog.conf
para gravar essas mensagens em um arquivo separado.# /etc/syslog.conf kern.warning /var/log/iptables.log
Reinicie o syslogd.
Debian/Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora/CentOS/RHEL
$ sudo /etc/init.d/syslog restart
OBSERVAÇÃO:Este método de registro é chamado de prioridades fixas. Eles são números ou nomes (1,2,3,4,..) ou (DEBUG, WARN, INFO, etc.).
rsyslog
Se por acaso você estiver usando rsyslog
, poderá criar um filtro baseado em propriedades como este:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
Em seguida, adicione esta opção às regras do iptables que você deseja registrar:
–log-prefix NETFILTER
Como alternativa, você também pode registrar as mensagens usando este tipo de filtro de propriedade:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
OBSERVAÇÃO:Este segundo método não requer nenhuma alteração no arquivo iptables
.
Referências
Responder2
Isso pressupõe que seu firewall já faça logs, como qualquer firewall sensato deveria fazer. Para alguns exemplos, é necessária uma mensagem identificável, como "NETFILTER" no exemplo do slm.
crie um arquivo em rsyslog.d
vim /etc/rsyslog.d/10-firewall.conf
Isso funciona no CentOS 7. Não sei como verificar se veio do firewall além de procurar IN e OUT... CentOS é estranho. Não use isso a menos que a próxima versão não funcione.
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Isso funciona no CentOS 7 e também verifica o conteúdo da mensagem (substitua "Shorewall" pelo que você tiver na mensagem da sua regra -j LOG):
# into separate file and stop their further processing
if ($msg contains 'Shorewall') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Isso funciona em outros (Ubuntu, Debian, openSUSE). E esta é a melhor maneira de fazer isso. Não há busca por strings na mensagem:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
E aqui está o que uma máquina openSUSE padrão tem (que eu acho que toda distribuição deveria ter e está faltando) (a diferença parece ser apenas "stop" em vez de "& ~"; nem todos os sistemas suportam ambas as sintaxes):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
E para todos os itens acima, não se esqueça também do arquivo logrotate.d:
vim /etc/logrotate.d/firewall
contendo:
/var/log/firewall {
rotate 7
size 500k
postrotate
# before using this, run the command yourself to make sure
# it is right... the daemon name may vary
/usr/bin/killall -HUP rsyslogd
endscript
}