리눅스 네트워킹 분야에서 가장 중요한 변화 중 하나는 전통적인 netstat 명령어에서 ss 명령어로의 전환입니다. 이 글에서는 이러한 전환의 배경과 이유, 그리고 ss 명령어의 다양한 활용법을 침해사고 분석 관점까지 포함하여 상세히 알아보겠습니다.

◎ netstat에서 ss 명령어로의 전환 배경
 - 전환 시점과 역사
  > netstat 명령어는 오랜 기간 리눅스와 유닉스 시스템에서 네트워크 연결을 모니터링하는 표준 도구였습니다. 그러나 netstat의 man 페이지에는 "This program is mostly obsolete. Replacement for netstat is ss"라고 명시되어 있어 공식적으로 deprecated된 상태입니다. ss (Socket Statistics) 명령어는 iproute2 패키지의 일부로 netstat을 대체하기 위해 개발되었으며, 현재 대부분의 리눅스 배포판에서 기본적으로 제공됩니다.

 - 배포판별 전환 현황

  > 현재 다양한 리눅스 배포판에서 netstat의 deprecated 상태가 확인됩니다:

  • Arch Linux, CentOS 7/8, RHEL 7 이상: net-tools를 완전히 제거하고 iproute2만 기본 지원
  • Ubuntu: Docker 컨테이너 등 일부 환경에서 net-tools가 기본 설치되지 않음
  • 최근 배포판들: ss 명령어를 권장하며 netstat는 하위 호환성을 위해서만 제공

 

◎ ss 명령어의 주요 장점
 - 기술적 우위
  > ss는 netstat 대비 여러 기술적 장점을 제공합니다:

  > 커널 통신 방식의 차이:

  • netstat: /proc 파일시스템과 ioctl 시스템 콜 사용
  • ss: netlink 소켓 인터페이스 사용

  > netlink 인터페이스는 /proc 인터페이스보다 가벼우며 성능상 우위를 제공합니다. ss 명령어는 커널과 직접 통신하여 더 빠르고 효율적인 데이터 수집이 가능합니다.

 - 성능 및 기능적 장점

  > ss 명령어가 netstat보다 우수한 이유들:

  • 속도: netstat보다 훨씬 빠른 실행 속도
  • 상세 정보: TCP 상태, 타이머, 메모리 사용량 등 더 자세한 소켓 정보 제공
  • 고급 필터링: 강력한 필터링 옵션으로 특정 조건의 연결만 선별 가능
  • 확장성: 대량의 연결을 처리할 때 더 효율적

 

◎ 명령어 옵션별 비교표
 - 기본 소켓 정보 조회

기능 netstat ss 설명
모든 연결 표시 netstat -a ss -a 모든 소켓 상태 표시
TCP 연결만 표시 netstat -t ss -t TCP 연결만 필터링
UDP 연결만 표시 netstat -u ss -u UDP 연결만 필터링
리스닝 포트 표시 netstat -l ss -l 리스닝 상태의 소켓만 표시
프로세스 정보 포함 netstat -p ss -p PID와 프로세스명 표시
숫자 형태로 표시 netstat -n ss -n 호스트명 해석 없이 IP 주소로 표시

 

 - 고급 옵션 비교

기능 netstat ss 설명
통계 정보 netstat -s ss -s 프로토콜별 통계 (내용은 다름)
라우팅 테이블 netstat -r ip route ss에서는 ip 명령어 사용
인터페이스 통계 netstat -i ip -s link ss에서는 ip 명령어 사용
확장 정보 없음 ss -e 타이머 정보 등 확장된 소켓 정보
메모리 정보 없음 ss -m 소켓별 메모리 사용량

 

 - 실무에서 자주 사용되는 조합

목적 netstat ss
모든 TCP 리스닝 포트 + 프로세스 netstat -tlnp ss -tlnp
모든 연결 + 프로세스 정보 netstat -antp ss -antp
특정 포트 연결 확인 netstat -an | grep :80 ss -an sport = :80

 

◎ ss 명령어 기본 사용법
 - 기본 구문과 옵션
  > ss 명령어의 기본 구조는 다음과 같습니다:

# ss [OPTIONS] [FILTER]

 

 - 주요 옵션:

  • -t: TCP 소켓만 표시
  • -u: UDP 소켓만 표시
  • -l: 리스닝 소켓만 표시
  • -a: 모든 소켓 표시
  • -n: 숫자 형태로 표시 (DNS 해석 안함)
  • -p: 프로세스 정보 표시
  • -e: 확장 정보 표시 (타이머 등)
  • -m: 메모리 사용량 표시
  • -i: 내부 TCP 정보 표시

 

 - 기본 사용 예제

모든 활성 연결 표시
# ss

TCP 연결만 표시
# ss -t

리스닝 포트만 표시  
# ss -l

TCP 리스닝 포트와 프로세스 정보
# ss -tlnp

