와이어샤크(Wireshark)는 리눅스, 윈도우, macOS 환경에서 활용 가능한 세계적인 수준의 패킷 분석 도구입니다. 필터 기능은 매우 유연하고 정교하지만, 때로는 직관적이지 않을 수 있습니다. 이 글에서는 사용 시 주의해야 할 몇 가지 사항을 살펴보겠습니다.
패킷 분석의 실제 예시
와이어샤크는 오픈소스 세계의 주요 소프트웨어 중 하나입니다. 네트워킹 문제를 조사하고 진단하는 데 전문가뿐 아니라 일반 사용자도 널리 사용하는 도구입니다. 소프트웨어 개발자는 이를 활용하여 통신 과정에서 발생하는 오류를 정확하게 파악하고 분석하며, 보안 연구원은 네트워크에서 발생하는 악성 활동을 식별하고 추적합니다.
일반적인 사용법은 캡처 모드로 와이어샤크를 실행하여 컴퓨터의 네트워크 인터페이스를 통해 전송되는 트래픽을 기록하는 것입니다. 캡처된 패킷은 실시간으로 화면에 표시되지만, 네트워크 활동의 세부적인 분석은 캡처가 완료된 후에 진행됩니다.
캡처된 패킷 데이터는 “추적”이라고 불립니다. 캡처가 완료되면, 추적 데이터를 패킷 단위로 분석할 수 있습니다. 각 패킷의 상세 정보를 확인하고, 장치 간의 네트워크 “대화” 흐름을 파악하며, 필터를 사용하여 특정 패킷을 분석에 포함하거나 제외할 수 있습니다.
와이어샤크의 필터링 기능은 뛰어난 유연성과 정확성을 제공하지만, 필터 구문에는 미묘한 부분이 있어 사용자가 기대하는 결과와 다를 수 있습니다.
필터 작동 방식을 제대로 이해하지 못하면 와이어샤크의 잠재력을 최대한 활용하지 못하고 소프트웨어 기능을 제한적으로 사용하게 될 수 있습니다.
와이어샤크 설치
와이어샤크를 설치할 때, 일반 사용자 계정으로 네트워크 트래픽을 캡처할 수 있도록 허용할지 여부를 묻는 메시지가 나타납니다. 모든 사용자가 네트워크 활동을 볼 수 있도록 허용하는 것을 꺼릴 수도 있지만, 와이어샤크를 루트 권한으로만 실행하도록 설정하면 프로그램의 모든 구성 요소가 높은 권한으로 실행됩니다.
와이어샤크는 200만 줄이 넘는 복잡한 코드로 구성되어 있으며, 시스템의 가장 낮은 수준에서 상호작용합니다. 보안상의 이유로, 특히 낮은 수준에서 작동하는 코드의 경우 높은 권한으로 실행되는 코드를 최소화하는 것이 좋습니다.
일반 사용자 계정으로 와이어샤크를 실행하는 것이 훨씬 안전합니다. 와이어샤크를 실행할 수 있는 사용자는 여전히 제한할 수 있으며, 이를 위해 몇 가지 추가 설정 단계를 거쳐야 하지만 이것이 가장 안전한 방법입니다. 데이터 캡처 요소는 높은 권한으로 실행되지만 와이어샤크의 나머지 부분은 일반 프로세스로 실행됩니다.
Ubuntu에서 설치하려면 다음 명령어를 입력합니다.
sudo apt-get install wireshark

Fedora에서는 다음 명령어를 사용합니다.
sudo dnf install wireshark

Manjaro에서는 다음 명령어를 실행합니다.
sudo pacman -Syu wireshark-qt

설치 과정에서 와이어샤크를 루트로 실행하지 않도록 권장하는 화면이 표시됩니다. Tab 키를 눌러 빨간색 강조 표시를 “

다음 화면에서 Tab 키를 눌러 빨간색 강조 표시를 “

와이어샤크를 실행하려면 설치 중에 생성되는 “wireshark” 그룹의 구성원이어야 합니다. 이를 통해 와이어샤크를 실행할 수 있는 사용자를 관리할 수 있습니다. “wireshark” 그룹에 속하지 않은 사람은 와이어샤크를 실행할 수 없습니다.
“wireshark” 그룹에 자신을 추가하려면 다음 명령어를 실행하십시오.
sudo usermod -a -G wireshark $USER
새 그룹 구성원 자격을 적용하려면 로그아웃 후 다시 로그인하거나 다음 명령어를 사용할 수 있습니다.
newgrp wireshark
새 그룹에 속해 있는지 확인하려면 다음 명령어를 실행합니다.
groups

