2008-09-21 29 views
15

Ok, tôi nhận thấy tình huống này hơi khác thường, nhưng tôi cần thiết lập kết nối TCP (bắt tay 3 chiều) chỉ sử dụng ổ cắm thô (trong C, trong linux) - tức là tôi cần tự xây dựng tiêu đề IP và tiêu đề TCP. Tôi đang viết một máy chủ (vì vậy trước tiên tôi phải trả lời gói SYN đến), và vì lý do nào đó tôi không thể làm cho nó đúng. Có, tôi nhận ra rằng một SOCK_STREAM sẽ xử lý việc này cho tôi, nhưng vì lý do tôi không muốn đi vào đó không phải là một lựa chọn. Các hướng dẫn tôi đã tìm thấy trực tuyến về cách sử dụng ổ cắm thô tất cả đều mô tả cách xây dựng một SYN flooder, nhưng điều này có phần dễ dàng hơn việc thiết lập kết nối TCP, vì bạn không phải xây dựng một phản hồi dựa trên bản gốc gói. Tôi đã nhận được các ví dụ về SYN flooder làm việc, và tôi có thể đọc gói SYN sắp tới tốt từ socket thô, nhưng tôi vẫn gặp sự cố khi tạo phản hồi SYN/ACK hợp lệ tới SYN đến từ máy khách. Vì vậy, có ai biết một hướng dẫn tốt về cách sử dụng ổ cắm nguyên mà vượt ra ngoài việc tạo ra một SYN flooder, hoặc không ai có một số mã có thể làm điều này (bằng cách sử dụng SOCK_RAW, và không SOCK_STREAM)? Tôi sẽ rất biết ơn.TCP bắt tay với SOCK_RAW socket


MarkR hoàn toàn đúng - vấn đề là hạt nhân gửi gói đặt lại để phản hồi gói ban đầu vì nó cho rằng cổng đã bị đóng. Hạt nhân đang đập tôi đến phản hồi và kết nối chết. Tôi đã sử dụng tcpdump để theo dõi kết nối đã có - tôi cần phải quan sát nhiều hơn và nhận thấy rằng có hai câu trả lời trong đó có một thiết lập lại đã làm hỏng mọi thứ, cũng như phản hồi mà chương trình của tôi đã tạo ra. D'OH!

Giải pháp dường như hoạt động tốt nhất là sử dụng quy tắc iptables, như đề xuất của MarkR, để chặn các gói đi. Tuy nhiên, có một cách dễ dàng hơn để làm điều đó hơn bằng cách sử dụng tùy chọn đánh dấu, như được đề xuất. Tôi chỉ phù hợp cho dù cờ TCP đặt lại được thiết lập. Trong quá trình kết nối bình thường, điều này không cần thiết, và nó không thực sự quan trọng đối với ứng dụng của tôi nếu tôi chặn tất cả các gói đặt lại đi từ cổng đang được sử dụng. Điều này có hiệu quả ngăn chặn phản ứng không mong muốn của hạt nhân, nhưng không phải gói của riêng tôi. Nếu cổng chương trình của tôi đang lắng nghe trên là 9999 thì rule iptables trông như thế này:

iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP 

Trả lời

1

Tôi không có một hướng dẫn, nhưng gần đây tôi đã sử dụng Wireshark để hiệu quả tốt để gỡ lỗi một số chương trình socket thô tôi đang làm . Nếu bạn nắm bắt các gói bạn đang gửi, wireshark sẽ làm một công việc tốt để hiển thị cho bạn nếu chúng không đúng định dạng hay không. Nó rất hữu ích cho việc so sánh với một kết nối bình thường.

2

Tôi không thể giúp bạn về bất kỳ hướng dẫn nào.

Nhưng tôi có thể cung cấp cho bạn một số lời khuyên về các công cụ mà bạn có thể sử dụng để hỗ trợ gỡ lỗi.

Trước hết, như bmdhacks đã đề xuất, hãy tải bản sao của wireshark (hoặc tcpdump - nhưng wireshark dễ sử dụng hơn). Chụp một cái bắt tay tốt. Hãy chắc chắn rằng bạn lưu này.

Chụp một trong những cái bắt tay của bạn không thành công. Wireshark có phân tích cú pháp gói và kiểm tra lỗi khá tốt, vì vậy nếu có một lỗi đơn giản, nó có thể sẽ cho bạn biết.

Tiếp theo, hãy tải bản sao tcpreplay. Điều này cũng nên bao gồm một công cụ gọi là "tcprewrite". tcprewrite sẽ cho phép bạn chia các tệp chụp đã lưu trước đó thành hai - một cho mỗi bên của cái bắt tay. Sau đó, bạn có thể sử dụng tcpreplay để phát lại một phía của cái bắt tay để bạn có một tập hợp các gói phù hợp để chơi cùng.

Sau đó, bạn sử dụng wireshark (một lần nữa) để kiểm tra câu trả lời của mình.