모든 TCP 연결과 프로세스 정보
# ss -antp

 

 - 고급 필터링 기능
  > ss 명령어의 강력한 필터링 기능을 활용한 예제들:

특정 포트로 필터링
# ss -an sport = :22
# ss -an dport = :80

특정 IP 주소로 필터링
# ss dst 192.168.1.100
# ss src 10.0.0.0/8

연결 상태로 필터링
# ss state established
# ss state listening
# ss state syn-sent

복합 필터링
# ss -t state established and sport = :22

 

◎ 침해사고 분석에서의 ss 활용법
 - 네트워크 연결 모니터링
  > 침해사고 분석에서 ss 명령어는 실시간 네트워크 활동 모니터링에 핵심적인 역할을 합니다:

의심스러운 외부 연결 탐지
# ss -antp | grep -E ":(4444|1337|31337|6666)"

비정상적인 리스닝 포트 확인
# ss -tlnp | grep -v -E ":(22|80|443|53|25)"

특정 시간 동안 연결 모니터링
# watch -n 2 'ss -antp | grep ESTAB'

프로세스별 네트워크 사용량 분석
# ss -antp | awk '{print $6}' | sort | uniq -c | sort -nr

 

 - 의심스러운 활동 탐지

다중 연결을 생성하는 프로세스 식별
# ss -antp | awk '/ESTAB/{print $6}' | cut -d'"' -f2 | sort | uniq -c | sort -nr | head -10

비정상적인 포트에서 리스닝하는 서비스
# ss -tlnp | awk '$4 !~ /:22$|:80$|:443$|:53$/ {print}'

특정 디렉토리에서 실행된 프로세스의 네트워크 활동
# ss -antp | grep "/tmp\|/dev/shm\|/var/tmp"

 

 - C&C 통신 탐지
  > Command & Control 서버와의 통신을 탐지하기 위한 ss 활용법:

지속적인 외부 연결 모니터링
# ss -antp state established | grep -v -E "(192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[01])\.)"

비정상적인 연결 패턴 분석
# ss -i | grep -E "rto|rtt" | awk '{print $1, $5}'

암호화된 통신 채널 식별
# ss -antp | grep ":443\|:993\|:995" | grep -v "LISTEN" 

 

◎ BPFDoor 악성코드 분석에서의 ss 활용
 - BPFDoor 개요
  > BPFDoor는 Berkeley Packet Filter(BPF)를 악용하는 리눅스 백도어로, 중국의 위협 행위자 Red Menshen이 수년간 사용해온 것으로 알려져 있습니다. 이 악성코드는 네트워크 패킷을 스니핑하여 매직 패킷을 감지하고 활성화되는 특징을 가지고 있습니다.
 - BPFDoor 탐지를 위한 ss 명령어 활용
  > BPFDoor는 일반적인 리스닝 포트를 열지 않기 때문에 탐지가 어렵지만, ss 명령어를 통해 다음과 같은 방법으로 탐지할 수 있습니다:

BPF 필터의 매직 넘버 확인
# ss -0pb | grep -EB1 --colour "$((0x7255))|$((0x5293))|$((0x39393939))"

의심스러운 프로세스명으로 위장한 네트워크 활동
# ss -antp | grep -E "(kdmtmpflush|haldrund)"

BPFDoor가 사용하는 포트 범위 (42391-43391) 모니터링
# ss -antp | grep -E ":4[23][0-9]{3}"

리다이렉션된 포트 확인
# ss -antp | awk '$1=="tcp" && $4~/:(42[3-9][0-9][0-9]|43[0-3][0-9][0-9])$/ {print}'

 

 - BPFDoor 행위 분석
  > BPFDoor의 특징적인 네트워크 행위를 ss로 모니터링하는 방법:

# iptables 조작으로 인한 포트 리다이렉션 탐지
# BPFDoor는 다음과 같은 iptables 규칙을 생성합니다:
# /sbin/iptables -I INPUT -p tcp -s [공격자IP] -j ACCEPT
# /sbin/iptables -t nat -A PREROUTING -p tcp -s [공격자IP] --dport [목적지포트] -j REDIRECT --to-ports [42391-43390]

리다이렉션된 연결 탐지
# ss -antp | grep -E ":42[0-9]{3}|:43[0-3][0-9]{2}" | while read line; do
    echo "Possible BPFDoor redirect: $line"
done

메모리 기반 실행 파일의 네트워크 활동 (/dev/shm)
# ss -antp | grep "/dev/shm"

위장된 프로세스명 패턴 탐지
# ss -antp | grep -E "(systemd|networkd|resolved)" | grep -v "/usr"

 

 - 실시간 BPFDoor 모니터링

#!/bin/bash
# BPFDoor 실시간 모니터링 스크립트

# BPFDoor 매직 넘버 및 패턴 탐지
watch -n 5 '
echo "=== BPFDoor Detection Monitor ===";
echo "1. Checking BPF magic numbers:";
ss -0pb | grep -EB1 --colour "$((0x7255))|$((0x5293))|$((0x39393939))" 2>/dev/null || echo "No BPF magic detected";

