我如何通过 grep count 和 sort iptables 日志来获取 IP 数量和 DPT?就像我用这个单行代码来获取顶级 IP 数量一样。
egrep -w "Invalid Packet" ipfirewall.log | grep -o '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9]*' | sort | uniq -c | sort -r -n | head
但是如何通过 DPT 获取 IP?因此它将是:
250 192.168.1.1 DPT=3306
150 192.168.1.2 DPT=445
50 192.168.1.3 DPT=23
20 192.168.1.4 DPT=22
日志格式:
Jul 19 04:50:28 server1 kernel: IN=eth0 OUT= MAC=xx:xx SRC=124.153.186.56 DST=xx.xx.xx.xx LEN=60 TOS=0x00 PREC=0x00 TTL=50 ID=19312 DF PROTO=TCP SPT=4379 DPT=23 WINDOW=5840 RES=0x00 SYN URGP=0
Jul 19 04:50:28 server1 kernel: IN=eth0 OUT= MAC=xx:xx SRC=124.153.186.56 DST=xx.xx.xx.xx LEN=60 TOS=0x00 PREC=0x00 TTL=50 ID=47534 DF PROTO=TCP SPT=2339 DPT=23 WINDOW=5840 RES=0x00 SYN URGP=0
-==更新==-
我想我找到了些东西
grep eth0 ipfirewall.log | sed -r 's/.*SRC=(\S+).*PROTO=(\S+).*DPT=(\S+).*/\1 \2 \3/' | sort | uniq -c | sort -r -n
....
5 98.169.236.61 UDP 47841
5 70.177.175.182 TCP 80
5 111.91.181.224 UDP 33468
4 74.82.169.171 TCP 135
4 61.191.56.198 TCP 1433
4 61.176.222.153 TCP 1433
4 61.155.203.4 TCP 1433
4 59.92.155.105 TCP 80
4 121.10.172.216 TCP 1433
4 119.148.162.42 TCP 1433
4 117.197.191.18 TCP 80
3 160.218.75.210 TCP 445
....
答案1
这是 Python 非常擅长的事情。
from collections import Counter
with open('iptables.log', 'r') as log:
ip_addresses = []
for line in log:
valueList = line.split(' ')
valueDict = {
'date':valueList[0]+valueList[1]+valueList[2],
'src_ip':valueList[8][4:]
'dst_ip':valueList[9][4:]
}
ip_addresses.append(valueDict['src_ip'])
print(Counter(ip_addresses))
我相信你可以找到一行代码,但是这更容易编写和维护。
答案2
您可以使用awk
提取您感兴趣的字段,然后像以前一样使用sort
和。uniq
% awk '{print $9 " " $19}' log | sort | uniq -c | sort -gr | head
2 SRC=124.153.186.56 DPT=23
这假设所有字段都存在于所有日志消息中,并且顺序相同。如果不是这种情况,您可能需要使用适当的脚本语言,如 Python 或 Ruby。