使用 ufw 发送所有被拒绝的网络活动的电子邮件

使用 ufw 发送所有被拒绝的网络活动的电子邮件

我已ufw配置为拒绝除 SSH 输入之外的所有传入和传出流量:

ufw default deny outgoing
ufw default deny incoming
ufw limit in ssh

是否有可能收到拒绝流量的电子邮件?一些内容说明/显示流量被拒绝,来自谁、到谁、哪个端口、到端口等...

我觉得电子邮件应该是摘要式的,因为如果在短时间内突然出现数百封拒绝邮件,它应该发送一封电子邮件而不是数百封。

答案1

我找不到我喜欢的答案,因此根据@heynnema 的建议,我捕获了我想要的内容/var/log/ufw.log并将其格式化为电子邮件表格。

echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
echo '<html>';
echo '<head>';
echo '<title></title>';
echo '<style>table, th, td { border: 1px solid black; border-collapse: collapse; padding: 2px;}</style>';
echo '</head>';
echo '<body>';
echo '<table>';
echo '<tr><th>count</th><th>in or out</th><th>source IP</th><th>destination IP</th><th>source port</th><th>destination port</th></tr>';

# get all lines from yesterday
# capture the relevant data: IN, OUT, SRC, DST, SPT, and DPT
# send to awk
# get hostname for SRC and DST
# print everything as a table
sed -r "s/^$(date --date=yesterday +"%b %_d").*?\[UFW BLOCK\].*?IN=([^ ]*) OUT=([^ ]*) .*?SRC=([^ ]*) DST=([^ ]*) .*?SPT=([^ ]*) DPT=([^ ]*).*$/,\1,\2,\3,\4,\5,\6/;t;d" /var/log/ufw.log | sort | uniq -c | sort -nr |  awk -F"," '{
    inOrOut=$2==""?($3==""?"unknown":"out"):"in"

    cmd=sprintf("nslookup %s 2>/dev/null | sed -r -e \"s/^.*name = (.*)\.$/\\1/;t;d\"", $4)
    cmd | getline sourceName
    close(cmd)

    cmd=sprintf("nslookup %s 2>/dev/null | sed -r -e \"s/^.*name = (.*)\.$/\\1/;t;d\"", $5)
    cmd | getline destinationName
    close(cmd)

    printf "<tr><td>%s</td><td>%s</td><td>%s (%s)</td><td>%s (%s)</td><td>%s</td><td>%s</td></tr>\n", $1, inOrOut, $4, sourceName, $5, destinationName, $6, $7
}';

echo '</table>';
echo '<br>';
echo '<br>';

echo '</body>';
echo '</html>';

我有一个每日 cron 作业,运行此脚本并以 HTML 电子邮件形式发送。

由此产生的表格如下:

| count | in or out | source IP             | destination IP        | source port | destination port |
|-------|-----------|-----------------------|-----------------------|-------------|------------------|
| 3     | out       | 192.168.1.100 (host1) | 192.168.1.101 (host2) | 100         | 400              |
| 1     | in        | 192.168.1.101 (host2) | 192.168.1.100 (host1) | 200         | 500              |
| 1     | out       | 192.168.1.100 (host1) | 192.168.1.100 (host1) | 300         | 600              |

相关内容