Hướng dẫn chi tiết về tcpdump trên Linux

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 tin
  • dst port ! 22: Không bắt gói tin đến cổng 22
  • src 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 đó:

  • srcdst: Địa chỉ IP nguồn và đích cùng với cổng tương ứng
  • flags: Cờ TCP (S SYN, F FIN, P PUSH, R RST, W ECN CWT, E ECN-Echo)
  • data-seqno: Số thứ tự dữ liệu
  • ack: Số xác nhận
  • window: Kích thước cửa sổ
  • urgent: Dữ liệu khẩn cấp
  • options: 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à host
  • src host host: Nếu địa chỉ nguồn IPv4/v6 là host
  • host host: Nếu địa chỉ nguồn hoặc đích là host
  • ether dst ehost: Nếu địa chỉ Ethernet đích là ehost
  • ether src ehost: Nếu địa chỉ Ethernet nguồn là ehost
  • ether host ehost: Nếu địa chỉ Ethernet nguồn hoặc đích là ehost
  • gateway host: Nếu địa chỉ gateway là host
  • dst net net: Nếu mạng đích là net
  • src net net: Nếu mạng nguồn là net
  • net net: Nếu mạng nguồn hoặc đích là net
  • dst port port: Nếu cổng đích là port
  • src port port: Nếu cổng nguồn là port
  • port port: Nếu cổng nguồn hoặc đích là port
  • less length: Nếu độ dài gói tin nhỏ hơn hoặc bằng length
  • greater length: Nếu độ dài gói tin lớn hơn hoặc bằng length
  • ip proto protocol: Nếu gói tin IPv4 có giao thức protocol
  • ip6 proto protocol: Nếu gói tin IPv6 có giao thức protocol
  • ether broadcast: Nếu gói tin là broadcast Ethernet
  • ip broadcast: Nếu gói tin là broadcast IPv4
  • ether multicast: Nếu gói tin là multicast Ethernet
  • ip multicast: Nếu gói tin là multicast IPv4
  • ip6 multicast: Nếu gói tin là multicast IPv6
  • ether proto protocol: Nếu gói tin thuộc loại protocol Ethernet
  • vlan [vlan_id]: Nếu gói tin là VLAN
  • mpls [label_num]: Nếu gói tin là MPLS
  • pppoed: Nếu gói tin là PPPoE discovery
  • pppoes: Nếu gói tin là PPPoE session
  • tcp, udp, icmp: Nếu gói tin thuộc giao thức tương ứng
  • expr relop expr: Nếu hai biểu thức expr thỏa mãn quan hệ relop

Thẻ: tcpdump network-analysis packet-capture linux Networking

Đăng vào ngày 14 tháng 7 lúc 07:41