패킷(Packet)이란 데이터가 네트워크를 통해 전송될 때 사용되는 기본 단위를 의미한다.
네트워크를 통해 정보를 전송할 때, 데이터는 패킷이라는 단위로 작게 나누어진다.
각 패킷은 전송되는 데이터의 여러 중요한 제어 정보와 그 데이터 자체를 포함한다.
패킷은 다음 그림과 같이 헤더(Header)와 데이터(Data)로 구성된다. 데이터는 페이로드(Payload)라고도 한다.
패킷을 하나의 택배 패키지라고 생각하면 이해가 쉽다.
헤더는 발송인과 수신인의 주소와 다른 배송정보가 포함된 택배 송장이고, 데이터는 택배 패키지의 내용물과 같은 것이다.
패킷의 시작 부분으로, 라우터나 스위치와 같은 네트워크 장치들은 이 헤더를 가장 먼저 확인한다.
다음과 같은 주요 정보를 포함하고 있다.
패킷이 Destination에 전달하는 실제 데이터이다.
데이터의 크기는 네트워크 프로토콜과 유형에 따라 달라질 수 있다.
네트워크를 통해 전송되는 패킷들을 캡처하고 분석하는 도구이다.
대표적인 패킷 분석 도구인 tcpdump
와 Wireshark
, 그리고 Wireshark
의 명령줄 버전인 tshark
를 알아보려고 한다.
tcpdump
는 네트워크 트래픽을 모니터링하고 분석하기 위해 사용되는 명령줄 패킷 분석 도구이다.
네트워크 인터페이스를 통과하는 패킷의 내용을 실시간으로 캡처하고 표시할 수 있다.
다음 명령어로 설치한다.
# Ubuntu based
apt-get install tcpdump
# Redhat based
yum install tcpdump
다음과 같이 명령어를 입력하여 실행한다.
tcpdump [option] [expression]
option
이나 expression
없이 tcpdump
명령어만을 입력하면 네트워크 인터페이스를 통과하는 모든 패킷을 캡처한다.
사용자가 Ctrl + C
를 입력하여 수동으로 중단할 때까지 캡처가 이어진다.
다음과 같이 출력된다.
각 행에는 프로토콜에 따라 해당 패킷에 대한 정보와 타임스탬프가 출력된다.
여러 유형 중 TCP 프로토콜 라인의 일반적인 형식은 다음과 같다.
# 형식
[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]
# 예시
15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
각 항목들에 대해 알아보자.
[Timestamp]
: 패킷이 캡처된 시간으로, 시:분:초.밀리초 형태로 표시된다.
[Protocol]
: 패킷의 프로토콜이다.
[Src IP].[Src Port]
: source IP 주소와 source 포트 번호이다.
[Dst IP].[Dst Port]
: destination IP 주소와 destination 포트 번호이다.
[Flags]
: TCP 플래그로 패킷의 특성과 상태를 나타낸다.
[Seq]
: 시퀀스 번호로, 데이터 스트림에서의 패킷의 순서를 나타낸다.
[Ack]
: 승인 번호이다.
[Win Size]
: 수신 윈도우 크기로, 수신자가 처리할 수 있는 데이터의 양(byte 단위)을 나타낸다.
[Options]
: TCP 옵션으로, NOP(No Operation), 타임스탬프 값 같은 추가적인 정보가 여기에 포함될 수 있다.
[Data Length]
: 패킷의 데이터(페이로드) 길이이다.(byte 단위)
프로토콜에 따라 이러한 출력 형식이 변경될 수 있다.
tcpdump
명령어만을 입력하여 모든 패킷이 캡처되면 출력의 가독성이 떨어져서 option
이나 expression
을 추가해서 사용한다.
-i <인터페이스명>
: 특정 네트워크 인터페이스를 지정한다.-c <패킷 수>
: 캡처할 패킷의 수를 지정한다.-w <파일명>
: 캡처된 패킷을 파일에 저장한다.-r <파일명>
: 저장된 캡처 파일을 읽어 분석한다.-v
, -vv
, -vvv
: 캡처된 패킷의 상세 정보를 더 자세히 출력한다.다음과 같이 option
을 사용할 수 있다.
# eth0 인터페이스의 패킷 캡처
tcpdump -i eth0
# 100개의 패킷만 캡처
tcpdump -c 100
# 캡처한 패킷을 test.pcap 파일로 저장
tcpdump -w test.pcap
# test.pcap 파일 읽기
tcpdump -r test.pcap
# 패킷의 상세 정보를 출력
tcpdump -v
tcp
, udp
, icmp
src host <IP 주소>
, dst host <IP 주소>
net <네트워크 주소>
port <포트 번호>
, src port <포트 번호>
, dst port <포트 번호>
다음과 같이 expression
을 사용할 수 있다.
# TCP 프로토콜의 패킷만 캡처
tcpdump tcp
# source IP 가 192.168.1.1인 패킷만 캡처
tcpdump src host 192.168.1.1
# 192.168.1.0/24 네트워크의 패킷만 캡처
tcpdump net 192.168.1.0/24
# 80 포트를 사용하는 패킷만 캡처
tcpdump port 80
이러한 항목들을 조합하여 다음과 같이 사용할수도 있다.
# TCP 프로토콜을 사용하고 포트가 80인 패킷만 캡처
tcpdump tcp and src port 80
다음 명령어로 tcpdump
가 패킷을 수집할 수 있는 사용가능한 네트워크 인터페이스 목록을 조회한다.
tcpdump -D
네트워크 인터페이스의 번호, 이름, 상태, 유형을 보여준다.
-w
옵션에 파일명을 인자로 하여 패킷 캡처 데이터를 파일로 저장할 수 있다. 다음과 같이 사용한다.
tcpdump -w <filename>
# 100개의 패킷 데이터 test.pcap 파일에 저장
tcpdump -c 100 -w test.pcap
이렇게 저장한 파일을 -r
옵션에 파일명을 인자로 하여 읽을 수 있다.
tcpdump -r <filename>
# test.pcap 읽기
tcpdump -r test.pcap
패킷 데이터를 캡쳐하고 분석하는 프로그램이며, 오픈소스 프로젝트이다.
패킷 분석 도구 중에서는 가장 널리 알려져 있다.
GUI와 여러 프로토콜을 지원하고, 다양한 필터링과 분석 기능을 갖추고 있다.
가이드 문서와 함께 따로 위키(Wiki)를 제공하고 있어 일반적인 패킷 캡쳐 방법부터 필드 정보 활용 방법을 알려주고 있다.
Wireshart 위키 : https://gitlab.com/wireshark/wireshark/-/wikis/home
https://www.wireshark.org/download.html 에서 운영체제에 맞는 파일을 다운받는다.
Ubuntu에서는 다음 명령어로 설치할 수 있다.
apt install wireshark
나는 현재 사용 중인 mac에 Wireshark
를 설치하였다.
설치 후 Wireshark
를 실행하면 다음과 같이 컴퓨터에 연결된 모든 네트워크 인터페이스가 나열된 화면이 나타난다.
캡처하고자 하는 네트워크 인터페이스를 선택한다.
네트워크 인터페이스를 선택하면 다음과 같이 권한이 없다고 메세지가 생성될 수 있다.
다음 명령어로 지정된 사용자에게 네트워크 인터페이스를 캡처하기 위한 권한을 설정해준다. (mac 기준)
sudo chown <username> /dev/bpf*
chown
명령어는 'change owner'의 약자로, 파일이나 디렉토리의 소유자를 변경한다.
/dev/bpf*
경로는 Berkeley Packet Filter (BPF) 장치들을 나타낸다.
이 장치들은 네트워크 인터페이스에서 패킷을 캡처하는데 사용된다.
이 파일들에 대한 소유권을 얻어야 네트워크 인터페이스에서 패킷 캡처를 수행할 수 있다.
네트워크 인터페이스를 선택함과 동시에 패킷 캡처가 시작된다.
패킷을 캡처(Capture)한다는 것은 네트워크 인터페이스를 모니터링하면서 통과하는 패킷을 잡아내어 기록하는 것이다.
이렇게 캡처된 패킷 데이터는 파일로 저장할 수도 있다.
다음과 같이 패킷 목록에 실시간 패킷 데이터를 화면에 표시되고,
패킷 목록에서 패킷을 선택하면 하단에 패킷 상세정보와 패킷 바이트 패널에 선택한 패킷의 정보가 나타난다.
패킷 상세정보에는 네트워크 계층별로 패킷(데이터 링크 계층, 네트워크 계층, 전송 계층, 애플리케이션 계층)의 정보를 확장/축소가 가능한 트리 형식으로 보여준다.
패킷 상세정보에서 선택한 라인 정보에 따른 패킷 바이트가 오른편에 파랗게 표시된다.
네트워크 계층 - OSI 7계층 모델과 TCP/IP 4계층 모델
패킷 바이트는 패킷의 실제 데이터 내용을 바이트 단위로 나타낸 것이다.
16진수로 표현된 텍스트 기반 데이터인 hexdump 형식으로 되어 있다.
패킷 상세정보에서 내용을 선택하면 해당 내용의 패킷 바이트가 선택된 것처럼, 패킷 바이트에서 바이트를 선택하면 해당하는 내용의 패킷 상세정보가 표시된다.
패킷 캡처를 시작했을 때부터 중지하기까지 수집된 패킷 데이터는 기본 캡처 파일 형식인 .pcapng
, .pcap
으로 저장할 될 수 있다.
다음과 같이 표시된 아이콘을 클릭하여 파일로 저장한다.
이렇게 저장한 파일은 언제든지 다시 열어서 분석할 수 있다.
캡처 파일에는 캡처를 시작했을 때부터 끝낼 때까지의 모든 패킷 데이터가 들어 있고, 찾고자 하는 패킷을 필터를 걸어서 찾을 수도 있다.
또한 앞서 설명했던 tcpdump
에서 생성한 캡처파일도 열 수 있다.
tshark
는 Wireshark
의 명령줄 버전으로, 터미널에서 텍스트 기반으로 작동한다.
Wireshark
와 마찬가지로 트래픽을 캡쳐하고 분석할 수 있지만 모든 작업이 명령줄을 통해 이루어진다.
Ubuntu 리눅스 환경에서 실습했다.
다음 명령어로 설치한다.
apt install tshark
위와 같이 권한이 없다고 출력되면 아래 명령어들을 입력하여 해결한다.
dpkg-reconfigure
명령어는 설치된 패키지의 설정을 다시 구성하는데 사용된다.
먼저 wireshark-common
패키지에 대한 설정을 dpkg-reconfigure
을 사용하여 다시 구성한다.
sudo dpkg-reconfigure wireshark-common
실행 시 다음과 같이 설정 팝업이 뜨면 Yes
를 선택하여 넘어간다.
다음 명령어를 실행한다.
chmod
는 change mode의 약자로, 파일/디렉토리의 권한을 변경하는데 사용한다.
+x
는 실행 권한을 추가하는 권한 표기법이다. /usr/bin/dumpcap
경로의 프로그램에 대한 실행 권한을 부여한다. (dumpcap
은 패킷 캡쳐에 필요한 프로그램이다.)
sudo chmod +x /usr/bin/dumpcap
다음 명령어로 현재 선택할 수 있는 네트워크를 조회한다.
tshark -D
다음과 같이 옵션 없이 명령어를 입력 할 경우에는 조회한 네트워크 인터페이스 목록 중 1번이 자동으로 선택되어 패킷 캡처가 시작된다.
tshark
네트워크 인터페이스를 지정하여 실행하려면 다음과 같이 -i
옵션에 이어서 네트워크 인터페이스 목록의 번호나 이름을 입력한다.
tshark -i <network-interface-id/name>
# 예시
tshark -i 1
명령어 실행 시 Capture started.
문구를 시작으로 패킷 캡처가 시작된다.
맨 첫번째 컬럼으로 패킷 데이터의 인덱스가 출력된다.
하지만 이렇게 파일 쓰기 옵션 없이 명령어를 실행했을 때는 실행 중 캡처 파일로 저장할 수 없고, 따로 옵션을 설정해주어야 한다.
-w
옵션에 파일명을 인자로 하여 패킷 캡처 데이터를 파일로 저장할 수 있다.
다음과 같이 사용한다.
tshark -w <filename>
out3.pcap
파일에 저장하도록 명령어를 실행했다.
옵션 없이 명령어를 실행했을 때 터미널에 패킷 목록이 출력되는 것과 달리 패킷의 갯수만 출력된다.
중단 조건을 주지 않았기 때문에 사용자가 중단하기 전까지 파일에 기록한다.
-w
옵션으로 저장한 파일은 -r
옵션에 파일명을 인자로 하여 읽을 수 있다.
다음과 같이 사용한다.
tshark -r <filename>
터미널에 출력되는 것과 같은 데이터가 쓰여져 있다.
-a
옵션을 사용하여 캡처를 중단하는 조건을 설정할 수 있다.
조건에 사용할 수 있는 항목은 다음과 같다.
packets:
- 캡처할 패킷의 수를 제한duration:
- 캡처를 특정 시간(초) 동안만 실행filesize:
- 캡처 파일이 지정된 크기(KB)에 도달하면 중지-w <filename>
옵션과 함께 사용해야 한다. 다음과 같이 사용한다.
# 100개의 패킷 데이터 수집 후 캡처 중지
tshark -a packets:100
# 30초 동안만 패킷 데이터 수집 후 캡처 중지
tshark -a duration:30
# out.pcap로 캡처파일 작성, 파일 크기가 1024KB에 도달하면 패킷 데이터 캡처 중지
tshark -a filesize:1024 -w out.pcap
이 조건들을 결합하여 사용할 수도 있다.
이럴 경우 조건 중 하나라도 만족하면 캡처를 중지한다.
다음과 같이 명령어를 사용한다.
tshark -a duration:300 -a packets:1000 -w out2.pcap
300초가 넘어가거나 수집한 패킷 데이터가 1000개가 넘어가면 캡처를 중지하고 out.pcap
파일에 결과를 저장한다.
-c
옵션을 사용하여 다음과 같이 간단하게 조회할 패킷 갯수를 설정할 수도 있다.
또한 파일에서 읽을 패킷 갯수도 설정할 수 있다.
# 조회할 패킷 갯수 10개로 설정
tshark -c 10
# 파일에서 읽을 패킷 갯수 10개로 설정
tshark -r out2.pcap -c 10
사용자가 원하는 필드 영역만 골라 분석하고자 한다면, -T fields
와 -e
옵션을 사용해야 한다.
다음과 같은 형식으로 사용한다.
tshark -T fields -e <필드 식별자1> -e <필드 식별자2>
# 예시 - out2.pcap파일의 데이터에서 source, destination의 IP 주소만 추출
tshark -r out2.pcap -T fields -e ip.src -e ip.dst
필드 식별자를 source와 destination의 IP주소를 out2.pcap
파일에서 읽어 출력하게 했다.
이번에는 패킷 발생시간과 크기, 프로토콜 정보를 출력해보았다.
tshark -r out2.pcap -T fields -e frame.time -e frame.len -e frame.protocols
https://www.wireshark.org/docs/dfref/ 에서 더 많은 필드 식별자 정보를 알 수 있다.
패킷 필터링 옵션에는 다음과 같이 수집용 필터와 분석용 필터 2가지가 존재한다.
Wireshark
의 패킷 캡처 필터 문자열로 필터링하는 문법과 동일, 모든 모드에서 사용 가능수집용 필터 에는-f
옵션을 사용한다.
필터링 문법은 tcpdump
와 거의 유사하다.
TCP 패킷만 수집하고자 한다면 다음과 같은 형식으로 사용한다.
tshark -f 'tcp'
분석용 필터에는 -Y
옵션을 사용한다.
뒤에 따라오는 문자열은 패킷 캡처 필터(display filter) 표현식으로, Wireshark
와 TShark
에서 사용된다.
ip.dst
은 destination의 IP주소를 의미하고, eq
은 '같다(equal)'의 의미이다.
따라서 이 필터는 destination IP 주소가 192.168.64.6
인 패킷을 필터링한다.
다음과 같이 명령어를 사용할 수 있다.
tshark -r out2.pcap -Y "ip.dst eq 192.168.64.6"
packet
https://www.techtarget.com/searchnetworking/definition/packet
https://webhostinggeeks.com/blog/what-is-data-packet/
wireshark permission error
https://hello-gg.tistory.com/28
OSI 7 계층
https://shlee0882.tistory.com/110
tshark
https://pyromaniac.me/72
tcpdump
https://satoms.com/tcp-dump-explained/
https://jjeongil.tistory.com/1869