2012-10-16 21 views
5

Nếu một chương trình đang chạy trên máy Linux, có cách nào để chương trình đó quét tìm các cổng được phép thông qua tường lửa không? ví dụ, nếu một lập trình viên muốn thực hiện một hệ thống trò chuyện, nhưng chương trình cần biết cổng nào không bị từ chối truy cập vào các kết nối đến bởi tường lửa của người dùng, có cách nào để kiểm tra điều này trong mã của bạn không? Một chương trình có thể không thất bại trong việc liên kết một ổ cắm với cổng ngay cả khi tường lửa đang chặn cổng đó từ các kết nối đến. Có cách nào để kiểm tra các cổng tường lửa mở không?Truy cập cổng TCP và C++

Sidenote: Điều này hoàn toàn dành cho mục đích giáo dục và không có ý định xấu, rõ ràng là tôi đang viết hệ thống trò chuyện và trong khi thử nghiệm, tôi không thể kết nối máy tính để bàn - máy tính xách tay cho đến khi tôi mở cổng theo cách thủ công thông qua tường lửa của tôi. Điều này dường như một chút với tôi, và không giống như một cái gì đó mà mã của một lập trình viên nên yêu cầu người dùng làm. Chưa kể tôi không muốn để lại vài người sử dụng mã này có nguy cơ (nếu rời khỏi một cổng vĩnh viễn mở làm như vậy). Vì vậy, có vẻ như tôi sẽ phù hợp hơn tìm một cách để sử dụng các cổng đã được mở cho các kết nối TCP đến.

sidesidenote: tất cả các khách hàng đang chạy fedora

+1

Khám phá [UPnP] (http://en.wikipedia.org/wiki/Universal_Plug_and_Play). –

+1

Chọn một cổng được đánh số cao và thực hiện một số cách khác. Tường lửa không nên chặn nội dung trên 32000. Phương pháp dựa trên UDP để kết nối với cổng chung (ví dụ 1900) được các dịch vụ khác sử dụng cho phép bạn khởi động một cổng nổi tiếng có khả năng mở để cung cấp khả năng khám phá cổng động được sử dụng cho TCP. –

+1

Tôi không nghĩ rằng điều này có thể được thực hiện một cách đáng tin cậy chỉ trên chính máy chủ. Nếu không sử dụng một số loại proxy từ xa, không có cách nào để máy chủ kiểm tra kết nối thông qua tường lửa perimiter. – Barmar

Trả lời

4

Bạn đã vấp vào vấn đề lớn thứ hai chi phối việc tạo ra các ứng dụng Internet mới hiện nay. Dĩ nhiên, khóa học lớn nhất đầu tiên là NAT, một vấn đề liên quan mạnh mẽ (và hy vọng sẽ biến mất cuối cùng vì IPv6).

Và không có câu trả lời dễ dàng. Một câu trả lời hay là UPnP, nhưng đó không phải là câu trả lời dễ dàng và không có nghĩa là phổ quát. Mạng của tôi không chạy.

Một câu trả lời khác là bằng cách nào đó, hãy tunnel mọi thứ bạn làm trên https (hoặc http nếu bạn phải). Nhưng đó là một nỗi đau lớn đối với một cái gì đó giống như một ứng dụng trò chuyện.