통합검색

Linux

Rocky Linux 에서 현재 웹포트(80,443) 에 접속해있는 아이피 상위 N개 출력하기

  • 2025.11.12 00:03:42


현재 서버의 웹포드(80, 443)에 접속해 있는 클라이언트 IP를 상위 N개를 출력하는 셸 스크립트.
서버에 DDOS가 들어온 것으로 추측되는 경우 빠르게 스캔하여 접속량이 많은 상위 IP를 차단하는데 도움을 줄 수 있다.


[!]셸 스크립트 파일 작성[/!] 
아래 내용으로 스크립트 파일을 작성한다.
 
# vi ~/2.top_clients_80_443.sh
  
파일을 먼저 만든 후 아래 내용을 복사 붙여넣기!
 
#!/usr/bin/env bash
# 80/443로 열린 TCP 연결의 클라이언트 IP 상위 N개
# - 상태 필터 X (ss 구문 오류 회피), LISTEN만 제외
# - LocalAddress:Port가 :80 또는 :443으로 끝나는 것만 카운트
# - IPv4/IPv6/스코프 처리

set -euo pipefail

LIMIT="${LIMIT:-50}"                         # 상위 N개
PORTS_REGEX="${PORTS_REGEX:-:(80|443)$}"     # 로컬 포트 필터
SS="${SS:-ss}"                               # ss 경로 커스텀 가능(예: /usr/sbin/ss)

command -v "$SS" >/dev/null 2>&1 || { echo "ss 명령(iproute2)이 필요합니다."; exit 1; }

# -a: 모든 소켓(리슨 포함), -H: 헤더 제거, -n: 숫자
# awk에서 1열(state)이 LISTEN인 건 제외
"$SS" -a -H -n -t \
| awk -v rp="$PORTS_REGEX" '
  $1 == "LISTEN" { next }       # LISTEN 제외
  {
    # 일반 형식: State Recv-Q Send-Q LocalAddress:Port PeerAddress:Port
    local=$4; peer=$5
    # 로컬 포트가 80/443 아니면 제외
    if (local !~ rp) next

    # peer 정리: users:(...) 꼬리 제거
    sub(/,.*$/, "", peer)
    # IPv6 대괄호 제거
    gsub(/^\[/, "", peer); gsub(/\]$/, "", peer)
    # 인터페이스 스코프(%eth0 등) 제거
    sub(/%.+$/, "", peer)
    # 끝의 :포트 제거
    sub(/:[0-9]+$/, "", peer)

    # 로컬루프백 제외(원하면 주석)
    if (peer == "127.0.0.1" || peer == "::1") next

    cnt[peer]++
  }
  END {
    for (ip in cnt) printf "%7d  %s\n", cnt[ip], ip
  }
' \
| sort -nr \
| head -n "$LIMIT"
  

[!]결과 화면[/!]
셸 스크립트를 실행하면 아래와 같이 요약 정보를 보여준다.
 
# ~/2.top_clients_80_443.sh