我如何在 /var/log/auth.log 中仅显示唯一 IP 地址?我的服务器不断受到攻击,尽管我设置了 fail2ban,但请求仍不断涌来。因此,我开始写信给 ISP,要求关闭帐户,这可能有点帮助,但攻击太多了……无论如何,
我使用这个命令对今天的命中进行排序:$grep -e 'ruser \| rhost' auth.log | grep -e 'Jun 9' | sort -k 14 | less
其数千次攻击......或暴力破解尝试。
以下是来自 auth.log 的一些相关内容:
...
Jun 9 10:08:35 nan sshd[23397]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53
Jun 9 10:08:51 nan sshd[23401]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53
Jun 9 10:09:07 nan sshd[23428]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53
Jun 9 10:01:59 nan sshd[23216]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:02:52 nan sshd[23238]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:03:08 nan sshd[23246]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:03:40 nan sshd[23256]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:04:14 nan sshd[23270]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:04:31 nan sshd[23276]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:05:23 nan sshd[23298]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:05:55 nan sshd[23315]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:06:49 nan sshd[23343]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:07:47 nan sshd[23375]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:08:02 nan sshd[23383]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:09:47 nan sshd[23440]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:10:02 nan sshd[23444]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=root
Jun 9 10:09:27 nan sshd[23436]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.109.161.53 user=sshd
Jun 9 05:27:00 nan sshd[20293]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.134.44.86
....
我想列出 auth.log 中唯一的 IP 地址。
我尝试使用gawk -F: '{ print $14 }' auth.log | uniq -c
但我想我做错了什么。我只想要一份今天的 IP 地址排序列表。我该怎么做?
答案1
uniq
仅检测邻近的重复 - 你需要先排序
awk '{print $14}' auth.log | sort | uniq
或者使用sort
命令本身的-u
选项
awk '{print $14}' auth.log | sort -u
或者(因为你已经在使用awk
)
awk '!seen[$14]++ {print $14}' auth.log
(该rhost=
条目是第 14 个空格分隔的字段 - 不需要-F:
)
答案2
和grep
我发现您在匹配模式方面有点挣扎,grep
因为您似乎需要在打印唯一的 IP 之前匹配一些模式......所以,......:
我将使用grep
的选项-o
仅打印匹配的部分并启用Perl 风格的正则表达式使用-P
:
Jun
匹配Jun
然后...\s+
匹配一个或多个空格然后......9
匹配9
然后....*
匹配任意内容直到...ruser=
匹配然后....*
匹配任意内容直到...rhost=
匹配然后...- 使用 Perl 的打印功能排除上述所有内容
\K
,然后...... - 匹配一个 IP,
\d+\.\d+\.\d+\.\d+
其中\d+
匹配一个或多个数字并\.
匹配一个文字点,然后... - 将输出通过管道传输到
sort -u
仅打印唯一 IP,如下所示:
grep -oP 'Jun\s+9.*ruser=.*rhost=\K\d+\.\d+\.\d+\.\d+' auth.log | sort -u
和gawk
或者因为你似乎GNU AWK安装后,您就可以完成所有操作(包括分类...利用预定义阵列扫描顺序)gawk
如下所示:
gawk 'BEGIN {
FS = "[= ]*"
PROCINFO["sorted_in"] = "@ind_num_asc"
}
/Jun\s+9/ && /ruser/ && /rhost/ {
a[$18]++
}
END {
for (i in a) {
printf "%s\n", i
}
}' auth.log
答案3
$ egrep -o '[1-2]?[0-9][0-9]?\.[1-2]?[0-9][0-9]?\.[1-2]?[0-9][0-9]?\.[1-2]?[0-9][0-9]?' /var/log/auth.log \
|sort -u
我编写了正则表达式模式,但任何与 IP 地址匹配的正则表达式模式(网上有很多)都应该被允许。
对于在任何日志中搜索 IP 地址很有用。
尽管 IP 每个段中的第一位数字只能是 1 或 2(忽略 IPv6 地址),Raffa 的回答更加清晰一些。