2013-02-13 52 views
5

Tôi cần triển khai giao thức UDP. PC phải nghe tại một cổng UDP chuyên dụng cho các gói dữ liệu đến. Nó cũng gửi gói (câu trả lời). Ứng dụng chạy trên Windows XP, 7, 8, ....Thời gian chờ lỗ UDP

Tường lửa Windows chặn các gói đến. Điều này có thể được phá vỡ bằng cách đục lỗ UDP. Vì vậy, tôi phải gửi một cái gì đó mà không nên làm tổn thương. Nhưng tôi muốn làm phiền càng ít càng tốt.

  • Làm cách nào để xác định thời gian chờ cho đến khi tường lửa đóng lỗ?
  • Tôi có thể phát hiện tường lửa đã đóng tường lửa để tôi phải gửi lại để mở gói không? Tất nhiên tôi sẽ không nhận được bất cứ điều gì khi tường lửa được đóng lại nhưng điều này có thể có lý do khác.

Trả lời

1

Để trả lời câu hỏi của riêng tôi: không có cách nào để xác định thời gian chờ. Bạn cần phải thử nghiệm thời gian chờ mà tường lửa Windows 7 sử dụng cho các kết nối UDP. Trải nghiệm hiện tại hiển thị thời gian chờ bốn giây nhưng điều này có thể thay đổi.

Một số lời khuyên chung cho lỗ đấm:

  1. Đừng làm phiền bất kỳ máy chủ khác trong mạng. Gửi một gói tin có nội dung không bị tổn thương.
  2. Không cần thiết phải gửi tới máy chủ lưu trữ mà bạn muốn là người gửi câu trả lời của bạn.
  3. Không cần thiết phải gửi tới cổng UDP mà bạn muốn làm người gửi. Gửi tới bất kỳ cổng UDP nào. Có một cổng loại bỏ (9) mà nên bỏ qua bất cứ điều gì bạn gửi.
  4. Đảm bảo gói của bạn thực sự được gửi. Nếu bạn cố gắng gửi đến một máy chủ chưa được nhìn thấy trong lần cuối cùng, ngăn xếp IP sẽ sử dụng giao thức ARP để nhận địa chỉ MAC. Nếu ngăn xếp IP không nhận được phản hồi ARP, nó không thể gửi và gói IP và không có lỗ nào được đục lỗ. Vấn đề này có thể được phá vỡ bằng cách gửi đến địa chỉ phát sóng mạng.
  5. Đảm bảo bạn đục lỗ vào mạng mong muốn bằng địa chỉ phát sóng của bộ điều hợp thích hợp.
+0

"Không cần thiết phải gửi đến cổng UDP mà bạn muốn là người gửi" -depends của loại NAT. Điều này đúng với Cone NAT bị hạn chế nhưng không phải đối với Cone NAT bị hạn chế. –

2

Một vài lời khuyên về lỗ đấm:

  1. Trên hầu hết các bức tường lửa (tôi giả sử Windows Firewall cũng) lỗ đấm chỉ cho phép một địa chỉ IP cụ thể để kết nối. Lỗ đấm thủ thuật tường lửa/NAT vào suy nghĩ rằng bạn đang giao tiếp với một IP cụ thể để nó cho phép các gói tin quay trở lại từ IP đó. Nếu bạn muốn nghe bất kỳ IP nào, bạn không thể sử dụng lỗ đục lỗ mà không có máy tính cầu có thể điều phối kết nối.
  2. Thời gian có thể thay đổi giữa tường lửa và/hoặc NAT. Bạn không chỉ phải lo lắng về tường lửa phần mềm (như tường lửa của Windows), nhưng nếu có tường lửa phần cứng và/hoặc thiết bị NAT, bạn cũng phải lo lắng về thời gian đó. Hardcoding một giá trị sẽ không hoạt động trừ khi bạn có một thiết lập phần mềm và mạng rất cụ thể. Phát hiện tường lửa đã đóng lỗ âm thanh như ý tưởng tuyệt vời, ngoại trừ hầu hết tường lửa/NAT không có cách nào để bạn phát hiện ra rằng chúng đã đóng lỗ và theo như tôi biết, không có cách nào tốt cho bạn chương trình để phát hiện nó.
  3. Để làm lỗ đục lỗ, bạn sẽ phải gửi các gói không có chức năng. Chúng thường là một gói NOP (No OPeration) hoặc KEEP_ALIVE không có mục đích và nếu một chương trình nhận được một chương trình, nó chỉ loại bỏ nó.

Đề xuất của tôi là triển khai gói KEEP_ALIVE mà chương trình khách hàng bỏ qua và để máy chủ định kỳ gửi gói KEEP_ALIVE cho khách hàng để giữ cho tường lửa mở. Điều này giả định rằng bạn biết IP của máy khách để bạn có thể gửi các gói KEEP_ALIVE. Nếu bạn chưa biết IP của khách hàng, bạn sẽ phải thiết lập một máy tính có thể truy cập công cộng hoặc vô hiệu hóa tường lửa cho chương trình máy chủ của bạn. Windows Firewall có một lệnh COM API hoặc netsh mà bạn có thể sử dụng để cho phép chương trình của bạn lắng nghe các kết nối. Đối với tường lửa phần cứng/NAT, bạn có thể thử sử dụng UPNP. Nếu điều đó không hiệu quả, tốt nhất bạn có thể làm là yêu cầu người dùng mở một cổng cụ thể cho chương trình của bạn.

