Sử dụng `/ dev / udp` của bash, làm sao tôi biết cổng có mở không?


14

Tôi không có quyền truy cập netcathoặc nmapvì vậy tôi đang cố gắng sử dụng bashvà các /dev/udp/tệp đặc biệt để kiểm tra các cổng.

Tôi có thể làm một cái gì đó như:

echo "" > /dev/udp/example.com/8000

Nhưng $?luôn luôn là 0khi sử dụng UDP. Tôi cho rằng đó là vì giá trị trả về của echo ""lệnh có đúng không?

Về cơ bản, tôi đang cố gắng tái tạo những gì tôi có thể làm với nmapnetcat:

nmap -sU -p 8000 example.com | grep open >/dev/null && echo 'open'
nc -z -u example.com 8000 && echo 'open'

Làm thế nào tôi có thể làm điều này với /dev/udp?


1
UDP không đảm bảo phân phối, vì vậy ngay cả khi bash nghĩ rằng nó đã thành công trong việc gửi tin nhắn, tin nhắn có thể đã bị hủy trên đường đi. Làm thế nào bạn kiểm tra việc gửi không thành công (không phải là kết nối không thành công: UDP không phải là kết nối)?
Gilles 'SO- ngừng trở thành ác quỷ'

Câu trả lời:


13

Đối với tcp, chỉ cần kiểm tra $?. Nếu kết nối không thành công, $?sẽ không được 0:

$ >/dev/tcp/google.com/81
bash: connect: Network is unreachable
bash: /dev/tcp/google.com/81: Network is unreachable
$ echo $?
1

Sẽ mất thời gian bashđể nhận ra rằng kết nối thất bại. Bạn có thể sử dụng thời gian chờ để kích hoạt bash:

$ timeout 1 bash -c '>/dev/tcp/google.com/80' &&
  echo Port open ||
  echo Port close
Port open

Kiểm tra cổng udp phức tạp hơn.

Nói đúng ra, không có trạng thái mở (tất nhiên, udp là giao thức không trạng thái ) với udp. Chỉ có hai trạng thái với udp, nghe hay không . Nếu trạng thái không , bạn sẽ nhận được Điểm đến ICMP Không thể truy cập .

Thật không may, tường lửa hoặc bộ định tuyến thường làm rơi các gói ICMP đó, vì vậy bạn sẽ không chắc chắn trạng thái của cổng udp.


Đọc lại câu hỏi của tôi để tập trung vào UDP. Tôi xin lỗi vì đã chỉnh sửa ninja. Tôi nghĩ rằng nó sẽ tương tự vì vậy không làm nên sự khác biệt. Cảm ơn đã xóa nó lên.
Belmin Fernandez

10

Nói chung, bạn không thể.

Không giống như TCP, UDP là không kết nối. Bạn không thể phát hiện ra rằng một cổng được mở đơn giản bằng cách tạo kết nối không làm gì với cổng đó giống như bạn có thể với TCP. Thay vào đó, bạn cần gửi dữ liệu tới cổng và xem điều gì xảy ra và các chi tiết của UDP được triển khai trong thế giới thực khiến việc diễn giải các kết quả trở nên khó khăn. Ngay cả các công cụ cấp gói phức tạp như nmapkhông thể biết chắc chắn nếu có một chương trình nghe một cổng UDP cụ thể. nmapphân loại cổng UDP thành ba nhóm:

  1. Chắc chắn mở. Gửi một gói đến cổng gợi ra phản hồi dữ liệu từ máy đích.
  2. Chắc chắn đóng cửa. Gửi một gói đến cổng gợi ra thông báo "ICMP Destination Unreachable" từ máy đích.
  3. Hoặc mở hoặc lọc. Gửi một gói đến cổng gợi ra không có phản hồi nào. Có lẽ có một tường lửa làm rơi các gói tin; có thể có một chương trình lắng nghe và nmapchỉ chưa tìm ra cách nhận được phản hồi; có thể người dùng đã không gặp may và tất cả các gói bị mất trong quá trình vận chuyển.

Thông tin tuyệt vời về nmap. Cảm ơn, điều này làm rõ rất nhiều nhầm lẫn.
Belmin Fernandez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.