좋아,이 상황은 다소 드문 일이지만, 원시 소켓 (Linux의 C 언어)을 사용하여 TCP 연결 (3 방향 핸드 셰이크)을 설정해야합니다. 즉 IP 헤더와 TCP 헤더를 직접 만드십시오. 나는 서버를 작성하고있다 (그래서 나는 들어오는 SYN 패킷에 먼저 응답해야한다). 그리고 어떤 이유로 든 나는 그것을 올바르게 얻지 못한다. 예, SOCK_STREAM이이 문제를 처리 할 것이라는 것을 알고 있습니다.하지만 그 이유에 대해서는 제가 선택할 수있는 옵션이 아닙니다.SOCK_RAW 소켓을 사용하는 TCP 핸드 셰이크
원시 소켓을 사용하여 온라인에서 찾은 튜토리얼은 모두 SYN 플로터를 작성하는 방법을 설명하지만 실제로는 TCP 연결을 설정하는 것보다 다소 쉽습니다. 원본을 기반으로 응답을 작성할 필요가 없으므로 패킷. SYN flooder 예제가 작동하고있어 원본 소켓에서 들어오는 SYN 패킷을 읽을 수는 있지만 여전히 클라이언트로부터 들어오는 SYN에 유효한 SYN/ACK 응답을 생성하는 데 문제가 있습니다.
누구나 SYN flooder를 만드는 것을 넘어서는 원시 소켓 사용에 관한 좋은 지침서를 알고 있습니까? 아니면 누군가 SOCK_RAW가 아닌 SOCK_STREAM을 사용하여 이렇게 할 수있는 코드를 가지고 있습니까? 나는 매우 감사하게 될 것입니다.
MarkR 절대적 권리 - 문제는 포트가 닫혀 생각 때문에 커널 초기 패킷에 응답하여 리셋 패킷을 전송된다는 것이다. 커널이 응답에 나를 때리고 연결이 끊어집니다. 나는 이미 연결을 모니터하기 위해 tcpdump를 사용하고 있었다. 나는 더주의 깊어 야했고 두 가지 응답 중 하나가 내 프로그램이 만든 응답뿐만 아니라 모든 것을 망쳐 놨던 리셋이라는 것을 알았다. 도 오!
가장 잘 작동하는 솔루션은 MarkR에서 제안한 iptables 규칙을 사용하여 아웃 바운드 패킷을 차단하는 것입니다. 그러나 제안 된 것처럼 마크 옵션을 사용하는 것보다 쉬운 방법이 있습니다. 난 그냥 리셋 TCP 플래그가 설정되어 있는지 여부와 일치합니다. 정상적인 연결 과정에서 이것이 필요하지는 않을 것입니다. 사용중인 포트에서 모든 아웃 바운드 리셋 패킷을 차단하면 내 응용 프로그램에는 별 문제가되지 않습니다. 이것은 효과적으로 커널의 원치 않는 응답을 차단하지만 내 패킷은 차단하지 않습니다.
iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP
4 세의 질문이지만 귀하의 제안이 매우 흥미롭게 보입니다. 그래서 나는 당신에게 명확한 설명을하기로했습니다. 질문 : 잘못된 장치의 MAC 주소로 특정 컴퓨터에 응답 패킷을 라우팅하는 동안 라우터에 문제가 있습니까? 요즘 방화벽이나 바이러스 백신으로 패킷을 걸러 낼 수 있습니까? –
스푸핑 된 MAC은 포트 보안을 위해 구성된 경우 스위치로 필터링 될 수 있습니다. MAC 계층에는 ACL이있을 수 있지만 일반적으로 MAC을 스푸핑하는 것을 막을 수있는 방법은 없습니다. 네트워크 카드가이 스푸핑 된 맥에 대한 대답을 수락 할 수 있도록하기 만하면됩니다 (맥을 수락 된 패킷 테이블에 추가하거나 promisc 모드로 넣음). 권한이없는 경우이 작업을 수행하는 것은 좋지 않은 생각입니다. – eckes