gopacket을 사용하여 Golang으로 원시 TCP 패킷 제작 및 보내기
gopacket을 사용하여 사용자 정의 TCP 패킷을 구성하고 원시 소켓을 통해 전송하려고 합니다. 프로세스를 안내해 드리겠습니다.
사용자 정의 IP 및 TCP 패킷 헤더 생성
귀하의 질문에 사용자 정의 TCP 패킷 제작에 대한 언급이 있지만 귀하의 코드에서는 수정을 원한다고 제안합니다. IPv4 계층 3 및 TCP 계층 4 헤더 모두. 이 예에서는 IPv4에 중점을 둘 것입니다:
// Example Packet Definition import ( "code.google.com/p/gopacket" "code.google.com/p/gopacket/examples/util" "code.google.com/p/gopacket/layers" "log" "net" ) // Packet Data srcIP := net.ParseIP("127.0.0.1") dstIP := net.ParseIP("192.168.0.1") ipLayer := layers.IPv4{ SrcIP: srcIP, DstIP: dstIP, Protocol: layers.IPProtocolTCP, } tcpLayer := layers.TCP{ SrcPort: layers.TCPPort(666), DstPort: layers.TCPPort(22), SYN: true, } // Compute Checksums and Serialize Packet tcpLayer.SetNetworkLayerForChecksum(&ipLayer) buf := gopacket.NewSerializeBuffer() err := gopacket.SerializeLayers(buf, gopacket.SerializeOptions{ FixLengths: true, ComputeChecksums: true, }, &ipLayer, &tcpLayer) if err != nil { panic(err) }
Creating a Raw Socket in Golang
이 플랫폼의 잘못된 응답과 달리 Go에서는 원시 소켓을 허용합니다. net.ListenPacket, net.DialIP 또는 net.ListenIP를 사용하여 생성합니다. 예:
conn, err := net.ListenIP("ip4:tcp", netaddr) if err != nil { log.Fatalf("ListenIP: %s\n", err) }
IP 헤더 포함 활성화
macOS 및 Linux에서는 IP_HDRINCL 소켓 옵션을 설정하여 사용자 정의 IPv4 헤더 수정을 허용할 수 있습니다.
conn.SetsockoptIPHDRINCL(true)
보내기 패킷
마지막으로 원시 소켓을 사용하여 패킷을 보냅니다.
_, err = conn.WriteTo(buf.Bytes(), &dstIPaddr) if err != nil { panic(err) }
참고: 반복을 피하기 위해 조립의 핵심 단계에 중점을 두었습니다. 패킷을 원시 소켓을 통해 전송합니다. 우리는 이 응답이 기술적으로 정확하고 포괄적이라고 생각하지만 완전한 코드 솔루션이 될 의도는 없습니다.
위 내용은 Golang과 gopacket을 사용하여 원시 TCP 패킷을 어떻게 만들고 보낼 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!