9

Bạn muốn triển khai một phần của ngăn xếp TCP trong không gian người dùng ... điều này là tốt, một số ứng dụng khác thực hiện việc này.

Một vấn đề bạn sẽ gặp phải là hạt nhân sẽ gửi ra (thường là tiêu cực, không có ích) trả lời các gói tin đến. Điều này sẽ làm hỏng mọi giao tiếp mà bạn cố gắng khởi tạo. Một cách để tránh điều này là sử dụng một địa chỉ IP và giao diện mà hạt nhân không có ngăn xếp IP của nó bằng cách sử dụng - đó là tốt, nhưng bạn sẽ cần phải đối phó với các công cụ liên kết lớp (cụ thể, arp) chính mình. Điều đó sẽ yêu cầu một ổ cắm thấp hơn IPPROTO_IP, SOCK_RAW - bạn cần một ổ cắm gói (tôi nghĩ). Bạn cũng có thể chặn các phản hồi của hạt nhân bằng cách sử dụng quy tắc iptables - nhưng tôi khá nghi ngờ rằng các quy tắc cũng sẽ áp dụng cho các gói của riêng bạn, trừ khi bạn có thể quản lý chúng theo cách khác (có thể áp dụng netfilter). "đánh dấu" để gói riêng của bạn?)

đọc ổ cắm trang người đàn ông

(7) ip (7) gói (7)

nào giải thích về các lựa chọn khác nhau và IOCTLs áp dụng cho các loại của ổ cắm.

Tất nhiên bạn sẽ cần một công cụ như Wireshark để kiểm tra những gì đang xảy ra. Bạn sẽ cần một số máy để kiểm tra điều này, tôi khuyên bạn nên sử dụng vmware (hoặc tương tự) để giảm số lượng phần cứng cần thiết.

Rất tiếc, tôi không thể đề xuất một hướng dẫn cụ thể.

Chúc may mắn.

0

Có cấu trúc cho tiêu đề IP và TCP được khai báo trong netinet/ip.h & netinet/tcp.h tương ứng. Bạn có thể muốn xem các tiêu đề khác trong thư mục này cho các macro bổ sung & những thứ có thể được sử dụng.

Bạn gửi gói có bộ cờ SYN và số thứ tự ngẫu nhiên (x). Bạn sẽ nhận được SYN + ACK từ phía bên kia. Gói này sẽ có một số xác nhận (y) cho biết số thứ tự tiếp theo mà phía bên kia đang mong nhận được cũng như một số thứ tự khác (z). Bạn gửi lại gói ACK có số thứ tự x + 1 và số ack z + 1 để hoàn thành kết nối.

Bạn cũng cần đảm bảo rằng bạn tính toán tổng kiểm tra TCP/IP thích hợp & điền phần còn lại của tiêu đề cho các gói bạn gửi. Ngoài ra, đừng quên những thứ như host theo thứ tự byte &.

TCP được định nghĩa trong RFC 793, có sẵn ở đây: http://www.faqs.org/rfcs/rfc793.html

0

Tùy thuộc vào những gì bạn đang cố gắng để làm điều đó có thể được dễ dàng hơn để có được phần mềm hiện có để xử lý các tín hiệu bắt tay TCP cho bạn.

Một ngăn xếp IP nguồn mở là lwIP (http://savannah.nongnu.org/projects/lwip/) cung cấp ngăn xếp tcp/ip đầy đủ. Nó là rất có thể để có được nó chạy trong chế độ người dùng bằng cách sử dụng hoặc SOCK_RAW hoặc pcap.

0

nếu bạn đang sử dụng ổ cắm thô, nếu bạn gửi bằng cách sử dụng địa chỉ mac nguồn khác với địa chỉ thực tế, linux sẽ bỏ qua gói phản hồi và không gửi rst.

+0

Tôi biết đó là câu hỏi 4 năm nhưng đề xuất của bạn trông khá thú vị nên tôi quyết định yêu cầu bạn làm rõ. Câu hỏi đặt ra là: Có vấn đề gì với bộ định tuyến trong khi định tuyến gói phản hồi tới một số máy nhất định với địa chỉ MAC của thiết bị sai không? Gói dữ liệu có được lọc bởi tường lửa hiện hành hoặc chống vi-rút không? –

+0

Một MAC giả mạo có thể được lọc bằng các nút chuyển nếu chúng được cấu hình để bảo mật cổng. Có thể có ACL trên lớp MAC, nhưng thông thường không có gì ngăn cản bạn khỏi các MAC giả mạo. Bạn chỉ cần đảm bảo rằng card mạng của bạn sẽ chấp nhận câu trả lời cho mac giả mạo này (bằng cách thêm mac vào bảng các gói được chấp nhận hoặc bằng cách đặt nó trong chế độ promisc). Đây là một ý tưởng tồi để làm điều này nếu bạn không được ủy quyền. – eckes

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