그룹 목록에 “wireshark”가 표시되어야 합니다.
와이어샤크 시작하기
와이어샤크는 아래의 명령어를 통해 실행할 수 있습니다. 앰퍼샌드(&) 기호는 와이어샤크를 백그라운드 작업으로 실행하여 터미널 창을 계속 사용할 수 있도록 합니다. 터미널 창을 닫더라도 와이어샤크는 계속 실행됩니다.
다음 명령어를 입력합니다.
Wireshark &

와이어샤크 인터페이스가 실행됩니다. 컴퓨터의 네트워크 인터페이스 장치들이 내장된 가상 장치들과 함께 목록으로 표시됩니다.

인터페이스 옆에 있는 물결 모양의 선은 해당 인터페이스가 활성화되어 있으며 네트워크 트래픽이 흐르고 있음을 나타냅니다. 평평한 선은 인터페이스에 활동이 없음을 의미합니다. 이 목록의 첫 번째 항목인 “enp0s3″은 이 컴퓨터의 유선 연결에 해당하며, 예상대로 활동을 보여줍니다.
패킷 캡처를 시작하려면 “enp0s3″을 마우스 오른쪽 버튼으로 클릭한 다음 컨텍스트 메뉴에서 “캡처 시작”을 선택합니다.

와이어샤크가 캡처하는 트래픽 양을 줄이기 위해 필터를 설정할 수 있습니다. 모든 트래픽을 캡처한 다음 분석 시 필요하지 않은 트래픽을 필터링하는 방법을 선호합니다. 이렇게 하면 모든 네트워크 활동이 추적에 포함된다는 것을 확인할 수 있습니다. 캡처 필터로 인해 조사 중인 상황과 관련된 네트워크 이벤트를 놓치지 않도록 하는 것이 중요합니다.
물론 트래픽이 많은 네트워크의 경우 추적 파일 크기가 빠르게 증가할 수 있으므로 캡처 시 필터링이 유용할 수 있습니다. 또한 사용자의 선호도에 따라 캡처 시 필터링을 사용할 수도 있습니다.

위 그림에서 강조 표시된 아이콘은 왼쪽에서 오른쪽으로 다음을 나타냅니다.
상어 지느러미: 파란색이면 클릭 시 패킷 캡처가 시작됩니다. 와이어샤크가 패킷을 캡처하는 동안에는 이 아이콘이 회색으로 표시됩니다.
정사각형: 빨간색이면 클릭 시 진행 중인 패킷 캡처가 중지됩니다. 와이어샤크가 패킷을 캡처하지 않을 때는 이 아이콘이 회색으로 표시됩니다.
원형 화살표가 있는 상어 지느러미: 녹색이면 클릭 시 현재 진행 중인 추적이 중지됩니다. 이렇게 하면 캡처된 패킷을 저장하거나 삭제하고 추적을 다시 시작할 수 있습니다. 와이어샤크가 패킷을 캡처하지 않을 때는 이 아이콘이 회색으로 표시됩니다.
추적 분석
빨간색 사각형 아이콘을 클릭하면 데이터 캡처가 중지되어 캡처된 패킷을 추적에서 분석할 수 있습니다. 패킷은 시간 순서대로 표시되며 패킷 프로토콜에 따라 색상으로 구분됩니다. 강조 표시된 패킷의 세부 정보는 와이어샤크 인터페이스의 두 하단 창에 표시됩니다.

추적을 더 쉽게 분석하는 방법 중 하나는 와이어샤크가 패킷의 소스 및 대상 IP 주소에 의미 있는 이름을 부여하도록 설정하는 것입니다. 이 설정을 활성화하려면 보기 > 이름 확인을 클릭하고 “네트워크 주소 확인”을 선택합니다.
와이어샤크는 각 패킷을 주고받는 장치의 이름을 확인하려고 시도합니다. 모든 장치를 식별할 수는 없지만, 추적을 이해하는 데 도움이 되는 장치 이름을 확인할 수 있습니다.

디스플레이를 왼쪽으로 스크롤하면 오른쪽에 더 많은 열이 나타납니다. 정보 열에는 와이어샤크가 패킷에서 감지할 수 있는 모든 정보가 표시됩니다. 아래 예에서는 여러 개의 핑 요청과 응답이 나타납니다.

