소개
Berkeley Packet Filters(BPF) 실습에 오신 것을 환영합니다!
사람들로 붐비고 시끄러운 경기장에서 특정 대화 하나를 찾아내야 한다고 상상해 보세요. 원시 네트워크 트래픽을 분석하는 것이 바로 그런 느낌입니다. 바쁜 서버는 매초 수천 개의 패킷을 처리할 수 있습니다. 필요한 특정 데이터를 찾으려면 매우 정밀한 거름망이 필요합니다.
이때 바로 Berkeley Packet Filters(BPF) 가 필요합니다. BPF 는 매우 효율적이고 깊게 통합된 기술로, 특수 제작된 그물처럼 원하는 네트워크 트래픽만 골라내고 나머지는 통과시킬 수 있는 규칙을 설정할 수 있게 해줍니다.
중요한 점은 필터링이 단순히 편의를 위한 것이 아니라는 사실입니다. 필터링은 문제가 발생하기 전에 소음을 줄이는 과정입니다. 필터가 없다면 패킷 분석은 금세 정보 과부하로 이어집니다. 필터를 사용하면 거대하고 복잡한 데이터 흐름을 "이 호스트에서 발생하는 트래픽을 보여줘" 또는 "이 포트로 들어오는 웹 요청만 보여줘"와 같은 구체적인 질문으로 바꿀 수 있습니다. 이러한 능력이야말로 tcpdump가 대규모 운영 환경에서도 여전히 유용하게 사용되는 주된 이유입니다.
이번 실습에서는 tcpdump를 사용하여 이러한 BPF 규칙을 작성하는 연습을 합니다. 특정 IP 주소별로 혼란스러운 네트워크 흐름을 필터링하고, 트래픽 방향 (송신 vs 수신) 을 제어하며, 특정 애플리케이션 포트를 타겟팅하는 방법을 배웁니다. 실습을 마칠 때쯤이면 이러한 규칙들을 조합하여 필요한 이벤트만 정밀하게 추출하는 방법을 익히게 될 것입니다.
IP 주소 (호스트/네트워크) 별 필터링
트래픽을 필터링하는 가장 기본적인 방법은 IP 주소로 식별되는 특정 컴퓨터에 집중하는 것입니다. 필터 없이 tcpdump를 실행하면 눈에 보이는 모든 패킷을 무차별적으로 수집합니다. 특정 컴퓨터와 관련된 트래픽을 제외한 나머지를 무시하도록 지시하려면 host 키워드 뒤에 IP 주소를 사용하면 됩니다.
여기서 초보자들이 자주 혼동하는 두 가지 개념을 구분해 보겠습니다. 인터페이스는 패킷을 수신하는 '위치'이고, IP 필터는 그 수신 지점에서 어떤 대화를 원하는지 설명하는 '기준'입니다. 즉, -i lo는 마이크를 어디에 설치할지 결정하는 것이고, host 127.0.0.1은 방 안의 누구의 말을 들을지 결정하는 것입니다.
관찰할 트래픽을 확보하기 위해 환경 내에서 백그라운드 스크립트가 이미 실행 중입니다. 이 스크립트는 항상 내부 IP 주소인 127.0.0.1(localhost 라고도 함) 을 가진 로컬 머신으로 데이터를 지속적으로 전송하고 있습니다.
이 로컬 호스트와 관련된 패킷 5 개를 캡처해 보겠습니다. -i lo를 사용하여 로컬 루프백 인터페이스를 수신하고, -c 5를 사용하여 자동으로 중지하도록 설정합니다.
터미널에서 다음 명령어를 실행하세요:
sudo tcpdump -i lo -c 5 host 127.0.0.1
화면에 다음과 유사한 출력이 표시됩니다:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:15:32.123456 IP localhost.45678 > localhost.http-alt: Flags [S], seq 123456789, win 65495, options [mss 65495,sackOK,TS val 123456 ecr 0,nop,wscale 7], length 0
10:15:32.123489 IP localhost.http-alt > localhost.45678: Flags [S.], seq 987654321, ack 123456790, win 65483, options [mss 65495,sackOK,TS val 123456 ecr 123456,nop,wscale 7], length 0
10:15:32.124000 IP localhost > localhost: ICMP echo request, id 1234, seq 1, length 64
...
5 packets captured
나열된 모든 패킷에 localhost(127.0.0.1의 친숙한 이름) 가 포함되어 있음을 확인하세요. host 필터는 매우 포괄적이어서, 지정된 IP 주소가 데이터를 보냈든 받았든 상관없이 패킷을 캡처합니다.
단일 컴퓨터가 아니라 컴퓨터 그룹 전체를 모니터링해야 하는 경우 host 키워드 대신 net을 사용할 수 있습니다 (예: net 192.168.1.0/24). 지금은 단일 호스트를 탐색하는 것에 집중하겠습니다.
방향 (송신/수신) 별 필터링
특정 컴퓨터가 대화에 참여하고 있다는 것을 아는 것도 도움이 되지만, 때로는 더 정밀한 제어가 필요합니다. 우체국을 상상해 보세요. 어떤 사람이 받는 편지는 무시하고, 그 사람이 보내는 편지만 확인하고 싶을 수 있습니다.
송신 트래픽과 수신 트래픽은 서로 다른 조사 질문에 대한 답을 제공하기 때문에 방향은 중요합니다. 아웃바운드 (송신) 트래픽은 호스트가 어디에 연락하려고 하는지 보여주며, 이는 악성코드 콜백이나 데이터 유출을 추적할 때 유용합니다. 인바운드 (수신) 트래픽은 어떤 서비스가 타겟팅되고 있는지 보여주며, 이는 서버에 대한 스캔이나 공격을 조사할 때 유용합니다.
BPF 는 트래픽의 정확한 방향을 지정할 수 있도록 src(소스) 및 dst(목적지) 수정자를 제공합니다.
127.0.0.1에서 발생하는 패킷만 캡처하도록 필터를 개선해 보겠습니다. src 수정자를 이전의 host 키워드와 결합하여 tcpdump에 무엇을 찾아야 할지 정확히 지시합니다.
다음 명령어를 실행하세요:
sudo tcpdump -i lo -c 3 src host 127.0.0.1
팁: src 127.0.0.1이라고 작성해도 작동합니다. host라는 단어가 생략되어도 자동으로 인식되기 때문입니다. 하지만 src host라고 명시하는 것이 가독성이 훨씬 뛰어나므로 권장되는 방식입니다.
출력 결과는 다음과 같습니다:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:20:15.555111 IP localhost.54321 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 234567 ecr 234567], length 84
10:20:15.555888 IP localhost.http-alt > localhost.54321: Flags [.], ack 85, win 512, options [nop,nop,TS val 234568 ecr 234567], length 0
10:20:16.111222 IP localhost > localhost: ICMP echo request, id 5678, seq 1, length 64
3 packets captured
출력을 자세히 보면 > 기호 앞부분이 발신자 (소스) 를 나타냅니다. 내부 루프백 인터페이스에서 캡처 중이므로 양쪽 모두 localhost로 표시되지만, 여러 컴퓨터가 연결된 실제 환경에서는 src를 사용하면 해당 주소에서 나가는 아웃바운드 트래픽만 확실하게 볼 수 있습니다.
반대로, 수신자 입장에서 머신으로 들어오는 트래픽만 확인하고 싶다면 dst host 127.0.0.1을 사용하면 됩니다.
포트 및 프로토콜별 필터링
IP 주소로 필터링하면 올바른 머신에 도달할 수 있지만, 현대의 서버는 여러 작업을 동시에 수행합니다. 하나의 서버가 웹 서버, 이메일 서버, 보안 액세스 포인트 역할을 동시에 할 수 있습니다. 이러한 서비스들은 포트라고 불리는 번호가 매겨진 "문"을 통해 구분됩니다.
포트는 물리적인 소켓이 아닙니다. 운영 체제가 여러 대화를 동시에 구분하기 위해 사용하는 논리적인 번호입니다. 이것이 바로 "같은 호스트"라고 해서 "같은 애플리케이션"을 의미하지 않는 이유입니다. 한 머신에서 서로 관련 없는 여러 네트워크 활동이 일어날 수 있으며, 포트 필터링을 통해 조사하려는 특정 서비스만 격리할 수 있습니다.
예를 들어, 일반적인 웹 트래픽은 거의 항상 80 번 포트를 통해 흐릅니다. 특정 서비스에 집중하고 나머지를 무시하려면 port 키워드를 사용합니다.
백그라운드 스크립트는 8080 번 포트에서 웹 트래픽을 생성하고 있습니다. tcpdump가 이 특정 포트를 통과하는 데이터만 캡처하도록 설정해 보겠습니다.
다음 명령어를 실행하세요:
sudo tcpdump -i lo -c 4 port 8080
출력 예시:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:25:10.123456 IP localhost.34567 > localhost.http-alt: Flags [S], seq 1122334455, win 65495, options [mss 65495,sackOK,TS val 345678 ecr 0,nop,wscale 7], length 0
10:25:10.123489 IP localhost.http-alt > localhost.34567: Flags [S.], seq 5544332211, ack 1122334456, win 65483, options [mss 65495,sackOK,TS val 345678 ecr 345678,nop,wscale 7], length 0
10:25:10.123501 IP localhost.34567 > localhost.http-alt: Flags [.], ack 1, win 512, options [nop,nop,TS val 345678 ecr 345678], length 0
10:25:10.124111 IP localhost.34567 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 345679 ecr 345678], length 84
4 packets captured
이전 단계에서 ICMP(ping) 패킷이 떠다니고 있었던 것을 기억하실 겁니다. 하지만 이 출력에는 ICMP 패킷이 전혀 보이지 않습니다. port 8080 필터가 관련 없는 모든 잡음을 성공적으로 무시하고 웹 서비스만 깔끔하게 보여주고 있습니다.
포트 외에도 tcp, udp, icmp와 같은 키워드를 사용하여 프로토콜 이름만으로 광범위한 네트워크 프로토콜을 필터링할 수 있습니다. 이를 테스트하기 위해 바쁜 웹 트래픽을 무시하고 ICMP(ping) 패킷만 캡처해 보겠습니다.
다음 명령어를 실행하세요:
sudo tcpdump -i lo -c 2 icmp
출력 예시:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:28:05.999111 IP localhost > localhost: ICMP echo request, id 9012, seq 1, length 64
10:28:05.999133 IP localhost > localhost: ICMP echo reply, id 9012, seq 1, length 64
2 packets captured
port 및 프로토콜 키워드를 사용하면 소음을 뚫고 조사하려는 애플리케이션에 정확히 집중할 수 있습니다.
논리 연산자 (AND/OR) 를 사용한 필터 조합
Berkeley Packet Filters 를 진정으로 마스터하려면 여러 규칙을 결합하는 방법을 배워야 합니다. 실제 조사 상황은 단순하지 않으며, 매우 구체적인 시나리오를 정의해야 할 때가 많습니다.
이 단계에서 BPF 는 단순한 키워드 목록이 아니라 패킷을 위한 작은 쿼리 언어처럼 느껴지기 시작합니다. 원하는 트래픽을 구조적이고 논리적인 방식으로 설명하는 것입니다. 이 사고방식은 나중에 SIEM 검색, 침입 탐지 규칙, 데이터베이스 스타일의 로그 쿼리 등 많은 도구에서 다시 나타나며, 방대한 데이터셋을 정밀한 조건으로 좁히는 습관을 기르는 데 도움이 됩니다.
BPF 는 표준 논리 연산자를 사용하여 조건을 결합할 수 있게 해줍니다:
and(두 규칙 모두 참이어야 함)or(최소한 하나의 규칙이 참이어야 함)not(규칙이 명시적으로 거짓이어야 함)
중요한 팁: Linux 터미널에서 이러한 논리 연산자를 사용할 때는 전체 BPF 표현식을 따옴표로 묶는 것이 좋습니다 (예: "port 80 and tcp"). 이렇게 하면 Linux 셸이 필터 명령어를 시스템 명령어로 오해하는 것을 방지할 수 있습니다.
테스트해 보겠습니다. TCP 프로토콜을 사용하고 동시에 목적지 포트가 8080 인 트래픽만 캡처하려고 합니다.
다음 명령어를 실행하세요:
sudo tcpdump -i lo -c 4 "tcp and dst port 8080"
출력 예시:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:32:15.111222 IP localhost.45678 > localhost.http-alt: Flags [S], seq 2233445566, win 65495, options [mss 65495,sackOK,TS val 456789 ecr 0,nop,wscale 7], length 0
10:32:15.111255 IP localhost.45678 > localhost.http-alt: Flags [.], ack 3344556678, win 512, options [nop,nop,TS val 456789 ecr 456789], length 0
...
4 packets captured
이 결과에서 localhost.http-alt는 항상 > 화살표의 오른쪽에만 나타나며, 해당 포트로 향하는 패킷만 캡처되었음을 증명합니다.
마지막으로 not 연산자를 살펴보겠습니다. 이는 "알려진 소음"을 필터링하여 알 수 없는 트래픽에 집중할 때 매우 유용합니다. 루프백 인터페이스의 모든 트래픽을 모니터링하되, 8080 포트의 시끄러운 웹 트래픽은 제외하고 싶다고 가정해 봅시다.
다음 명령어를 실행하세요:
sudo tcpdump -i lo -c 2 "not port 8080"
출력 예시:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:35:22.333444 IP localhost > localhost: ICMP echo request, id 3456, seq 1, length 64
10:35:22.333466 IP localhost > localhost: ICMP echo reply, id 3456, seq 1, length 64
2 packets captured
tcpdump에 8080 포트를 결과에서 제외하라고 명시했기 때문에, 대신 백그라운드에서 실행 중인 ICMP ping 패킷을 평화롭게 캡처했습니다. and, or, not을 전략적으로 연결하면 어떤 네트워크에서든 필요한 정보만 정확히 볼 수 있는 정밀한 렌즈를 만들 수 있습니다.
요약
축하합니다! 고급 패킷 필터링의 세계에 성공적으로 입문하셨습니다.
혼란스러운 네트워크 흐름 속에서 필요한 정보만 골라내는 방법을 배웠습니다. host 키워드를 사용하여 특정 컴퓨터를 타겟팅하고, src와 dst로 트래픽 흐름 방향을 제어하는 연습을 했습니다. 특정 port와 프로토콜을 필터링하여 특정 애플리케이션을 격리했습니다. 가장 중요한 것은 논리 연산자 (and, or, not) 를 사용하여 이 모든 개별 요소를 결합하고, 정밀하고 구체적인 검색을 수행하는 방법을 익혔다는 점입니다.
이러한 기술은 필수적입니다. 비정상적인 연결을 추적하는 시스템 관리자든, 정교한 공격을 분석하는 보안 분석가든, Berkeley Packet Filters 를 마스터하면 네트워크의 소음에 압도당하는 일은 없을 것입니다. 다양한 조합으로 계속 실험해 보세요!

