Thứ ba, 20/02/2018 | 00:00 GMT+7

Cách sử dụng Netcat để thiết lập và kiểm tra kết nối TCP và UDP trên VPS

Linux được biết đến là có một số lượng lớn các tiện ích dòng lệnh hữu ích và hoàn thiện có sẵn trong hầu hết các bản phân phối. Administrator hệ thống lành nghề có thể thực hiện nhiều công việc của họ bằng cách sử dụng các công cụ tích hợp sẵn mà không cần phải cài đặt thêm phần mềm.

Trong hướng dẫn này, ta sẽ thảo luận về cách sử dụng trình netcat . Thường được gọi là công cụ mạng của quân đội Thụy Sĩ, lệnh đa năng này có thể hỗ trợ bạn theo dõi, kiểm tra và gửi dữ liệu qua các kết nối mạng.

Ta sẽ khám phá điều này trên VPS Ubuntu 12.04, nhưng netcat sẽ có sẵn trên hầu hết mọi bản phân phối Linux hiện đại. Ubuntu đi kèm với biến thể BSD của netcat và Đây là kết quả ta sẽ sử dụng trong hướng dẫn này. Các version khác có thể hoạt động khác hoặc cung cấp các tùy chọn khác.

Cú pháp chung

Theo mặc định, netcat hoạt động bằng cách khởi tạo kết nối TCP tới server từ xa.

Cú pháp cơ bản nhất là:

  • netcat [options] host port

Điều này sẽ cố gắng khởi tạo TCP tới server đã xác định trên số cổng được chỉ định. Về cơ bản, đây là chức năng tương tự như lệnh telnet Linux cũ. Lưu ý kết nối của bạn hoàn toàn không được mã hóa.

Nếu bạn muốn gửi một gói UDP thay vì bắt đầu kết nối TCP, bạn có thể sử dụng tùy chọn -u :

  • netcat -u host port

Bạn có thể chỉ định một loạt các cổng bằng cách đặt dấu gạch ngang giữa đầu tiên và cuối cùng:

  • netcat host startport-endport

Điều này thường được sử dụng với một số cờ bổ sung.

Trên hầu hết các hệ thống, ta có thể sử dụng netcat hoặc nc thay thế cho nhau. Chúng là alias cho cùng một lệnh.

Cách sử dụng Netcat để quét cổng

Một trong những cách sử dụng phổ biến nhất cho netcat là như một máy quét cổng.

Mặc dù netcat có lẽ không phải là công cụ phức tạp nhất cho công việc (nmap là lựa chọn tốt hơn trong hầu hết các trường hợp), nó có thể thực hiện quét cổng đơn giản để dễ dàng xác định các cổng đang mở.

Ta thực hiện việc này bằng cách chỉ định một loạt các cổng để quét, như ta đã làm ở trên, cùng với tùy chọn -z để thực hiện quét thay vì cố gắng bắt đầu kết nối.

Ví dụ: ta có thể quét tất cả các cổng lên đến 1000 bằng cách ra lệnh sau:

  • netcat -z -v domain.com 1-1000

Cùng với tùy chọn -z , ta cũng đã chỉ định tùy chọn -v để yêu cầu netcat cung cấp thêm thông tin chi tiết.

Đầu ra sẽ như thế này:

output
nc: connect to domain.com port 1 (tcp) failed: Connection refused nc: connect to domain.com port 2 (tcp) failed: Connection refused nc: connect to domain.com port 3 (tcp) failed: Connection refused nc: connect to domain.com port 4 (tcp) failed: Connection refused nc: connect to domain.com port 5 (tcp) failed: Connection refused nc: connect to domain.com port 6 (tcp) failed: Connection refused nc: connect to domain.com port 7 (tcp) failed: Connection refused . . . Connection to domain.com 22 port [tcp/ssh] succeeded! . . .

Như bạn thấy , điều này cung cấp rất nhiều thông tin và sẽ cho bạn biết ở mỗi cổng xem quá trình quét có thành công hay không.

Nếu bạn thực sự đang sử dụng một domain , đây là biểu mẫu bạn sẽ phải sử dụng.

Tuy nhiên, quá trình quét của bạn sẽ nhanh hơn nhiều nếu bạn biết địa chỉ IP mà bạn cần. Sau đó, bạn có thể sử dụng cờ -n để chỉ định rằng bạn không cần phân giải địa chỉ IP bằng DNS:

  • netcat -z -n -v 198.51.100.0 1-1000

