首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析UFW日志以获取IP和端口号

解析UFW日志以获取IP和端口号
EN

Stack Overflow用户
提问于 2017-12-06 14:30:53
回答 1查看 1.8K关注 0票数 2

我想要写一个脚本,通过我的UFW防火墙日志,以阻止连接,并提取源IP和端口,他们试图连接。我已经成功地将脚本放在一起单独地提取这些脚本,并且很难让脚本现在输出到一行的IP和端口。下面是我所拥有的防火墙日志和脚本的示例。目前,它输出所有it,然后是所有端口号。我想要的每一行是源IP地址和对应的目的端口从每个日志条目。

最终目标是查看每个IP地址试图连接到哪些端口。我的计划是使用uniq -c,一旦我可以从日志输出每个IP和端口。

输入

代码语言:javascript
复制
Nov 26 06:25:11 vps123456 kernel: [620802.845897] [UFW BLOCK] IN=ens3 OUT= MAC=fa:16:3e:9f:c7:5d:11:22:33:44:55:66:77:88 SRC=85.93.20.253 DST=10.20.30.40 LEN=40 TOS=0x00 PREC=0x00 TTL=245 ID=5830 PROTO=TCP SPT=51639 DPT=735 WINDOW=1024 RES=0x00 SYN URGP=0
Nov 26 06:27:44 vps123456 kernel: [620955.012996] [UFW BLOCK] IN=ens3 OUT= MAC=fa:16:3e:9f:c7:5d:11:22:33:44:55:66:77:88 SRC=51.15.51.140 DST=10.20.30.40 LEN=433 TOS=0x00 PREC=0x00 TTL=50 ID=42044 DF PROTO=UDP SPT=5088 DPT=5062 LEN=413

./script

代码语言:javascript
复制
file="input"
for line in $file; do
    addr=$(awk '{match($0,/SRC=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' $file)
    port=$(awk '{match($0,/DPT=[0-9]{0,5}/); port = substr($0,RSTART,RLENGTH); print port}' $file)
    echo $addr, $src >> output
done

输出

代码语言:javascript
复制
SRC=85.93.20.253 SRC=51.15.51.140, DPT=735 DPT=5062
EN

回答 1

Stack Overflow用户

发布于 2017-12-06 16:16:22

为您的问题提供一个快速的php解决方案,它将在每一行上打印源ip地址和相应的目标端口。脚本逐行读取输入日志文件并处理每一行。使用regex将ip地址和端口号匹配到变量中。

代码语言:javascript
复制
<?php

$infile = $argv[1];

$handle = fopen($infile, "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        preg_match('/.*SRC=(?<ip>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)(.*DPT=)(?<port>[0-9]+).*/', $line, $m);
        if ($m) {
            print $m['ip'] . ' ' . $m['port'] . "\n";
        }
    }
    fclose($handle);
} else {
    exit("Unable to open file ($finfile)");
}

将上述脚本保存到文件(即: get-uwf-ip-port.php)中后,可以以下列方式运行:

代码语言:javascript
复制
php get-uwf-ip-port.php your_logfile

输出(源文件是两个示例行):

代码语言:javascript
复制
85.93.20.253 735
51.15.51.140 5062

更新

这里是一个本机bash解决方案。这里的主要思想是逐行读取文件,将每一行读入shell变量,使用shell参数展开提取ip和端口号。

代码语言:javascript
复制
#!/bin/bash

infile="$1"
while read line; do
  ip="${line##*SRC=}"
  ip="${ip%% *}"
  port="${line##*DPT=}"
  port="${port%% *}"
  echo $ip $port
done < "$infile"

我稍微修改了您的awk代码,将ip和端口匹配放在一起--它将产生与上面相同的结果:

代码语言:javascript
复制
awk '{match($0,/SRC=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART+4,RLENGTH-4); match($0,/DPT=[0-9]{0,5}/); port = substr($0,RSTART+4,RLENGTH-4); print ip,port}' your_logfile
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47676718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档