2017-12-06 11 views
2

ブロックされた接続のUFWファイアウォールログを通過するスクリプトを作成し、接続しようとしていた送信元IPとポートを取り出したいとします。私はこれらを個別に取り出すためにスクリプトをまとめることができました。そして、今すぐスクリプトを入手してIPとポートを1行に出力するのが難しいです。以下は、私が持っているファイアウォールログとスクリプトのサンプルです。現在、すべてのIPを出力し、その後にすべてのポート番号を出力します。各行には、各ログエントリの送信元IPアドレスと対応する宛先ポートが必要です。IPとポート番号のUFWログの解析

最終的な目的は、各IPアドレスが接続しようとしているポートを確認することです。私の計画はuniq -cを使用して、ログから各IPとポートを出力できるようにしました。

入力

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 

出力

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 

./script

SRC=85.93.20.253 SRC=51.15.51.140, DPT=735 DPT=5062 

答えて

1

迅速php解決策は、ソースIPアドレスと対応する宛先ポートの各行に印刷されます。スクリプトは入力ログファイルを行単位で読み取り、各行を処理します。正規表現を使用してIPアドレスとポート番号を変数にマッチさせます。

<?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)ファイルに上記のスクリプトを保存した後、あなたは次のように実行することができますに:

php get-uwf-ip-port.php your_logfile 

出力(ソースファイル

85.93.20.253 735 
51.15.51.140 5062 

UPDATE:あなたの2例ライン)であった

そして、ここにネイティブのbashソリューションがあります。ここでの主な考え方は、ファイルを1行ずつ読み込み、各行をシェル変数に読み込み、シェルパラメータ拡張を使用してipとポート番号を抽出することです。

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 

#!/bin/bash 

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

私は少しそれが上記と同じ結果になります一緒にIPアドレスとポートのマッチングを入れて、あなたのawkコードを修正しました

関連する問題