echo -e "\n2. Checking suspicious port range (42391-43391):";
ss -antp | grep -E ":4[23][0-9]{3}" || echo "No suspicious ports detected";

echo -e "\n3. Checking /dev/shm processes:";
ss -antp | grep "/dev/shm" || echo "No /dev/shm processes detected";

echo -e "\n4. Checking disguised process names:";
ss -antp | grep -E "(kdmtmpflush|haldrund)" || echo "No disguised processes detected";
'

 

◎ 침해사고 대응 시나리오별 ss 활용법
 - 초기 트리아지 단계
  > 침해사고 의심 시 초기 네트워크 상태 파악:

1단계: 전체 네트워크 연결 스냅샷
# ss -antp > /tmp/network_snapshot_$(date +%Y%m%d_%H%M%S).txt

2단계: 활성 연결 분석
# ss state established | wc -l  # 총 활성 연결 수
# ss -antp state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10

3단계: 의심스러운 리스닝 포트 확인
# ss -tlnp | grep -v -E ":(22|80|443|53|25|21|23|110|143|993|995|587|465)$"

 

 - 멀웨어 통신 채널 분석

C&C 서버 통신 패턴 분석
# ss -antp | grep -E ":80$|:443$|:8080$|:8443$" | grep ESTAB

비정상적인 DNS 쿼리 패턴
# ss -antp | grep ":53" | grep -v "127.0.0.1\|::1"

P2P 멀웨어 통신 탐지
# ss -antp | awk '$1=="tcp" && $2>0 {print $5}' | sort | uniq -c | sort -nr | head -20

 

 - 데이터 유출 탐지

대용량 데이터 전송 연결 식별
# ss -i | grep -E "bytes_sent:[0-9]{7,}" | head -10

FTP/SFTP를 통한 데이터 유출 탐지
# ss -antp | grep -E ":21$|:22$|:990$|:989$" | grep ESTAB

웹 기반 데이터 유출 탐지
# ss -antp | grep -E ":80$|:443$" | grep ESTAB | wc -l

 

◎ 고급 ss 기능 활용
 - 실시간 모니터링

연결 상태 변화 실시간 모니터링
# watch -d -n 1 'ss -antp | grep ESTAB | wc -l'

특정 프로세스의 네트워크 활동 추적
# watch -n 2 'ss -antp | grep "suspicious_process"'

네트워크 부하 모니터링
# watch -n 5 'ss -s'

 

 - 성능 분석

TCP 연결 품질 분석
# ss -i state established

소켓 메모리 사용량 분석
# ss -m | grep -E "skmem|rcv|snd"

네트워크 지연 분석
# ss -i | grep -E "rto:|rtt:" | head -20

 



 

◎ 보안 고려사항 및 모범 사례
 - 로그 수집 및 보존
  > 침해사고 분석 시 ss 명령어 결과를 적절히 보존하는 방법:

타임스탬프와 함께 로깅
# while true; do
    echo "=== $(date) ===" >> /var/log/network_monitor.log
    ss -antp >> /var/log/network_monitor.log
    sleep 60
done

압축된 로그 저장
# ss -antp | gzip > /forensics/network_$(date +%Y%m%d_%H%M%S).gz 

 

 - 자동화된 모니터링

#!/bin/bash
# 자동화된 이상 징후 탐지 스크립트

THRESHOLD=100
CURRENT_CONNECTIONS=$(ss state established | wc -l)

if [ $CURRENT_CONNECTIONS -gt $THRESHOLD ]; then
    echo "ALERT: High number of connections detected: $CURRENT_CONNECTIONS" | mail -s "Network Alert" admin@company.com
    ss -antp > /tmp/high_connections_$(date +%Y%m%d_%H%M%S).txt
fi

 

◎ 결론
 - ss 명령어는 전통적인 netstat의 대체재로서 더 빠른 성능, 상세한 정보 제공, 그리고 강력한 필터링 기능을 통해 네트워크 분석과 침해사고 대응에서 핵심적인 역할을 합니다. 특히 BPFDoor와 같은 고도화된 악성코드 탐지에서 ss의 고급 기능들은 매우 유용합니다.

 - 주요 이점 요약:

  • 성능 향상: netlink 소켓 기반의 효율적인 커널 통신
  • 상세 정보: TCP 상태, 타이머, 메모리 사용량 등 풍부한 소켓 정보
  • 고급 필터링: 복잡한 조건으로 네트워크 연결을 정밀하게 분석 가능
  • 실시간 모니터링: 침해사고 대응 시 신속한 상황 파악 지원

 

침해사고 대응 전문가들은 netstat의 한계를 이해하고 ss 명령어의 강력한 기능을 숙달하여 최근 위협에 효과적으로 대응할 수 있어야 합니다. 특히 BPFDoor와 같은 은밀한 백도어 탐지에서는 ss의 고급 기능이 필수적입니다.

+ Recent posts