로컬 IP를 제외한 파일에서 IP 주소 찾기

로컬 IP를 제외한 파일에서 IP 주소 찾기

: 로컬 LAN(192.168.1.x 유형의 클래스 C 주소 사용) 이외의 모든 (IPv4) IP 주소를 포함하는 파일에서 행을 찾아 인쇄합니다. 나는 다음과 같은 몇 가지 파이프라인을 사용하여 sed이 작업을 상당히 효율적으로 수행했습니다 (다양한 온라인 검색에서 내용을 가져옴) .

sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' logfile.txt | sed '/192\.168\.[[:digit:]]\.[[:digit:]]\{,3\}/d'

질문: 대체 유틸리티를 사용하여 이를 수행할 수 있는 다른 방법이나 더 좋은 방법이 있습니까? 아니면 제가 생각해낸 주문을 개선할 수 있습니까?

배경: 목적은 시스템이 아닌(Void Linux) 시스템에서 SSH 연결 정보가 포함된 시스템 로그 파일을 매일 검색하여 로컬 LAN의 호스트 외에 누가 SSH 연결/쿼리 설정을 시도했는지 확인하는 것입니다. daily를 사용하여 대상 정보가 포함된 파일을 생성한 svlogtail후 위 명령을 실행합니다. 그런 다음 시스템은 결과를 나에게 이메일로 보냅니다.

입력 데이터 예시:

2020-06-21T08:28:04.56472 auth.err: sshd[21813]: error: Bind to port 22 on 192.168.2.16 failed: Cannot assign requested address.  
2020-06-23T11:12:59.04698 auth.info: Jun 23 06:12:59 sshd[25036]: banner exchange: Connection from 194.61.24.4 port 1565: invalid format  
2020-07-14T14:53:30.54107 auth.info: Jul 14 09:53:30 sshd[30149]: banner exchange: Connection from 31.207.47.114 port 1848: invalid format  
2020-09-06T15:25:19.32385 auth.info: Sep  6 10:25:19 sshd[18826]: banner exchange: Connection from 193.142.146.216 port 30884: invalid format  
2021-01-30T16:03:43.39251 auth.info: Jan 30 10:03:43 sshd[32208]: rexec line 80: Unsupported option GSSAPIAuthentication  
2021-02-05T12:24:30.42762 auth.info: Feb  5 06:24:30 sshd[27489]: banner exchange: Connection from 94.232.47.170 port 107: invalid format  
2021-02-19T15:48:10.29592 auth.info: Feb 19 09:48:10 sshd[2924]: Disconnected from user 192.168.1.10 port 33732

원하는 출력sed(이 허용 가능한 출력은 위 명령을 실행한 후 얻은 결과입니다.)

2020-06-23T11:12:59.04698 auth.info: Jun 23 06:12:59 sshd[25036]: banner exchange: Connection from 194.61.24.4 port 1565: invalid format  
2020-07-14T14:53:30.54107 auth.info: Jul 14 09:53:30 sshd[30149]: banner exchange: Connection from 31.207.47.114 port 1848: invalid format  
2020-09-06T15:25:19.32385 auth.info: Sep  6 10:25:19 sshd[18826]: banner exchange: Connection from 193.142.146.216 port 30884: invalid format  
2021-02-05T12:24:30.42762 auth.info: Feb  5 06:24:30 sshd[27489]: banner exchange: Connection from 94.232.47.170 port 107: invalid format

나중에 요약이런 종류의 작업을 수행하는 가장 우아한 방법은 확실히 입니다 grepcidr. 이 작업을 수행하기 전에 이에 대해 알고 있었다면 분명히 사용했을 것입니다. sed동일한 목표를 달성하기 위한 여러 가지 방법(내가 게시한 명령 및 파이프 포함)이 있지만 이것을 답변에 대한 응답으로 사용하라는 제안을 표시하겠습니다 . 이 명령은 또는 를 사용하는 것보다 여러 주소 범위를 더 쉽게 지정할 수 있으므로 grepcidr이러한 유형의 작업에 대한 적응성이 뛰어납니다 .sedgrep

grep그런데, 다음과 같이 함께 파이프하면 동일한 결과를 제공하는 몇 가지 명령도 발견했습니다 .

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' logfile.txt | grep -v 192.168.[[:digit:]].[[:digit:]]

답변1

192.168.0.0/16블록에 주소가 포함된 행을 필터링하려는 것 같습니다 . 다음과 같은 방법으로 이 작업을 수행할 수 있습니다 grepcidr.

$ grepcidr -v '192.168.0.0/16' file
2020-06-23T11:12:59.04698 auth.info: Jun 23 06:12:59 sshd[25036]: banner exchange: Connection from 194.61.24.4 port 1565: invalid format
2020-07-14T14:53:30.54107 auth.info: Jul 14 09:53:30 sshd[30149]: banner exchange: Connection from 31.207.47.114 port 1848: invalid format
2020-09-06T15:25:19.32385 auth.info: Sep 6 10:25:19 sshd[18826]: banner exchange: Connection from 193.142.146.216 port 30884: invalid format
2021-02-05T12:24:30.42762 auth.info: Feb 5 06:24:30 sshd[27489]: banner exchange: Connection from 94.232.47.170 port 107: invalid format

