bash 스크립트를 사용하여 웹 서버 로그 파일을 처리하고 찾은 IP를 해당 DNS 호스트 이름으로 바꾸려고 합니다.
로그 파일의 한 줄 항목 예는 다음과 같습니다.
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=192.168.1.6 DST=192.168.1.1 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
(예를 들어 윗줄의 개인 정보를 모두 변경했습니다.)
따라서 SRC=192.168.1.6 및 DST=192.168.1.1 위의 두 필드에는 DNS 호스트 이름으로 변환해야 하는 IP 주소가 포함되어 있습니다. 이는 단지 내부 주소일 뿐이며 이는 예시일 뿐입니다.
내 스크립트에 대해 지금까지 내가 생각해낸 내용은 다음과 같습니다.
#!/bin/bash
logFile=$1
while read line
do
for word in $line
do
# if word is ip address change to hostname
if [[ $word =~ 'DST='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
# check if ip address is correct
ip=($word) | cut -d'=' -f 2
echo -n `nslookup $word | grep Name | cut -d' ' -f 8`
echo -n " "
# else print word
else
echo -n $word
echo -n " "
fi
done
# new line
echo
done < "$logFile"
저를 혼란스럽게 하는 부분은 DST= 및 SRC= 필드를 IP 주소로 해석하는 것입니다. DNS 처리 전에 해당 필드를 제거한 다음 DNS 처리 후에 다시 추가하는 구문이 확실하지 않거나 더 좋은 방법이 있는지 잘 모르겠습니다.
사전에 포럼을 검색해 보니 다음과 같은 글이 있었습니다. 표준 명령줄 도구를 사용하여 명령 출력의 모든 IP 주소를 구문 분석합니다.
그러나 내 로그 파일의 형식을 고려하면 작동하지 않는 것 같습니다.
답변1
@Dave, 아래 스크립트를 확인하세요.
입력 파일 예
[mihai@image-host-1 tmp]$ cat demo.log
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.161 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.162 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.163 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.164 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=hostnamesrc DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.164 DST=hostnamedst LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=hostnamesrc DST=hostnamedst LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
- 유효한(DNS 확인 가능 IP) 포함
- 잘못된 IP(*.61. *.63)가 포함되어 있습니다.
- 호스트 이름을 SRC로 포함
샘플 출력
[mihai@image-host-1 tmp]$ ./demo.sh demo.log
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=NODNS-166.78.125.161 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=bangimage.com. DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=NODNS-166.78.125.163 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=NODNS-166.78.125.164 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=hostnamesrc DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=NODNS-166.78.125.164 DST=hostnamedst LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=hostnamesrc DST=hostnamedst LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
실제 스크립트
[mihai@image-host-1 tmp]$ cat demo.sh
#!/bin/bash
logFile=$1
while read logLine
do
# For each log line, find the SRC
# If needed, this can be extended to DSC as well
# ----------------------------------------------
logSRC=`echo $logLine | awk '{print $14}' | awk -F "=" '{print $2}'`
# echo "SRC = ${logSRC}"
# Test if SRC is an IP or not
# ---------------------------
if [[ ${logSRC} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
# echo "${logSRC} is IP"
# Convert IP into hostname via reverse DNS lookup
# -----------------------------------------------
logSRCHOST=`host ${logSRC} | awk '{print $NF}'`
if [[ ${logSRCHOST} =~ 'NXDOMAIN' ]];
then
logSRCHOST="NODNS-${logSRC}"
fi
else
logSRCHOST=${logSRC}
fi
# echo "FINAL SRC = ${logSRCHOST}"
echo $logLine | sed -e "s/SRC.*DST/SRC=${logSRCHOST} DST/g"
done < "$logFile"
답변2
로그 분석
logresolve
이것이 Apache 로그인 경우 Apache와 함께 제공되는 도구를 사용하여 작업을 수행할 수 있습니다.
대체 쉘 스크립트
나는 또한 다음과 같은 제목의 질문과 답변을 발견했습니다.로그의 IP를 호스트 이름으로 바꾸기. 이 질문에 대해 허용되는 답변에는 IP를 DNS 호스트 이름으로 변환하기 위한 다음 셸 스크립트가 포함됩니다.
#!/bin/bash
logFile=$1
while read line
do
for word in $line
do
# if word is ip address change to hostname
if [[ $word =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
# check if ip address is correct
OIFS=$IFS
IFS="."
ip=($word)
IFS=$OIFS
if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
then
echo -n `host $word | cut -d' ' -f 5`
echo -n " "
else
echo -n "$word"
echo -n " "
fi
# else print word
else
echo -n $word
echo -n " "
fi
done
# new line
echo
done < "$logFile"
위 스크립트를 파일 이름으로 저장 ip_to_hostname.sh
하고 다음과 같이 실행합니다.
$ ./ip_to_hostname.sh your_logfile > resolved_ip