Các thông báo trả về thực sự được gửi đến lỗi chuẩn (xem bài viết chuyển hướng I / O của chúng tôi để biết thêm thông tin). Ta có thể gửi các thông báo lỗi tiêu chuẩn thành tiêu chuẩn, điều này sẽ cho phép ta lọc kết quả dễ dàng hơn.

Ta sẽ chuyển hướng lỗi tiêu chuẩn sang kết quả tiêu chuẩn bằng cách sử dụng cú pháp bash 2>&1 . Sau đó, ta sẽ lọc kết quả bằng grep :

  • netcat -z -n -v 198.51.100.0 1-1000 2>&1 | grep succeeded
output
Connection to 198.51.100.0 22 port [tcp/*] succeeded!

Ở đây, ta có thể thấy rằng cổng duy nhất mở trong phạm vi 1-1000 trên máy tính từ xa là cổng 22, cổng SSH truyền thống.

Cách giao tiếp qua Netcat

Netcat không bị giới hạn trong việc gửi các gói TCP và UDP. Nó cũng có thể lắng nghe trên một cổng kết nối và gói tin. Điều này cho ta cơ hội kết nối hai version của netcat trong mối quan hệ client - server .

Máy tính nào là server và client nào chỉ là sự phân biệt có liên quan trong quá trình cấu hình ban đầu. Sau khi kết nối được cài đặt , giao tiếp hoàn toàn giống nhau theo cả hai hướng.

Trên một máy, bạn có thể yêu cầu netcat lắng nghe một cổng cụ thể để kết nối. Ta có thể làm điều này bằng cách cung cấp tham số -l và chọn một cổng:

  • netcat -l 4444

Điều này sẽ yêu cầu netcat lắng nghe các kết nối TCP trên cổng 4444. Là regular user (không phải root), bạn sẽ không thể mở bất kỳ cổng nào dưới 1000, như một biện pháp bảo mật.

Trên server thứ hai, ta có thể kết nối với máy đầu tiên theo số cổng mà ta chọn. Ta làm điều này giống như cách ta đã cài đặt kết nối trước đây:

  • netcat domain.com 4444

Nó sẽ trông như thể không có gì xảy ra. Tuy nhiên, bây giờ bạn có thể gửi tin nhắn ở hai bên của kết nối và chúng sẽ được nhìn thấy ở hai đầu.

Nhập tin nhắn và nhấn ENTER . Nó sẽ xuất hiện trên cả màn hình local và từ xa. Điều này cũng hoạt động theo hướng ngược lại.

Khi bạn chuyển xong thư, bạn có thể nhấn CTRL-D để đóng kết nối TCP.

Cách gửi file qua Netcat

Dựa trên ví dụ trước, ta có thể hoàn thành nhiều nhiệm vụ hữu ích hơn.

Bởi vì ta đang cài đặt một kết nối TCP thông thường, ta có thể truyền bất kỳ loại thông tin nào qua kết nối đó. Nó không giới hạn ở các tin nhắn trò chuyện do user nhập vào. Ta có thể sử dụng kiến thức này để biến netcat thành một chương trình truyền file .

, ta cần chọn một đầu của kết nối để lắng nghe các kết nối. Tuy nhiên, thay vì in thông tin lên màn hình, như ta đã làm trong ví dụ trước, ta sẽ đặt tất cả thông tin thẳng vào một file :

  • netcat -l 4444 > received_file

Trên máy tính thứ hai, tạo một file văn bản đơn giản bằng lệnh :

  • echo "Hello, this is a file" > original_file

Bây giờ ta có thể sử dụng file này làm đầu vào cho kết nối netcat mà ta sẽ cài đặt với máy tính đang nghe. Tệp sẽ được truyền giống như thể ta đã nhập nó một cách tương tác:

  • netcat domain.com 4444 < original_file

Ta có thể thấy trên máy tính đang chờ kết nối, hiện ta có một file mới được gọi là "tệp_có_tệp" với nội dung của file ta đã nhập trên máy tính khác:

  • cat received_file
output
Hello, this is a file

Như bạn thấy, bằng đường ống, ta có thể dễ dàng tận dụng kết nối này để chuyển tất cả các loại đồ vật.

Ví dụ, ta có thể chuyển nội dung của toàn bộ folder bằng cách tạo một tarball không tên khi đang di chuyển, chuyển nó vào hệ thống từ xa và extract nó vào folder từ xa.

Ở đầu nhận, ta có thể đoán trước được một file sắp tới cần được extract và extract bằng lệnh :

  • netcat -l 4444 | tar xzvf -

Dấu gạch ngang kết thúc (-) nghĩa là tar sẽ hoạt động trên đầu vào tiêu chuẩn, được truyền từ netcat qua mạng khi kết nối được thực hiện.

Bên cạnh nội dung folder mà ta muốn chuyển, ta có thể đóng gói chúng vào một tarball và sau đó gửi chúng đến máy tính từ xa thông qua netcat:

  • tar -czf - * | netcat domain.com 4444

Lần này, dấu gạch ngang trong lệnh tar nghĩa là tar và nén nội dung của folder hiện tại (như được chỉ định bởi ký tự đại diện *), và ghi kết quả vào kết quả chuẩn.

Điều này sau đó được ghi trực tiếp vào kết nối TCP, kết nối này sau đó sẽ được nhận ở đầu kia và được extract vào folder hiện tại của máy tính từ xa.

Đây chỉ là một ví dụ về chuyển dữ liệu phức tạp hơn từ máy tính này sang máy tính khác. Một ý tưởng phổ biến khác là sử dụng lệnh dd để tạo ảnh đĩa trên một mặt và chuyển nó đến một máy tính từ xa. Tuy nhiên, ta sẽ không đề cập đến vấn đề này ở đây.

Cách sử dụng Netcat làm web server đơn giản

Ta đã cấu hình netcat để lắng nghe các kết nối nhằm giao tiếp và truyền file . Ta có thể sử dụng khái niệm này để vận hành netcat như một web server rất đơn giản. Điều này có thể hữu ích cho việc kiểm tra các trang mà bạn đang tạo.

Đầu tiên, hãy tạo một file HTML đơn giản trên một server :

  • nano index.html

Dưới đây là một số HTML đơn giản mà bạn có thể sử dụng trong file của bạn :

index.html
<html>         <head>                 <title>Test Page</title>         </head>         <body>                 <h1>Level 1 header</h1>                 <h2>Subheading</h2>                 <p>Normal text here</p>         </body> </html> 

Lưu và đóng file .

Nếu không có quyền root, bạn không thể phục vụ file này trên cổng web mặc định, cổng 80. Ta có thể chọn cổng 8888 làm regular user .

Nếu bạn chỉ muốn phục vụ trang này một lần để kiểm tra xem nó hiển thị như thế nào, bạn có thể chạy lệnh sau:

  • printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888

Bây giờ, trong trình duyệt của bạn, bạn có thể truy cập nội dung bằng cách truy cập:

http://server_IP:8888 

trang netcat được phục vụ

Thao tác này sẽ phân phát trang và sau đó kết nối netcat sẽ đóng. Nếu bạn cố gắng làm mới trang, nó sẽ không xuất hiện :

trang netcat đã biến mất

Ta có thể yêu cầu netcat phân phát trang vô thời hạn bằng cách gói lệnh cuối cùng trong một vòng lặp vô hạn, như sau:

  • while true; do printf 'HTTP/1.1 200 OK\n\n%s' "$(cat index.html)" | netcat -l 8888; done

Điều này sẽ cho phép nó tiếp tục nhận các kết nối sau khi kết nối đầu tiên đóng.

Ta có thể dừng vòng lặp bằng lệnh CTRL-C trên server .

Điều này cho phép bạn xem cách một trang hiển thị trong trình duyệt, nhưng nó không cung cấp nhiều chức năng hơn. Bạn không bao giờ nên sử dụng điều này để phục vụ các trang web thực tế. Không có bảo mật và những thứ đơn giản như liên kết thậm chí không hoạt động chính xác.

Kết luận

Đến đây bạn sẽ có một ý tưởng khá tốt về việc netcat được dùng để làm gì. Đây là một công cụ đa năng có thể hữu ích để chẩn đoán sự cố và xác minh chức năng cấp cơ sở đang hoạt động chính xác với các kết nối TCP / UDP.

Sử dụng netcat, bạn có thể giao tiếp giữa các máy tính khác nhau rất dễ dàng để tương tác nhanh chóng. Netcat cố gắng làm cho các tương tác mạng trở nên minh bạch giữa các máy tính bằng cách loại bỏ sự phức tạp trong việc hình thành các kết nối.


Tags:

Các tin liên quan