Giới thiệu
tcpdump là một công cụ phân tích gói tin mạng mạnh mẽ trên Linux, cho phép người dùng bắt và phân tích các gói tin mạng. Công cụ này có khả năng chụp lại "đầu" của các gói tin mạng và cung cấp thông tin chi tiết về chúng. tcpdump hỗ trợ lọc theo lớp mạng, giao thức, máy chủ, mạng hoặc cổng, đồng thời cung cấp các toán tử logic như and, or, not để giúp người dùng loại bỏ thông tin không cần thiết.
Các ví dụ lệnh thực tế
Khởi động mặc định:
tcpdump
Trong trường hợp thông thường, khởi động tcpdump sẽ giám sát tất cả các gói tin đi qua giao diện mạng đầu tiên.
Giám sát gói tin trên giao diện mạng cụ thể:
tcpdump -i eth1
Nếu không chỉ định card mạng, tcpdump sẽ chỉ giám sát giao diện mạng đầu tiên, thường là eth0.
Giám sát gói tin từ máy chủ cụ thể:
tcpdump host server1
In tất cả các gói tin đi vào hoặc ra khỏi server1.
Cũng có thể chỉ định IP, ví dụ bắt tất cả các gói tin được gửi và nhận bởi 192.168.1.100:
tcpdump host 192.168.1.100
In các gói tin giao tiếp giữa client1 và server2 hoặc client3:
tcpdump host client1 and \( server2 or client3 \)
Bắt các gói tin giao tiếp giữa 192.168.1.100 và 192.168.1.101 hoặc 192.168.1.102:
tcpdump host 192.168.1.100 and \( 192.168.1.101 or 192.168.1.102 \)
In các gói IP giữa clientA và bất kỳ máy chủ nào khác, nhưng không bao gồm clientB:
tcpdump ip host clientA and not clientB
Để lấy các gói IP từ 192.168.1.100 đến tất cả các máy chủ ngoại trừ 192.168.1.200:
tcpdump ip host 192.168.1.100 and ! 192.168.1.200
Bắt tất cả dữ liệu được gửi từ máy chủ hostname:
tcpdump -i eth0 src host hostname
Giám sát tất cả các gói tin được gửi đến máy chủ hostname:
tcpdump -i eth0 dst host hostname
Giám sát gói tin từ máy chủ và cổng cụ thể:
Để lấy các gói tin telnet được nhận hoặc gửi bởi 192.168.1.100:
tcpdump tcp port 23 and host 192.168.1.100
Giám sát UDP port 123 trên máy cục bộ (cổng dịch vụ NTP):
tcpdump udp port 123
Giám sát gói tin từ mạng cụ thể:
In tất cả các gói tin giữa máy chủ cục bộ và các máy chủ trên mạng Berkeley:
tcpdump net 192.168.1.0/24
In tất cả các gói tin FTP đi qua cổng gate:
tcpdump 'gateway gate and (port ftp or ftp-data)'
In tất cả các gói tin IP có nguồn hoặc đích là máy chủ cục bộ:
tcpdump ip and not net localnet
Giám sát gói tin từ giao thức cụ thể:
In các gói TCP bắt đầu và kết thúc phiên, nguồn hoặc đích không phải là máy chủ trên mạng cục bộ:
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
In tất cả các gói tin có cổng nguồn hoặc đích là 80, giao thức lớp mạng là IPv4 và chứa dữ liệu (không phải SYN, FIN hoặc ACK-only):
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
In các gói IP dài hơn 576 byte và có địa chỉ gateway là gate:
tcpdump 'gateway gate and ip[2:2] > 576'
In tất cả các gói IP broadcast hoặc multicast lớp mạng, nhưng không phải lớp liên kết dữ liệu:
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
In tất cả các gói ICMP ngoại trừ loại 'echo request' hoặc 'echo reply':
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
tcpdump và wireshark
Wireshark là công cụ bắt gói tin đồ họa dễ sử dụng trên Windows. Trên Linux, tcpdump là lựa chọn tốt. Kết hợp tcpdump và Wireshark cho phép bắt gói tin trên Linux và phân tích trên Windows:
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./capture.cap
Giải thích các tham số:
tcp: Lọc theo giao thức TCP-i eth1: Chỉ bắt gói tin trên giao diện eth1-t: Không hiển thị timestamp-s 0: Bắt toàn bộ gói tin-c 100: Chỉ bắt 100 gói tindst port ! 22: Không bắt gói tin đến cổng 22src net 192.168.1.0/24: Chỉ bắt gói tin từ mạng 192.168.1.0/24-w ./capture.cap: Lưu vào file capture.cap để phân tích bằng Wireshark
Sử dụng tcpdump để bắt gói HTTP:
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 là "GE" (hai chữ cái đầu của "GET"), 0x4854 là "HT" (hai chữ cái đầu của "HTTP").
Ý nghĩa thông tin đầu ra
Định dạng đầu ra của tcpdump thường là: Thời gian hệ thống Nguồn. cổng > Đích. cổng Tham số gói tin
Gói tin lớp liên kết
Đối với mạng FDDI, tùy chọn -e làm cho tcpdump in ra 'frame control', địa chỉ nguồn và đích, cùng với độ dài gói tin.
Đối với mạng Token Ring, tùy chọn -e in ra 'frame control' và 'access control', cùng với địa chỉ nguồn và đích, và độ dài gói tin.
Đối với mạng 802.11 (WLAN), tùy chọn -e in ra 'frame control', tất cả địa chỉ trong header, và độ dài gói tin.
Gói tin TCP
Định dạng hiển thị của tcpdump cho gói tin TCP:
src > dst: flags data-seqno ack window urgent options
Trong đó:
srcvàdst: Địa chỉ IP nguồn và đích cùng với cổng tương ứngflags: Cờ TCP (S SYN, F FIN, P PUSH, R RST, W ECN CWT, E ECN-Echo)data-seqno: Số thứ tự dữ liệuack: Số xác nhậnwindow: Kích thước cửa sổurgent: Dữ liệu khẩn cấpoptions: Tùy chọn TCP
Gói tin UDP
Định dạng hiển thị của tcpdump cho gói tin UDP:
src.port > dst.port: len
Cách sử dụng lệnh
tcpdump sử dụng giao diện dòng lệnh với cú pháp:
tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
[ -C file_size ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -Z user ]
[ expression ]
Tùy chọn tcpdump
-A: Hiển thị mỗi gói tin dưới dạng ASCII-c count: Thoát sau khi nhận đủ count gói tin-C file_size: Kiểm tra kích thước file trước khi ghi-D: In ra tất cả các giao diện mạng có thể bắt gói tin-e: Bao gồm thông tin lớp liên kết trong mỗi dòng đầu ra-E spi@ipaddr algo:secret: Giải mã gói tin IPsec ESP-f: Hiển thị địa chỉ IPv4 bằng số thay vì tên-F file: Sử dụng file làm đầu vào cho biểu thức lọc-i interface: Chỉ định giao diện cần bắt gói tin-l: Đệm dòng cho đầu ra chuẩn-L: Liệt kê các loại lớp liên kết được hỗ trợ-m module: Tải module SMI MIB-M secret: Chỉ định密钥 cho TCP-MD5-n: Không chuyển đổi địa chỉ và cổng thành tên-N: Không in phần tên miền của host-O: Không sử dụng mã tối ưu hóa-p: Thường đặt giao diện ở chế độ không 'promiscuous'-q: In đầu ra nhanh (ít thông tin)-R: Phân tích ESP/AH theo RFC1825-r file: Đọc gói tin từ file-S: Sử dụng số thứ tự tuyệt đối cho TCP-s snaplen: Đặt độ dài bắt gói tin-T type: Bắt buộc tcpdump phân tích theo cấu trúc gói tin của giao thức type-t: Không in timestamp-tt: Không định dạng thời gian-ttt: Độ trễ giữa các dòng in-tttt: Thêm ngày trước timestamp-u: In handle NFS chưa mã hóa-U: Đồng bộ ghi file khi sử dụng -w-v: In chi tiết-vv: In chi tiết hơn-vvv: In chi tiết nhất-w file: Ghi thô gói tin vào file-W filecount: Giới hạn số file khi sử dụng với -C-x: In header và dữ liệu ở dạng hex-xx: In header lớp liên kết và dữ liệu ở dạng hex-X: In header và dữ liệu ở dạng hex và ASCII-XX: In header lớp liên kết, header và dữ liệu ở dạng hex và ASCII-y datalinktype: Chỉ bắt gói tin lớp liên kết type-Z user: Thay đổi người dùng thành user
Biểu thức điều kiện tcpdump
Biểu thức điều kiện được sử dụng để quyết định哪些 gói tin sẽ được in. Nếu không có biểu thức, tất cả gói tin bị bắt sẽ được in.
Biểu thức bao gồm một hoặc nhiều 'biểu thức nguyên thủy' (primitive). Một biểu thức nguyên thủy thường bao gồm một hoặc nhiều bộ điều chỉnh (qualifiers) theo sau bởi một id.
Có ba loại bộ điều chỉnh:
type: Chỉ định loại đối tượng id đại diện (host, net, port, portrange)dir: Mô tả hướng truyền (src, dst, src or dst, src and dst)proto: Mô tả giao thức (ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp, udp)
Biểu thức có thể được kết nối bằng các toán tử: and, or, not.
Phụ lục: Các biểu thức nguyên thủy của tcpdump
dst host host: Nếu địa chỉ đích IPv4/v6 là hostsrc host host: Nếu địa chỉ nguồn IPv4/v6 là hosthost host: Nếu địa chỉ nguồn hoặc đích là hostether dst ehost: Nếu địa chỉ Ethernet đích là ehostether src ehost: Nếu địa chỉ Ethernet nguồn là ehostether host ehost: Nếu địa chỉ Ethernet nguồn hoặc đích là ehostgateway host: Nếu địa chỉ gateway là hostdst net net: Nếu mạng đích là netsrc net net: Nếu mạng nguồn là netnet net: Nếu mạng nguồn hoặc đích là netdst port port: Nếu cổng đích là portsrc port port: Nếu cổng nguồn là portport port: Nếu cổng nguồn hoặc đích là portless length: Nếu độ dài gói tin nhỏ hơn hoặc bằng lengthgreater length: Nếu độ dài gói tin lớn hơn hoặc bằng lengthip proto protocol: Nếu gói tin IPv4 có giao thức protocolip6 proto protocol: Nếu gói tin IPv6 có giao thức protocolether broadcast: Nếu gói tin là broadcast Ethernetip broadcast: Nếu gói tin là broadcast IPv4ether multicast: Nếu gói tin là multicast Ethernetip multicast: Nếu gói tin là multicast IPv4ip6 multicast: Nếu gói tin là multicast IPv6ether proto protocol: Nếu gói tin thuộc loại protocol Ethernetvlan [vlan_id]: Nếu gói tin là VLANmpls [label_num]: Nếu gói tin là MPLSpppoed: Nếu gói tin là PPPoE discoverypppoes: Nếu gói tin là PPPoE sessiontcp,udp,icmp: Nếu gói tin thuộc giao thức tương ứngexpr relop expr: Nếu hai biểu thức expr thỏa mãn quan hệ relop