첫 직장이 미디어 파일을 송출하는 서버를 개발하는 회사였고, 솔루션이 정상 구동되기 위해 네트워크 구성은 아주 중요한 요소였다. 각 고객마다 복잡한 룰에 의해 관리되고 있는 통신망에 설치를 하다 보니 네트워크에 대한 이해와 테스트는 가장 기본적이고 중요한 항목이었다. 네트워크 전문가는 아니라 모든 문제를 직접 해결할 수는 없지만, 간단히 확인할 수 있는 정보 수집만으로도 문제가 되는 원인을 찾거나 발생하는 지점을 좁혀 문제 해결의 실마리를 찾는데 도움이 될 수 있었다.
업무를 하며 알게된 Network 관련 명령어 사용법 또는 경험했던 원인 분석 과정 들에 대해 생각나는 것들을 하나씩 정리해 보려고 한다. 그 중 가장 첫번째는 tcpdump 명령어 사용법이다. 현재도 신규 개발된 연동기반 서버를 검증 하거나, client 검증을 위해 dummy-tool을 개발할 때 자주 활용하고 있다.
tcpdump는 Linux 환경에서 Client와 Server가 주고받는 네트워크 패킷을 TCP Layer에서 캡쳐하여 메세지를 확인할 수 있는 명령어(& 소프트웨어)이다. raw 레벨의 패킷을 파일로 저장할 수 있으며, 잘 알려진 http 등의 메세지는 특정 옵션들을 통해 바로 확인도 가능하다.
* tcpdump : tcpdump는 명령 줄에서 실행하는 일반적인 패킷 가로채기 소프트웨어이다. 사용자가 TCP/IP뿐 아니라, 컴퓨터에 부착된 네트워크를 통해 송수신되는 기타 패킷을 가로채고 표시할 수 있게 도와 준다. BSD 허가서를 통해 배포되는 tcpdump는 자유 소프트웨어이다. (출처 : 위키백과)
* 보다 더 자세한 사용법과 명령 옵션에 대해서는 "man tcpdump" 를 통해 확인 가능함
예제로 확인하는 기본 캡쳐 방법
구성도
기본 명령어 (필자가 자주 사용하는 옵션으로 Client 에서 실행함)
tcpdump -i eth0 port 80 -nn -vv -s0
결과 확인
(Message#1)과 (Message#2)를 주고받기 위한 TCP Packet가 모두 캡쳐됨.
(Message#1)과 (Message#2)를 제외한 앞 뒤에 주고 받은 TCP Packet에 대한 의미는 "TCP 3way handshaking" 참고
자주 사용하는 명령 옵션 및 예제
-i {interface name}
패킷 캡쳐할 interface를 지정하는 옵션. (필수 지정)
linux에서 ifconfig 명령어를 통해 interface list를 확인한 후, interface를 직접 지정할 수 있음.
어느 interface 인지 모를 경우 {interface_name} 자리에 "any"로 지정하여 모든 interface로 오고가는 패킷을 모두 캡쳐할 수도 있음.
예시)
- tcpdump -i eth0 -nn
- tcpdump -i ens1 -nn
- tcpdump -i any -nn
: 특정 interface가 아니라 lo(loopback)를 포함한 모든 interface로 오고가는 패킷을 캡쳐
host {host name or ip} and port {port number}
패킷 중 특정 host 또는 특정 port로 오고가는 패킷만 필터링(filtering)하여 캡쳐할 수 있는 옵션.
지정하지 않을 경우 모든 host와 모든 port로 오고가는 모든 패킷이 캡쳐됨.
host와 port를 모두 지정할 수 도 있고, host 또는 port 중 하나만 지정할 수 도 있음. 만약 port만 지정할 경우 host는 구분하지 않고 port만으로 필터링된 결과를 캡쳐하게 됨.
host와 port를 지정 시, 전송 방향까지 지정하여 src(source), dst(destination) 정보도 함께 지정할 수 있음.
예시)
- tcpdump -i any -nn host 10.120.0.11 and port 80
: 패킷의 송신(source) 또는 수신(destination)지의 host가 10.120.0.11이면서 port가 80인 패킷
: 위 예제에서 Message #1,#2 모두 해당 - tcpdump -i any -nn host 10.120.0.11
: 위 예제에서 Message #1,#2 모두 해당되며, 그 외에도 양 서버간 오고가는 모든 Message도 함께 캡쳐됨 - tcpdump -i any -nn port 80
: 위 예제에서 Message #1,#2 모두 해당되며, 그 외에도 Client 서버와 80 port로 패킷을 주고받는 모든 서버와의 Message도 함께 캡쳐됨 - tcpdump -i any -nn dst host 10.120.1.40 and src port 80
: 위 예제에서 Message #2만 캡쳐됨. 수신지의 host가 10.120.1.40이며, 송신지의 port가 80인 패킷을 의미함
-nn
패킷 출력 시, ip address를 hostname으로 출력하지 말고, port를 잘 알려진 protocol로 출력하지 않는 옵션.
[hostname] -nn 옵션을 주지 않으면 10.120.1.40 이라는 ip address가 아닌 "vm-centos7" 이라는 서버의 hostname으로 출력함
[port] -nn 옵션을 주지 않으면 80 이라는 port가 아닌 80 port의 잘 알려진 protocol "http"라는 이름으로 출력함
예시)
- -nn 옵션을 포함했을때 : tcpdump -i eth0 port 80 -nn -vv
- -nn 옵션을 포함하지 않았을 때 : tcpdump -i eth0 port 80 -vv
-vv (더블유 아니고 브이+브이)
패킷을 더 상세하게 출력하는 옵션.
잘 알려진 http protocol의 경우 header & body 메세지를 포함하여 출력해 줌.
예시)
- -vv 옵션을 포함했을 때 : tcpdump -i eth0 port 80 -nn -vv
- -vv 옵션을 포함하지 않았을 때 : tcpdump -i eth0 port 80 -nn
-w {filename} (filename의 확장자는 pcap)
패킷 내용을 화면에 출력하지 않고 raw packet 그대로 file에 write하는 옵션.
화면에 출력되는 내용만으로 패킷의 내용을 확인하기 어렵거나 용량이 큰 패킷의 경우 filename.pcap 파일로 저장한 후, wireshark 등을 통해 파일을 열어 더 상세히 분석하는데 활용할 수 있음.
예시)
- tcpdump -i any -nn host 10.120.0.11 and port 80 -w test.pcap
-C {max packet size(MB)}
pcap 덤프 파일 1개의 용량이 너무 큰 경우 wireshark 에서 열리지 않는 이슈가 있으며, 파일 handling 하기도 어려울 수 있어 최대 파일 크기를 지정하는 옵션.
옵션으로 설정한 최대 파일 크기를 넘는 경우 파일이 분리되어 생성됨.
파일을 저장하는 옵션인 -w 옵션과 함께 사용.
상세 사용 방법은 아래 포스트 참고.
https://jinane.tistory.com/120
'Engineering > Network' 카테고리의 다른 글
[tcpdump] 덤프 파일 사이즈가 커서 wireshark로 열리지 않는 경우를 대비하여 pcap 파일 분할하여 저장하기 (0) | 2024.01.10 |
---|---|
iptables 활용하여 Connection timeout, Response timeout 테스트 하기 (0) | 2022.04.04 |
iptables 로 일부 문자(string)가 포함된 packet만 차단하기 (string match) (0) | 2022.03.28 |
docker 사용 시, iptables 로 방화벽 설정하기 (DOCKER-USER Chain) (0) | 2021.11.29 |
wireshark : display filter로 원하는 protocol, ip, port 만 filtering 하기 (0) | 2021.08.16 |
댓글