또는 "192.168.1.0과 192.168.2.255 사이"와 같은 특정 범위를 사용하려는 경우:

$ grepcidr -v '192.168.1.0-192.168.2.255' file
2020-06-23T11:12:59.04698 auth.info: Jun 23 06:12:59 sshd[25036]: banner exchange: Connection from 194.61.24.4 port 1565: invalid format
2020-07-14T14:53:30.54107 auth.info: Jul 14 09:53:30 sshd[30149]: banner exchange: Connection from 31.207.47.114 port 1848: invalid format
2020-09-06T15:25:19.32385 auth.info: Sep 6 10:25:19 sshd[18826]: banner exchange: Connection from 193.142.146.216 port 30884: invalid format
2021-02-05T12:24:30.42762 auth.info: Feb 5 06:24:30 sshd[27489]: banner exchange: Connection from 94.232.47.170 port 107: invalid format

모든 개인 IPv4 블록을 필터링하려면 다음을 사용하십시오.

grepcidr -v '10.0.0.0/8,172.16.0.0/12,192.168.0.0/16' file

grepcidrIPv6도 이해해야 하는데 모르기 때문에 예를 보여주지 않겠습니다.

답변2

나는 이런 종류의 작업에 가장 적합한 도구라고 grep생각 합니다 .PCRE

grep -Po "(?<=from )(\d{1,3}\.){3}\d{1,3}(?= port)" file | grep -Ev "^192\.168\.1\.[[:digit:]]{1,3}$"

네트워크에 기본 클래스 C 마스크가 있다고 가정합니다 /24.

더 나은 접근 방식은 귀하의 경우 LAN 호스트와 같은 필수 호스트에 대한 로깅을 건너뛰는 것입니다.

또한 로거의 출력은 이상적이지 않으며 구문 분석할 수 없습니다. 방화벽의 로깅 모듈 과 같은 더 나은 로거는 iptables보다 정교한 방식으로 구문 분석할 수 있습니다.

Feb 27 00:32:33 hostname kernel: [181663.827178] [HTTPS-ATTEMPT]IN=eno1 OUT= MAC=aa:bb:cc:dd:ee:ff:ff:ee:dd:cc:bb:aa:08:00 SRC=X.X.X.X DST=X.X.X.X LEN=40 TOS=0x00 PREC=0x00 TTL=242 ID=54321 PROTO=TCP SPT=42717 DPT=443 WINDOW=65535 RES=0x00 SYN URGP=0 

로컬 LAN 호스트에 대한 로깅을 건너뛸 수 있으면 grep파이프 없이 두 번째 라운드가 첫 번째 라운드에서 중지될 수 있습니다.

python@Praveen Kumar BS는 작업을 수행하는 데 좋은 모듈을 생각하게 했습니다 .ipaddrress

#!/usr/bin/python3
import ipaddress
import re

lan = ipaddress.IPv4Network("192.168.1.0/24")

with open("stack.log", 'r') as log:
    for line in log:
        curr_ip = re.search(r'(?<=from )(\d{1,3}\.){3}\d{1,3}\b', line)
        if curr_ip and not ipaddress.IPv4Address(curr_ip.group()) in lan:
            print(curr_ip.group())

내 예에서는 정규식 캡처를 통해 주소를 만들고 ipaddress해당 주소가 특정 네트워크에 있는지 확인할 수 있습니다 .lan

답변3

GNU grep또는 유사한 정규식 지원 기능을 grep사용 하면 perl부정 예측 연산자를 사용할 수 있습니다.

grep -P '\b(?!192\.168\.)(\d{1,3})(\.(?1)){3}\b'

또는 직접 사용하십시오 perl.

perl -ne 'print if /\b(?!192\.168\.)(\d{1,3})(\.(?1)){3}\b/'

이러한 보고서에는 시작 IP 주소를 4진수로 나눈 줄이 포함되어 있습니다 . 이 줄에는 IP 주소 192.168.도 포함되어 있습니다 .192.168.x.y

IP 주소의 보다 긴밀한 일치를 위해 다음 Regexp::Common::net모듈을 사용할 수 있습니다.

perl -MRegexp::Common=net -ne '
  print if m{
    \b$RE{net}{IPv4}{-keep}\b
    (?(?{$2 == 192 && $3 == 168}) (*FAIL))
  }x'

답변4

주문하다:

awk '!/192.168.*.*/{for(i=1;i<=NF;i++){if($i ~ /^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$/){print $i}}}' filename

산출

194.61.24.4
31.207.47.114
193.142.146.216
94.232.47.170

파이썬

#!/usr/bin/python
import re
k=re.compile(r'192.168.*.*')
c=re.compile(r'^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*')
m=open('p.txt','r')
for i in m:
    if not re.search(k,i):
        z=i.split(' ')
        for v in range(0,len(z),1):
            if re.search(c,z[v]):
                print z[v]
            

산출

194.61.24.4
31.207.47.114
193.142.146.216
94.232.47.170

관련 정보