2011-01-24 43 views
6

Tôi có một số câu hỏi về lỗ đục lỗ với UDP. Dựa trên wiki http://en.wikipedia.org/wiki/UDP_hole_punchingLỗ UDP Đột

1) Để thiết lập phiên UDP giữa hai bên (máy khách phía sau NAT, máy chủ không phải NAT), khách hàng chỉ cần gửi gói đến máy chủ và sau đó phiên được cho phép cả hai cách (gửi & nhận) thông qua tường lửa? Có nghĩa là khách hàng cũng có thể nhận được từ máy chủ.

2) Lỗ đục lỗ UDP: Hai máy khách đầu tiên kết nối với máy chủ, sau đó máy chủ cung cấp cổng ứng dụng khách/ip cho các máy khách khác, vì vậy khách hàng gửi gói tin cho nhau trên các cổng đó. Điều này có đúng không?

3) nếu # 2 là đúng, Tại sao tường lửa cho phép nhận dữ liệu từ IP khác so với mạng được sử dụng để tạo kết nối trên cổng đó? Âm thanh như một lỗ hổng bảo mật lớn nên được lọc một cách dễ dàng? Tôi hiểu rằng giả mạo nguồn IP sẽ lừa nó, nhưng điều này?

Cảm ơn bạn trước, Johan

Trả lời

4

1) Có, với tường lửa hợp lý nhất, trừ khi bạn định cấu hình tường lửa ở chế độ cực kỳ hoang tưởng.

2) Không chính xác. This article giải thích chi tiết hơn, nhưng ý tưởng là một trong những khách hàng đầu tiên gửi một datagram đến IP công cộng của người khác. Sau đó, gói dữ liệu này bị loại bỏ, nhưng máy khách khác biết rằng nó được gửi đi vì người đầu tiên đã nói với nó thông qua máy chủ. Sau đó, máy khách khác sẽ gửi một gói dữ liệu trở lại gói dữ liệu đầu tiên đến cùng một cổng mà từ đó gói dữ liệu đầu tiên bắt nguồn. Vì NAT tại máy khách đầu tiên nhớ rằng có một gói tin từ cổng đó, nó coi gói dữ liệu đến là một câu trả lời cho gói đầu tiên. Vấn đề ở đây là tìm ra cổng nào NAT sẽ chọn để gửi datagram đầu tiên, nhưng hầu hết NAT làm theo cách có thể dự đoán được vì vậy nó hầu như luôn hoạt động tốt, đôi khi không phải từ lần thử đầu tiên.

+0

Vì vậy, khi tôi hiểu nó có hai cổng khác nhau được sử dụng khi người dùng gửi dữ liệu; đầu tiên là cổng mà anh ta đã ràng buộc() (cổng 'riêng tư' của khách hàng) và cổng thực tế mà anh ta đang gửi (cổng 'công khai' của khách hàng). Vì vậy, tôi cần phải nói cho mỗi khách hàng những gì các khách hàng khác cổng công cộng được, nó sẽ không hoạt động nếu họ cố gắng để giao tiếp với cổng riêng của họ? (ví dụ tôi liên kết() tất cả các cổng đến 12340, các khách hàng khác không thể gửi nội dung tới các khách hàng khác IP + 12340?) – KaiserJohaan

+0

@Kaiser, thường thì nó sẽ không hoạt động. Bạn sẽ phải tìm ra cổng công khai nào được ánh xạ tới cổng riêng của bạn. Theo như tôi hiểu nó, nó được thực hiện bằng cách trước tiên gửi một cái gì đó đến một máy chủ từ cổng riêng này, sau đó máy chủ nói với cổng này cho cả hai bên.Nhưng nó vẫn còn giá trị cố gắng để giao tiếp với các cảng tư nhân, bằng cách sử dụng IP tư nhân quá. Điều này sẽ làm việc nếu cả hai khách hàng vô tình xảy ra phía sau cùng một NAT để họ có thể giao tiếp thông qua mạng LAN. –

2

1) Có. Tuy nhiên, bạn không cần phải đục lỗ nếu bạn đang liên hệ với một máy chủ không có NAT. Ứng dụng khách của bạn chỉ hoạt động bình thường.

2) Có.

3) Một số NAT thực sự hạn chế một cổng công cộng chỉ với một cặp người gửi-người nhận. Nếu bạn cần phải đục lỗ trong một kịch bản như vậy, cơ hội duy nhất của bạn là đoán cổng công khai mà NAT sẽ chọn cho kết nối trực tiếp.

Tuy nhiên, NAT không phải là tính năng bảo mật. Do đó, việc chấp nhận bất kỳ gói nào vào cổng công cộng không phải là lỗ hổng bảo mật vì không có sự khác biệt đối với trường hợp đơn giản của một khách hàng được kết nối trực tiếp với internet.

+0

Vì vậy, cổng riêng (cổng bind() trong ứng dụng) khác với cổng công cộng (thực sự được gửi đi). Khi khách hàng kết nối với máy chủ, máy chủ sẽ nhìn thấy công cộng hay cổng riêng? Tôi có cần phải chuyển tiếp cổng công cộng và không phải là cổng riêng, cho các khách hàng khác để cho phép họ giao tiếp không? – KaiserJohaan

+0

@KaiserJohaan Có, cổng riêng tư không liên quan đến giao tiếp công cộng – phihag