기본적으로 와이어샤크는 추적된 순서대로 모든 패킷을 표시합니다. 여러 장치가 동시에 패킷을 주고받기 때문에, 두 장치 간의 단일 대화에 다른 장치의 패킷이 뒤섞여 나타날 수 있습니다.
특정 대화를 분석하기 위해 프로토콜별로 패킷을 분리할 수 있습니다. 각 패킷의 프로토콜은 프로토콜 열에 표시됩니다. 표시되는 대부분의 프로토콜은 TCP/IP 제품군에 속합니다. 특정 프로토콜을 지정하거나 이더넷을 포괄적인 옵션으로 사용할 수 있습니다.
분석하려는 시퀀스의 패킷을 마우스 오른쪽 버튼으로 클릭한 다음, 대화 필터 > 이더넷을 선택합니다. 아래 예에서는 핑 요청 패킷을 선택했습니다.

자동으로 생성된 필터에 따라 패킷 시퀀스는 다른 패킷이 섞이지 않고 표시됩니다. 필터 구문이 올바르면 필터 표시줄에 녹색으로 강조 표시됩니다.
필터를 지우려면 필터 표시줄에서 “X”를 클릭합니다.
나만의 필터 만들기
필터 표시줄에 간단한 필터를 입력해 보겠습니다.
ip.addr == 192.168.4.20
이 필터는 IP 주소가 192.168.4.20인 장치에서 보내거나 받은 모든 패킷을 선택합니다. 등호(==) 사이에는 공백이 없어야 합니다.

특정 장치(소스)에서 보낸 패킷을 보려면 ip.src를 사용할 수 있습니다. 특정 장치(대상)에 도착한 패킷을 보려면 아래와 같이 ip.dst를 사용할 수 있습니다.
ip.dst == 192.168.4.20 && ip.src == 192.168.4.28

이중 앰퍼샌드(&&)는 논리적 “and”를 나타냅니다. 이 필터는 192.168.4.28에서 192.168.4.20으로 도착한 패킷을 찾습니다.
와이어샤크 필터를 처음 사용하는 사람들은 이와 같은 필터가 두 IP 주소 사이의 모든 패킷을 캡처할 것이라고 생각할 수 있지만, 실제로는 그렇지 않습니다.
실제로 수행하는 작업은 IP 주소 192.168.4.20에서 들어오고 나가는 모든 패킷을 필터링하는 것입니다. 또한 IP 주소 192.168.4.28의 모든 패킷에 대해서도 동일한 작업을 수행합니다. 즉, 해당 IP 주소로 들어오고 나가는 모든 트래픽을 필터링합니다.
다른 프로토콜의 활동을 찾을 수도 있습니다. 예를 들어, 다음 필터를 입력하여 HTTP 요청을 찾을 수 있습니다.
http.request

특정 장치에서 주고받는 패킷을 제외하려면 느낌표(!)를 사용하고 필터를 괄호로 묶습니다. [()]
!(ip.addr == 192.168.4.14)
이 필터는 192.168.4.14와 주고받는 모든 패킷을 제외합니다.

필터에 등호 연산자(==)가 포함되어 있기 때문에 직관적이지 않을 수 있습니다. 다음과 같이 입력할 수 있다고 생각할 수 있지만:
ip.addr !=192.168.4.14
이 필터는 작동하지 않습니다.
프로토콜별로 패킷 내에서 문자열을 검색할 수도 있습니다. 다음 필터는 전송 제어 프로토콜 (TCP) 패킷에서 “youtube” 문자열을 검색합니다.
tcp contains youtube

재전송을 찾는 필터는 연결 문제를 확인하는 데 유용합니다. 재전송은 초기 전송 중에 손상되거나 손실되어 재전송되는 패킷입니다. 재전송이 너무 많으면 연결이 느리거나 장치 응답 시간이 느려지는 문제를 나타낼 수 있습니다.
다음 명령어를 입력합니다.
tcp.analysis.retransmission

