如何从 /var/log/auth.log 获取唯一的 IP 地址?

如何从 /var/log/auth.log 获取唯一的 IP 地址?

我如何在 /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 的回答更加清晰一些。

相关内容