我已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 |