tailコマンドの結果から国コード/名前を取得するには?

tailコマンドの結果から国コード/名前を取得するには?

私は尋ねたこの問題LOGファイルのフィルタリングについて

ログファイルは次のとおりです。

Jan  26 01:05:47 server54 kernel: [41s58.6w4335] INPUT:DROP: IN=eth4 OUT= MAC=d3:ss:43:23:23:43 SRC=1.1.1.1 DST=127.0.0.0 LEN=40 TOS=0x00 PREC=0x00 TTL=254 ID=65259 PROTO=TCP SPT=53252 DPT=22 WINDOW=14600 RES=0x00 RST URGP=0

コマンドは次のとおりです。

tail -f -n 2 /var/log/kern.log | grep 'INPUT' \
| sed -E 's/^([0-9a-zA-Z: ]*[0-9]{2}:[0-9]{2}:[0-9]{2}).* \
(SRC=[0-9.:]+).*(DST=[0-9.:]+).*$/\1 \2 \3/g'

出力は次のとおりです

Jan  26 01:05:47 SRC=1.1.1.1 DST=127.0.0.0

ソースIPアドレス(SRC =)の国(名前またはコード)を取得するコマンドに結果を提供する必要があります。whois結果は次のとおりです。

Jan  26 01:05:47 SRC=1.1.1.1(US) DST=127.0.0.0(GH)

このcommand()またはbashスクリプトに双方向に移動する機能があるかどうかを知りたいですtail。つまり、フィルタリングされたログを印刷した後、別のsedを介して送信元IPアドレスを取得し、SRC =を削除します。

sed -E 's/^.*(SRC=[0-9.:]+).*$/\1/g'| \
 sed -e 's/SRC=//g' | whois ?!!!

次にそれをwhoisコマンドに入力して返し、印刷結果に追加します。

あるいは、各パイプラインの後に以前の結果が消えるので、異なるアプローチを取る必要があります。

答え1

まあ、シェル、awkなどを使用してこれらのタスクを実行することは可能ですが、ローカルのMaxMindデータベースを使用すると、より良い予測可能なパフォーマンスが得られます。 PerlやPythonなどの他の言語を使用すると、たとえばPythonを使用してより読みやすいコードを取得できます。

import re
import fileinput
import geoip2.database

reader = geoip2.database.Reader('GeoLite2-City.mmdb')

for line in fileinput.input():
  # Extract source ip using Regexp
  src_ip_search = re.search("SRC=(\S+)", line)
  if src_ip_search is None:
    continue # Didn't find SRC record for some reason
  src_ip = src_ip_search.group(1)
  # Get ISO name of country for that ip from mmdb
  src_iso_code = reader.city(src_ip).country.iso_code
  print(re.sub("SRC=(\S+)", "SRC=\g<1>({})".format(src_iso_code), line)

答え2

たとえば、次のスクリプトを使用してこれを実行できます。

out=$(awk '/INPUT/ {print $1,$2,$3,$11,$12}' /var/log/kern.log)
sourcec=$(whois $(echo $out|awk -F'[ =]' '{print $5}')|awk '/Country:/ {print $2}')
targetc=$(whois $(echo $out|awk -F'[ =]' '{print $7}')|awk '/Country:/ {print $2}')

関連情報