2012-01-11 33 views
17

Tôi đang cố gắng triển khai lỗ hổng lỗ TCP bằng các cửa sổ ổ cắm bằng cách sử dụng chuỗi công cụ mingw. Tôi nghĩ rằng quá trình này là đúng nhưng lỗ dường như không mất. Tôi đã sử dụng this làm tài liệu tham khảo.Cú đấm lỗ TCP

  1. MộtB kết nối đến máy chủ S
  2. S gửi đến Một, B 's bộ định tuyến IP + cảng nó được sử dụng để kết nối với S
  3. S làm tương tự cho B
  4. Một bắt đầu 2 chủ đề:
    • Một cố gắng chủ đề kết nối đến router B 's với các thông tin gửi qua đường S
    • Các chủ đề khác đang chờ đợi một kết nối đến cùng cổng dùng để kết nối đến router của nó khi nó kết nối với S
  5. B cũng làm như vậy

Tôi không có vấn đề trong các mã Tôi nghĩ rằng từ:

  • MộtB không nhận được mỗi ip và cổng khác để sử dụng
  • Cả hai đều nghe trên cổng mà họ đã sử dụng để kết nối với bộ định tuyến của họ khi họ liên hệ với máy chủ
  • Cả hai đều kết nối với đúng ip và cổng nhưng hết thời gian chờ (mã lỗi 10060)

Tôi đang thiếu gì đó?

EDIT: Với sự trợ giúp của trình khám phá quy trình, tôi thấy rằng một trong những khách hàng đã quản lý thiết lập kết nối với đồng đẳng. Nhưng các đồng đẳng dường như không xem xét kết nối được thực hiện.

Đây là những gì tôi đã chụp bằng Wireshark. Vì lợi ích của ví dụ, máy chủ S và máy khách A nằm trên cùng một máy tính. Máy chủ S nghe trên một cổng cụ thể (8060) được chuyển hướng đến máy tính đó. B vẫn cố gắng kết nối trên IP đúng bởi vì nó thấy rằng địa chỉ công cộng của Một gửi bởi Slocalhost và do đó sử dụng địa chỉ IP công cộng của S để thay thế.(Tôi đã thay thế IP công cộng bởi placeholders)

wireshark

EDIT 2: Tôi nghĩ rằng sự nhầm lẫn là do thực tế rằng cả hai dữ liệu yêu cầu kết nối đến và outcoming được chuyển vào cùng một cổng. Mà dường như làm rối loạn trạng thái kết nối vì chúng ta không biết socket nào sẽ lấy dữ liệu từ cổng. Nếu tôi báo msdn:

Tùy chọn ổ cắm SO_REUSEADDR cho phép ổ cắm buộc buộc phải kết nối với cổng đang sử dụng bởi ổ cắm khác. Ổ cắm thứ hai gọi setsockopt với tham số optname được đặt thành SO_REUSEADDR và thông số tham số được đặt thành giá trị boolean là TRUE trước khi gọi ràng buộc trên cùng một cổng với ổ cắm gốc . Khi ổ cắm thứ hai đã kết nối thành công, hành vi đối với tất cả các ổ cắm bị ràng buộc với cổng đó là không xác định.

Nhưng nói trên cổng tương tự được yêu cầu của kỹ thuật TCP lỗ Dập để mở ra các lỗ!

+0

Vì vậy, giải pháp cho lỗ hổng TCP của bạn là gì? Tôi quan tâm về điều này. – petersaints

+0

Bạn có thể giải quyết vấn đề này và thực hiện cú đấm lỗ TCP không? – pkrish

+0

@pkrish Tôi chỉ quản lý để bắt đầu Đồng thời TCP Open (xem bình luận về câu trả lời đã chọn) – Giann

Trả lời

11

Một bắt đầu 2 chủ đề:
Một chủ đề cố gắng kết nối với router B với các thông tin gửi qua S
Các chủ đề khác đang chờ đợi một kết nối đến trên cùng một cổng dùng để kết nối đến router của nó khi nó được kết nối tới S

Bạn không thể làm điều này với hai chủ đề, vì nó chỉ là một thao tác. Mọi kết nối TCP đang tạo kết nối ra ngoài cũng đang chờ kết nối đến.Bạn chỉ cần gọi là 'kết nối', và cả hai bạn đều gửi các SYN đi ra ngoài để tạo kết nối và đợi cho các SYN gửi đến để thực hiện kết nối.