연결의 시작, 유지 및 종료, 그리고 암호화
두 장치 간의 네트워크 연결은 한 장치가 다른 장치에 접촉하고 SYN(동기화) 패킷을 보낼 때 시작됩니다. 그런 다음 수신 장치는 SYN을 수락할지 여부를 나타내는 ACK(승인) 패킷을 보냅니다.
SYN과 ACK는 실제로 같은 패킷에 포함된 두 개의 플래그입니다. 원래 장치는 ACK를 보내 SYN을 확인하고 장치 간에 네트워크 연결이 설정됩니다.
이러한 과정을 3방향 핸드셰이크라고 합니다.
A -> SYN -> B A ACK -> B
아래 스크린샷에서 “nostromo.local” 컴퓨터의 사용자가 보안 쉘(SSH)을 사용하여 “ubuntu20-04.local” 컴퓨터에 연결합니다. 3방향 핸드셰이크는 두 컴퓨터 간 통신의 첫 번째 단계입니다. SYN 패킷을 포함하는 두 줄은 짙은 회색으로 구분되어 있습니다.

디스플레이를 스크롤하여 오른쪽 열을 보면 SYN, SYN/ACK 및 ACK 핸드셰이크 패킷이 나타납니다.

두 컴퓨터 사이의 패킷 교환이 TCP와 SSH 프로토콜을 번갈아 사용하는 것을 확인할 수 있습니다. 데이터 패킷은 암호화된 SSH 연결을 통해 전달되지만 ACK와 같은 메시지 패킷은 TCP를 통해 전송됩니다. 곧 TCP 패킷을 필터링할 것입니다.
네트워크 연결이 더 이상 필요하지 않으면 삭제됩니다. 네트워크 연결을 해제하는 패킷 시퀀스는 4방향 핸드셰이크입니다.
한쪽에서 FIN(마감) 패킷을 보냅니다. 다른 쪽에서는 FIN을 확인하기 위해 ACK를 보내고, 연결을 끊어야 함을 동의하는 의미로 FIN도 보냅니다. 첫 번째 측에서 방금 받은 FIN에 대한 ACK를 보내면 네트워크 연결이 해제됩니다.
4방향 핸드셰이크는 다음과 같습니다.
A -> FIN -> B A ACK -> B
경우에 따라 원래 FIN이 아래와 같이 전송될 ACK 패킷에 피기백되는 경우가 있습니다.
A -> FIN, ACK -> B A ACK -> B
이것이 이 예에서 발생한 상황입니다.

해당 대화에서 SSH 트래픽만 보려면 해당 프로토콜을 지정하는 필터를 사용할 수 있습니다. SSH 프로토콜을 사용하여 원격 컴퓨터에서 주고받는 모든 트래픽을 보려면 다음을 입력합니다.
ip.addr == 192.168.4.25 && ssh
이렇게 하면 192.168.4.25로 주고받는 SSH 트래픽을 제외한 모든 트래픽이 필터링됩니다.

기타 유용한 필터 템플릿
필터 표시줄에 필터를 입력하면 필터 구문이 올바를 때까지 빨간색으로 유지됩니다. 필터가 올바르고 완료되면 녹색으로 바뀝니다.
tcp, ip, udp, ssh 등의 프로토콜을 입력하고 마침표(.)를 입력하면 메뉴가 나타납니다. 해당 프로토콜이 포함된 최근 필터와 해당 프로토콜 이름에 대한 필터에서 사용할 수 있는 모든 필드가 나열됩니다.
예를 들어 ip를 입력하면 ip.addr, ip.checksum, ip.src, ip.dst, ip.id, ip.host 및 기타 수십 개의 옵션을 사용할 수 있습니다.
다음 필터 템플릿을 필터의 기초로 사용하십시오.
HTTP 프로토콜 패킷만 표시하려면: http
DNS 프로토콜 패킷만 표시하려면: dns
소스 또는 대상 포트가 4000인 TCP 패킷만 표시하려면: tcp.port==4000
모든 TCP 재설정 패킷을 표시하려면: http.request
ARP, ICMP 및 DNS 패킷을 필터링하려면: !(arp 또는 icmp 또는 dns)
추적에서 모든 재전송을 표시하려면: tcp.analysis.retransmission
SYN 또는 FIN과 같은 플래그를 필터링하려면 비교값을 설정해야 합니다. 1은 플래그가 설정되었음을 의미하고 0은 설정되지 않았음을 의미합니다. 예: tcp.flags.syn == 1.
여기에서는 디스플레이 필터의 기본 원칙과 기본적인 사용법을 다루었지만 더 많은 기능이 존재합니다.
와이어샤크 필터의 전체 범위와 기능을 이해하려면 온라인 참조를 확인하십시오.