Nếu bạn điều hành một máy chủ, chắc chắn bạn sẽ đến một điểm mà bạn cần khắc phục một số vấn đề liên quan đến mạng. Tất nhiên sẽ rất dễ dàng khi chỉ cần gửi một bức thư đến bộ phận hỗ trợ, nhưng đôi khi bạn cần phải làm bẩn tay mình. Trong trường hợp này, tcpdump
là công cụ cho công việc đó. Tcpdump là một bộ phân tích gói mạng chạy dưới dòng lệnh.
Bài viết này sẽ được chia thành ba phần:
- Tính năng cơ bản.
- Lọc dựa trên các đặc điểm giao thông nhất định.
- Một đoạn ngắn của các tính năng nâng cao hơn (như biểu thức logic, lọc theo cờ TCP).
Vì tcpdump không được bao gồm trong hầu hết các hệ thống cơ sở, 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 có tcpdump trong kho lưu trữ cốt lõi của chúng. Đối với các bản phân phối dựa trên Debian, lệnh để cài đặt tcpdump là:
apt-get install tcpdump
Đối với CentOS / RedHat, sử dụng lệnh sau:
yum install tcpdump
FreeBSD cung cấp gói dựng sẵn có thể được cài đặt bằng cách phát hành:
pkg install tcpdump
Ngoài ra còn có một cổng có net/tcpdump
thể được cài đặt thông qua:
cd /usr/ports/net/tcpdump
make install clean
Nếu bạn chạy tcpdump
mà không có bất kỳ đối số, bạn sẽ bị vùi dập với kết quả. Chạy nó trên một ví dụ mới xuất hiện ở đây trên Vultr trong chưa đầy năm giây cho kết quả như sau:
2661 packets captured
2663 packets received by filter
0 packets dropped by kernel
Trước khi đi vào chi tiết hơn về cách lọc đầu vào, bạn nên xem qua một số tham số có thể được truyền cho tcpdump:
-i
- Chỉ định giao diện bạn muốn nghe, ví dụ : tcpdump -i eth0
.
-n
- Đừng cố thực hiện tra cứu ngược trên các địa chỉ IP, ví dụ: tcpdump -n
(nếu bạn thêm một n
tcpdump khác sẽ hiển thị cho bạn số cổng thay vì tên).
-X
- Hiển thị nội dung của các gói được thu thập : tcpdump -X
.
-c
- Chỉ chụp các x
gói, x
là một số tùy ý, ví dụ tcpdump -c 10
bắt chính xác 10 gói.
-v
- Tăng lượng thông tin gói bạn được hiển thị, càng nhiều v
s càng thêm độ dà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 chụp 100 gói, nhưng chỉ trên giao diện VPN tun0, thì lệnh tcpdump sẽ như thế này:
tcpdump -i tun0 -c 100 -X
Có hàng tá (nếu không phải hàng trăm) tùy chọn ngoài số ít đó, nhưng chúng là những lựa chọn phổ biến nhất. Vui lòng đọc trang chủ của tcpdump trên hệ thống của bạn.
Bây giờ bạn đã có hiểu biết cơ bản về tcpdump, đã đến lúc xem xét một trong những tính năng tuyệt vời nhất của tcpdump: biểu thức. Biểu hiện sẽ làm cho cuộc sống của bạn dễ dàng hơn rất nhiều. Chúng còn được gọi là Bộ lọc gói BPF hoặc Berkeley. Sử dụng biểu thức cho phép bạn hiển thị có chọn lọc (hoặc bỏ qua) các gói dựa trên các đặc điểm nhất định - chẳng hạn như nguồn gốc, đích, kích thước hoặc thậm chí số thứ tự TCP.
Cho đến nay bạn đã quản lý để giới hạn tìm kiếm của mình ở một số lượng gói nhất định trên một giao diện nhất định, nhưng hãy trung thực ở đây: vẫn để lại quá nhiều nhiễu nền để hoạt động hiệu quả với dữ liệu được thu thập. Đó là nơi biểu hiện phát huy tác dụng. Khái niệm này khá đơn giản, vì vậy chúng tôi sẽ bỏ qua lý thuyết khô khan ở đây và hỗ trợ sự hiểu biết bằng một số ví dụ thực tế.
Các biểu thức mà có lẽ bạn sẽ sử dụng nhiều nhất là:
host
- Tìm kiếm lưu lượng dựa trên tên máy chủ hoặc địa chỉ IP.
src
hoặc dst
- Tìm kiếm lưu lượng truy cập từ hoặc đến một máy chủ lưu trữ cụ thể.
proto
- Tìm kiếm lưu lượng của một giao thức nhất định. Hoạt động cho tcp, udp, icmp và những người khác. Bỏ qua proto
từ khóa cũng có thể.
net
- Tìm lưu lượng đến / từ một dải địa chỉ IP nhất định.
port
- Tìm kiếm lưu lượng đến / từ một cổng nhất định.
greater
hoặc less
- Tìm lưu lượng truy cập lớn hơn hoặc nhỏ hơn một lượng byte nhất định.
Mặc dù trang này tcpdump
chỉ chứa một vài ví dụ, nhưng trang pcap-filter
này có các giải thích rất chi tiết về cách mỗi bộ lọc hoạt động và có thể được áp dụng.
Nếu bạn muốn xem cách giao tiếp của bạn với một máy chủ nhất định, thì bạn có thể sử dụng host
từ khóa, ví dụ (bao gồm một số tham số ở trên):
tcpdump -i eth0 host vultr.com
Đôi khi, có những máy tính trên mạng không tôn trọng MTU hoặc spam bạn với các gói lớn; lọc chúng ra đôi khi có thể khó khăn. Biểu thức cho phép bạn lọc ra các gói lớn hơn hoặc nhỏ hơn một số byte nhất định:
tcpdump -i eth0 -nn greater 128
or
tcpdump -i eth0 -nn less 32
Có lẽ chỉ một cổng nhất định là quan tâm cho bạn. Trong trường hợp này, sử dụng port
biểu thức:
tcpdump -i eth0 -X port 21
Bạn cũng có thể xem ra phạm vi cổng:
tcdump -i eth0 -X portrange 22-25
Vì các cổng NAT khá phổ biến, bạn chỉ có thể tìm kiếm các cổng đích:
tcpdump dst port 80
Nếu bạn đang xem lưu lượng truy cập đến máy chủ web của mình, bạn có thể chỉ muốn xem lưu lượng TCP đến cổng 80:
tcpdump tcp and dst port 80
Có lẽ bạn đang tự hỏi những gì các từ khóa and
đang làm ở đó. Câu hỏi hay. Điều đó đưa chúng ta đến phần cuối của bài viết này.
tcpdump
cung cấp hỗ trợ cơ bản cho các biểu thức logic, cụ thể hơn:
and
/ &&
- Hợp lý "và".
or
/ ||
- Hợp lý "hoặc".
not
/ !
- Hợp lý "không".
Cùng với khả năng nhóm các biểu thức lại với nhau, điều này cho phép bạn tạo các tìm kiếm rất mạnh mẽ cho lưu lượng đến và đi. Vì vậy, hãy lọc lưu lượng truy cập đến từ vultr.com trên cổng 22 hoặc 443:
tcpdump -i eth0 src host vultr.com and (dst port 22 or 443)
Chạy cái này trên dòng lệnh sẽ cho bạn lỗi sau:
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 nhân vật có thể. Điều này bao gồm (
và các )
nhân vật. Để tránh lỗi đó, bạn nên sử dụng các trích dẫn đơn xung quanh biểu thức kết hợp:
tcpdump -i eth0 'src host vultr.com and (dst port 22 or 443)'
Một ví dụ hữu ích khác: Khi gỡ lỗi các sự cố SSH với một trong những người dùng của bạn, bạn có thể muốn bỏ qua mọi thứ liên quan đến phiên SSH của mình:
tcpdump '!(host $youripaddress) && port 22)'
Một lần nữa, các trường hợp sử dụng là vô tận, và bạn có thể chỉ định vào độ sâu cực kỳ loại lưu lượng truy cập mà bạn muốn xem. Lệnh sau sẽ chỉ hiển thị cho bạn các gói SYNACK của bắt tay TCP:
tcpdump -i eth0 'tcp[13]=18'
Điều này hoạt động bằng cách nhìn vào phần bù thứ mười ba của tiêu đề TCP và byte thứ mười tám trong nó.
Nếu bạn thực hiện tất cả các cách ở đây, thì bạn đã sẵn sàng cho hầu hết các trường hợp sử dụng sẽ phát sinh. Tôi chỉ có thể chạm vào bề mặt mà không đi vào quá nhiều chi tiết. Tôi đặc biệt khuyên bạn nên thử nghiệm với các tùy chọn và biểu thức khác nhau một chút nữa; và như thường lệ: tham khảo trang web khi bạn bị lạc.
Cuối cùng nhưng không kém phần quan trọng - một cái nhìn nhanh chóng trở lại. Hãy nhớ phần đầu của bài viết này? Với hàng ngàn gói được chụp trong vài giây? Sức mạnh của tcpdump
có thể cắt giảm rất nhiều:
tcpdump -i eth0 tcp port 22
Kết quả là ngay bây giờ:
81 packets captured
114 packets received by filter
0 packets dropped by kerne
Điều này là nhiều saner và dễ dàng hơn để gỡ lỗi. Chúc mừng mạng!