Tuy nhiên, bạn có thể cần phải đóng kết nối của mình với máy chủ. Nền tảng của bạn có khả năng không cho phép bạn thực hiện kết nối TCP từ cổng khi bạn đã có kết nối được thiết lập từ cùng một cổng đó. Vì vậy, cũng giống như bạn bắt đầu lỗ hổng lỗ TCP, hãy đóng kết nối đến máy chủ. Liên kết ổ cắm TCP mới với cùng cổng đó và gọi connect.

+0

Điều đó có hiệu quả, nhưng chỉ khi cả hai 'SYN' không đạt được hoặc ngang hàng trước khi cả hai đi qua NAT/Router tương ứng. Vì vậy, có một vấn đề thời gian nhỏ. Đó là Đồng thời TCP Mở. Nhưng http://www.bford.info/pub/net/p2pnat/index.html nói về một ổ cắm nghe đồng thời trong trường hợp có một yêu cầu kết nối không thành công. Tôi chưa bao giờ thấy công việc đó. – Giann

+0

Nếu không thành công, bạn có thể (ngón tay chéo) có thể thử lại ngay lập tức và vẫn hoạt động. Nhưng bạn không thể dựa vào việc làm việc của lỗ hổng TCP. –

+0

Bạn có biết một cách đáng tin cậy khác để thiết lập kết nối ngang hàng với các NAT/Router khác nhau không? – Giann

0
  1. Sử dụng Wireshark để kiểm tra yêu cầu kết nối tcp (quy trình thủ công 3 chiều) đang diễn ra chính xác.

  2. Đảm bảo chuỗi Trình nghe của bạn đang chọn() để tách ghép bộ mô tả.

  3. sockPeerConect (ổ cắm được sử dụng để kết nối Đồng đẳng khác) là FD_SET() trong chuỗi trình nghe.

  4. Đảm bảo bạn đang kiểm tra

    int Listener Thread() 
    { 
        while(true) 
        { 
         FD_SET(sockPeerConn); 
         FD_SET(sockServerConn); 
         FD_SET(nConnectedSock); 
         if (FD_ISSET(sockPeerConect) 
         { 
         /// and calling accept() in side the 
         nConnectedSock = accept(....); 
    
         } 
         if (FD_ISSET(sockServerConn) 
         { 
         /// receive data from Server 
         recv(sockServerConn); 
    
         } 
         if (FD_ISSET(nConnectedSock) 
         { 
         /// Receive data from Other Peer 
         recv(nConnectedSock); 
    
         } 
    
        } 
        } 
    

5.Ensure bạn đang đồng thời bắt đầu kết nối ngang hàng A đến B và B đến A.
6.Start bạn Listener Chủ đề Trước khi kết nối đến máy chủ và Peer và có Single Listener Thread để nhận Server và Client.

+0

Tôi không hiểu tại sao tôi phải sử dụng bộ cho ổ cắm. Nó thay đổi gì? – Giann

+0

Nó sẽ thông báo nếu một cái gì đó có sẵn trên socket.Chúng tôi phải liên tục kiểm tra xem có cái gì đó có sẵn trên ổ cắm cụ thể. –

+0

WSAETIMEDOUT .... Đảm bảo bạn Trong cài đặt NAT Thực hiện lưu lượng TCP được phép cho tất cả các cổng. –

-3

không phải mọi bộ định tuyến hỗ trợ tcp lỗ đấm, xin vui lòng kiểm tra giấy sau đó giải thích một cách chi tiết:

Peer-to-Peer Communication Across Network Address Translators

+1

Cảm ơn bạn đã liên kết cùng một tham chiếu mà tôi đã đưa vào câu hỏi của mình ... – Giann

+0

bạn có thể thêm bố cục mạng cho S, A và B và bộ định tuyến không, tôi nghi ngờ rằng vì bạn có S và A trên cùng một máy nên NAT của bạn router thậm chí không có bản dịch NAT trong bộ định tuyến cho B để đạt A vì A không có kết nối với S thông qua bộ định tuyến (chúng nằm trên cùng một máy!). để kiểm tra thích hợp, bạn nên đặt S của bạn không ở cùng một mạng LAN như A hoặc B. – Allen

1

Một giải pháp đơn giản để đi qua vào router NAT là làm cho giao thông của bạn theo một giao thức của bạn NAT đã có một thuật toán để chuyển tiếp, chẳng hạn như FTP.