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
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? –
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