로그의 IPv6 GUA(글로벌 유니캐스트 주소)와 *만* 일치하는 정규식

로그의 IPv6 GUA(글로벌 유니캐스트 주소)와 *만* 일치하는 정규식

IPv6 보안을 위한 도구가 거의 없기 때문에 나중에 소스를 공개할 자체 솔루션을 출시하고 싶었습니다. SO: 로그가 많고 사용량이 많은 서버에서 잠재적인 차단을 방지하기 위해 원격 IPv6 연결 로그를 필터링하고 분석하고 처리하는 정규식이 필요합니다. 그래서 저는 일치하는 정규 표현식에만 관심이 있습니다.진짜(실제) IPv6 글로벌 유니캐스트 주소("구아"). 유효하지 않은 주소를 차단하는 데는 가치가 없으므로 IPv6 주소 구성을 검증하는 것이 좋지만 필수는 아닙니다.

이것이 (다소) 어려운 이유:

IPv6 주소가 압축되는 방식(앞의 0이 압축됨)으로 인해 주소는 단일 콜론과 단일 세미콜론으로 구분될 수 있습니다.그리고이중 세미콜론 세트입니다.그리고 이중 세미콜론은 주소가 어떻게 압축되는지에 따라 다른 위치에 나타날 수 있습니다!마지막으로 콜론으로 구분된 주소 문자의 수도 가변적입니다.

따라서 내가 찾고 있는 정규식의 목표는 다음 몇 가지 예 중 하나와 같을 수 있습니다.

2001:db8:800:400::130
2001:db8:800:400::2:135
2001:db8:d::55:1
2001:db8:1ff:8c0:151:164:108:23

나는 위의 내용이 이 혼란스러운 상황에 맞는 정규식을 만드는 것이 어렵다는 것을 실제로 보여 준다고 생각합니다.

정규식의 예상 출력:

  • 정밀한: 일치오직유효한 GUA 주소. 로그의 부분 또는 로컬 GUA가 아닙니다.
  • grep싱글 전용: grep파이프가 grep통과 하지 않습니다 grep...
  • 뛰어난: 정규식은 CPU 리소스를 소모할 수 있습니다. 하나의 답변(현재 삭제됨)은 종료해야 할 때까지 완료하지 않고 거의 3시간 동안 실행되었습니다.
  • 테스트됨: 테스트는 간단하므로 게시하기 전에 정규 표현식이 올바르게 일치하는지 확인하세요. 당연한 것 같지만...

예:

grep "your RegEx Goes Here" /var/log/messages | sort -u

빠르고 정확하며 성능이 뛰어난 멋진 GUA 주소 목록을 제공해야 합니다.

예제 grep의 출력은 원하는 출력을 보여줍니다.

임의로 선택할 수 있는:

정규식은 최소한 .NET 파일에 있는 실제 완전한 GUA IPv6 주소를 식별해야 합니다 /var/log/messages. 하지만: 정규식이 모든 입력을 검증하여 주소 구성이 유효한지 확인할 수 있다면 더욱 좋습니다!

게시해주세요페이스트빈모든 사람이 결과를 보고 비교할 수 있도록 테스트 결과를 제공합니다. 동일한 서버에 게시된 모든 정규식을 실행하여 결과와 성능을 비교하겠습니다. 가장 우수하고 성능이 뛰어나며 가장 정확한 정규식은 천재성을 인정받아 오픈 소스 솔루션에 사용됩니다.

답변1

고쳐 쓰다:

뒤쪽에@ilkkachu이전 정규식에 범위가 누락된 것을 발견한 후 처음부터 다시 작성하고 테스트하여 4300개 이상의 결과 샘플을 검토했습니다. 또한 검토할 수 있도록 붙여넣기 상자가 새로운 결과로 업데이트됩니다. 옳은 것 같지만 깨끗하고 독립적인 눈으로 판단하는 것이 가장 좋습니다.

노트:

3000:0000::/4다음 정규식은 테스트를 거쳐 3ffe::/16, 및 를 제외하고 GUA 주소 지정으로 지정된 IANA 전역 주소 유니캐스트 할당을 올바르게 처리하는 것으로 확인되었습니다 5f00::/8. 후자의 2개 범위는 6개 뼈에 대한 것이었고 현재는 더 이상 사용되지 않습니다. 이러한 범위는 반환되어 예약되었으며 3000:0000::/4야생에서는 발견되지 않으며 절대 사용할 수 없습니다. 그래서 저는 제가 선택한 정규식을 통해 이러한 문제를 해결했습니다. 버그가 발견되었다는 피드백이 동반된 경우 반대 투표를 환영합니다. 사실, 저는 제 아이디어를 면밀히 조사하기 위해 여기에 글을 게시하고 있습니다. ;-)

해결책:

IPv6 RegEx에 대한 다양한 스택 사이트에서 찾은 다른 모든 질문은 IPv6 주소 지정의 주방 싱크와 일치하기에는 너무 광범위한 스펙트럼을 다루고 있습니다. grepIP 블랙리스트의 출력을 사용하는 것(나의 궁극적인 목표) 이라면 정확성이 부족한 것이 큰 문제가 될 수 있습니다. 놀랍게도 Google 검색에서도 결과가 나오지 않았습니다.

따라서 다른 사람들이 동일한 문제를 해결하는 데 시간을 낭비하지 않도록 IPv6 GUA 주소만 일치시키는 방법을 생각해 냈습니다.:

time grep -Eo "2[0-9a-fA-F]{3}:(([0-9a-fA-F]{1,4}[:]{1,2}){1,6}[0-9a-fA-F]{1,4})" /var/log/messages | sort -u >> /root/GUA-RegEx-Results.txt

시험:

정규식 - 내 테스트에서 *매우바쁜 DNS 서버 - 유효한 일치인 것 같습니다.IANA의 글로벌 주소 유니캐스트 할당. 테스트할 때 특히 다음과 관련된 오류를 찾고 있습니다.

  • 일부 GUA 주소

시험 결과:

그러한 오류는 관찰되지 않았으며 내 결과를 검토할 수 있습니다.여기 (참고하세요:이 Pastebin 목록의 어떤 주소에서도 악용 사례가 추론되어서는 안 됩니다.).

결과 검증 도구:

IPv6 CIDR 계산기

IPv6 주소 할당 검사기

주소를 복사하여 살펴보고 위 링크에서 징글을 발견했는지 확인하세요.

성능:

1.5GB /var/log/messages 파일을 필터링하기 위해 다음 성능이 관찰되었습니다.

유효한 고유 IPv6 주소 찾기:

  • 4345

속도:

  • 실제 0미터 56.346초
  • 사용자 0m28.916s
  • 시스템0m0.328s

좀 더 타이트하고 우아한게 있다면(괴짜들은 재미있는 정규식 도전을 좋아합니다. 직접 도전해 봅시다.) 꼭 답변에 기여해 주세요.

관련 정보