+0

Cảm ơn văn bản. Nhưng tiếc là bạn đã bỏ lỡ câu hỏi làm thế nào để biết khi một lỗ mở hoặc đóng. – harper

4

Đây là cách tôi đo này, với netcat:

Mở máy chủ Unix của tôi (Mac OS X Darwin), không có tường lửa (hoặc trên một máy tính Windows nơi các bức tường lửa của Windows cho phép người netcat "nc" thực thi để lắng nghe trên các cổng UDP), tôi chạy một máy chủ UDP với sự chậm trễ biến được cung cấp bởi khách hàng từ xa:

WINHOST=10.116.140.69 
mkfifo f 
nc -u -p 2222 $WINHOST 6666 < f | \ 
(while read secs; do for sec in $secs; do echo sleep $sec 1>&2; sleep $sec; echo SLEPT $sec; echo SLEPT $sec 1>&2; done; done) > f 

Mở máy chủ Windows của tôi (Windows 7 Professional SP1 64-bit), Windows Firewall, với Cygwin cài đặt để cung cấp vỏ và netcat, tôi chạy ứng dụng khách UDP tương tác:

UNIXHOST=192.168.181.1 
nc -u -p 6666 $UNIXHOST 2222 

Bạn không phải sử dụng Cygwin; một netcat Windows sẽ hoạt động tốt, nhưng các dòng lệnh có thể khác nhau.

Sau đó, vào khách hàng đó, tôi nhập một loạt các khoảng thời gian kiểm tra, quan sát máy chủ đang ngủ sau đó trả lời, quan sát xem khách hàng có nhận được phản hồi hay không. Những hoạt động: 1, 2, 10, 60, 120, 180. Sau đó, thất bại này: 240. Tiến hành một tìm kiếm nhị phân giữa 180 và 240.

Ví dụ 1: Về phía khách hàng, tôi gõ:

10 
60 
120 
180 
240 

và quan sát sự chậm trễ yêu cầu phản hồi lên tới 180 tác phẩm, 240 không.

Ví dụ 2: Về phía khách hàng, tôi gõ:

180 
181 
182 
182 

và quan sát rằng sự chậm trễ yêu cầu đáp ứng lên đến 181 công trình, 182 thì không.

Ví dụ 3: Về phía khách hàng, tôi gõ (tất cả trên cùng một dòng):

180 180 180 181 181 181 182 182 182 183 183 183 

mà tạo ra một yêu cầu UDP từ khách hàng, sau đó là một loạt các phản ứng phân cách bằng 180, 181, 182, hoặc 183 giây. Nó đã được quan sát thấy rằng yêu cầu-đáp ứng chậm trễ lên đến 181 làm việc, và ngoài ra, tiếp tục phản ứng (không có yêu cầu mới) trong khoảng thời gian lên đến 181 giây cũng làm việc.

Vì vậy, lỗ hổng tường lửa có bộ hẹn giờ không hoạt động, bất kể sự không hoạt động chậm trễ trong phản hồi ban đầu hay trong lưu lượng bổ sung tiếp theo.

Kết quả trên nhiều máy tính:

  • On rằng Windows 7 SP1 Professional máy tính để bàn 64-bit, lỗ phản ứng UDP được mở cho 181 giây. Có thể tôi cũng đang đo một bức tường lửa mạng giữa hai hệ thống, vì chúng nằm trên các mạng riêng biệt - nhưng tôi nghĩ chúng được định tuyến không tường lửa. Trong mọi trường hợp, lỗ hổng tường lửa của Windows là ít nhất 181 giây trên hệ thống này.
  • Máy tính xách tay Windows 7 Professional SP1 64 bit khác, cùng một phân đoạn mạng (do đó chắc chắn không có tường lửa can thiệp), lỗ phản hồi UDP mở trong 64 giây.

Tôi muốn thấy các phép đo tương tự trên các máy Windows khác ở các mức hệ điều hành và cấu hình tường lửa khác nhau.

+0

Điều này thật tuyệt vời! Câu trả lời như thế này là những gì khiến SO thật đáng kinh ngạc. Tôi có thể đã dành một số tiền hợp lý của thời gian futzing và tái tạo một cái gì đó chức năng tương đương, nhưng bây giờ tôi không phải. Cảm ơn, Liudvikas – Cameron

+0

Khách truy cập mới đến điều này, đừng quên vô hiệu hóa tường lửa Linux/Unix của bạn hoặc điều này sẽ không hoạt động chính xác. – Cameron

Các vấn đề liên quan