使用gopacket 在Go 中編寫原始TCP 封包
您的目標是使用gopacket 製作自訂TCP 封包並透過原始套接字發送它們。但是,您在提供的程式碼中遇到問題,導致以下恐慌:「src IP 127.0.0.1 無效。」
製作自訂IPv4 封包
範例您提供的程式碼也旨在製作自訂IP 第3 層標頭,這與單獨處理TCP 層不同。這裡有一個深入的解釋:
在Go 中創建原始套接字
與某些假設相反,在Go 中創建原始套接字可以使用net .ListenPacket、net.DialIP , 或net.ListenIP:
conn, err := net.ListenIP("ip4:tcp", netaddr)
設定IP 套接字選項
要設定自己的IPv4 第3 層標頭,您需要啟用名為IP_HDRINCL 的套接字選項。 Core Go 套件不支援此功能,但 ipv4 等第三方程式庫可以提供此功能:
conn, err := ipv4.NewRawConn(network, addr)
此函數建立原始連線並為 IPv4 啟用 IP_HDRINCL。
替代方案
對於涉及TCP 標頭的更簡單的任務操作時,延遲代碼可能適合:
// Create a raw socket fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_TCP)
但是,此方法不允許修改IPv4 標頭。
建議
要使用提供的程式碼解決您的問題,您需要使用類似的函式庫ipv4 啟用IP_HDRINCL 並設定自訂IP 標頭。或者,您可以探索 latency 套件,以取得 TCP 標頭操作的簡化方法。
以上是如何在 Go 中製作自訂 TCP 封包並避免「無效的 src IP 127.0.0.1」恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!