> 백엔드 개발 > Golang > Golang과 gopacket을 사용하여 원시 TCP 패킷을 어떻게 만들고 보낼 수 있나요?

Golang과 gopacket을 사용하여 원시 TCP 패킷을 어떻게 만들고 보낼 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-12-08 01:46:12
원래의
972명이 탐색했습니다.

How can I craft and send raw TCP packets using Golang and gopacket?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