Tcpdump là phần mềm bắt gói tin trong mạng làm việc trên hầu hết các phiên bản hệ điều hành unix/linux. Tcpdump cho phép bắt và lưu lại những gói tin bắt được, từ đó chúng ta có thể sử dụng để phân tích. Trong hướng dẫn tcpdump này, chúng ta sẽ cùng thảo luận về một vài ví dụ thực tiễn về cách sử dụng lệnh tcpdump. Kể từ tcpdump không có trong hầu hết các hệ thống cơ bản, bạn sẽ cần phải cài đặt nó. Tuy nhiên, gần như tất cả các bản phân phối Linux đều có tcpdump trong kho cốt lõi. Đối với các bản phân phối dựa trên Debian, lệnh để cài đặt tcpdump là: Code: apt-get install tcpdump Đối với CentOS/RedHat, sử dụng lệnh sau đây: Code: yum install tcpdump Đối với FreeBSD, dùng lệnh sau: Code: pkg install tcpdump Ngoài ra, net/tcpdump có thể được cài đặt thông qua: Code: cd /usr/ports/net/tcpdump make install clean Nếu bạn chạy tcpdump không có bất kỳ đối số, bạn sẽ thấy được kết quả đầu ra như sau: Trước khi đi vào chi tiết hơn về cách lọc đầu vào, bạn nên có một cái nhìn tại một số các thông số có thể được thông qua với tcpdump: -i - Chỉ định các interface network mà bạn muốn nghe, ví dụ: tcpdump -i eth0. -n - Đừng cố gắng làm điều tra ngược (reverse lookups) về địa chỉ IP, ví dụ: tcpdump -n (nếu bạn thêm một n tcpdump sẽ cho bạn thấy số cổng thay vì tên). -X - Hiển thị nội dung của các gói tin thu thập: tcpdump -X. -c - Chỉ bắt số lượng gói x, x là một số tùy ý, ví dụ như tcpdump -c 10 bắt chính xác 10 gói. -v - Tăng số lượng thông tin gói. Mỗi tham số được đề cập ở đây có thể được kết hợp với nhau. Nếu bạn muốn nắm bắt các gói tin 100, nhưng chỉ trên interface tun0 VPN của bạn, lệnh tcpdump sẽ trông như thế này: Code: tcpdump -i tun0 -c 100 -X Bạn có thể tham khảo về các tùy chọn của tcpdump bằng lệnh man tcpdump. Một trong những tính năng tuyệt vời nhất của tcpdump: biểu thức. Biểu thức sẽ làm cho công việc của bạn dễ dàng hơn nhiều. Chúng cũng được biết đến như là BPF hoặc Berkeley Packet Filters. Sử dụng biểu thức cho phép bạn chọn lọc hiển thị (hoặc bỏ qua) các gói tin dựa trên một số đặc điểm - chẳng hạn như nguồn gốc, đích đến, kích thước, hoặc thậm chí số chuỗi TCP. Các biểu thức mà bạn có thể sẽ được sử dụng nhiều nhất là: host - Tìm kiếm lưu lượng dựa trên hostname hoặc địa chỉ IP . src hoặc dst – Tìm kiếm lưu lượng từ hay đến một máy chủ cụ thể. proto - Tìm kiếm lưu lượng của một giao thức nhất định. Làm việc cho tcp, udp, icmp, và một số cái khác. net - Tìm kiếm lưu lượng đến/từ một phạm vi nhất định của địa chỉ IP. port - Tìm kiếm lưu lượng đến / từ một cổng nhất định. greater or less - Tìm kiếm lưu lượng lớn hơn hoặc nhỏ hơn so với một số nhất định của byte. Nếu bạn muốn xem cách giao tiếp của bạn với một máy chủ nào đó, sau đó bạn có thể sử dụng từ khóa host, ví dụ (bao gồm một số các thông số từ ở trên): Code: tcpdump -i eth0 host aluhost.com Biểu thức cho phép bạn lọc ra các gói phải lớn hơn hoặc nhỏ hơn so với một số byte nhất định: Code: tcpdump -i eth0 -nn greater 128 or tcpdump -i eth0 -nn less 32 Có lẽ chỉ có cổng nhất định là mối quan tâm đối với bạn. Trong trường hợp này, sử dụng từ khóa port: Code: tcpdump -i eth0 -X port 21 Bạn cũng có thể tìm kiếm cho các phạm vi cổng: Code: tcpdump -i eth0 -X portrange 22-25 Từ khi cổng NAT là khá phổ biến, bạn có thể tìm kiếm các cổng điểm đến: Code: tcpdump dst port 80 Nếu bạn đang xem lưu lượng truy cập vào máy chủ web của bạn, bạn có thể chỉ muốn nhìn vào giao thông TCP đến cổng 80: Code: tcpdump tcp and dst port 80 tcpdump cung cấp hỗ trợ cơ bản cho các biểu thức logic, cụ thể hơn: and / && - Logical "and". or / || - Logical "or". not / ! - Logical "not". Cùng với khả năng nhóm các biểu thức với nhau, điều này cho phép bạn tạo ra các tìm kiếm rất mạnh mẽ cho lưu lượng vào và ra. Vì vậy, hãy lọc ra lưu lượng đến từ aluhost.com trên cổng 22 hoặc 443: Code: tcpdump -i eth0 src host aluhost.com and (dst port 22 or 443) Chạy lệnh này trên dòng lệnh sẽ cung cấp cho bạn những lỗi sau đây: Code: bash: syntax error near unexpected token `(' Đó là bởi vì có một cảnh báo: bash cố gắng để đánh giá mọi kí tự nó có thể. Điều này bao gồm ký tự (and). Để tránh lỗi này, bạn nên sử dụng dấu ngoặc đơn bao quanh các biểu thức kết hợp: Code: tcpdump -i eth0 'src host vultr.com and (dst port 22 or 443)' Một ví dụ hữu ích: Khi gỡ lỗi các vấn đề SSH với một trong những user của bạn, bạn có thể muốn bỏ qua tất cả những gì liên quan đến phiên SSH của bạn: Code: tcpdump '!(host $youripaddress) && port 22)' Các lệnh sau đây sẽ cho bạn thấy các gói SYNACK của một cái bắt tay TCP: Code: tcpdump -i eth0 'tcp[13]=18' Điều này hoạt động bằng cách nhìn vào offset thứ 13 của TCP header và byte thứ 18 bên trong nó Sức mạnh của tcpdump có thể cắt giảm kết quả đầu ra, hiển thị đúng thông tin ta cần: Code: tcpdump -i eth0 tcp port 22 Kết quả bây giờ là: Code: 81 packets captured 114 packets received by filter 0 packets dropped by kerne