Go net.DialUDP 自动选择环回接口

Go net.DialUDP auto-selecting loopback interface

我需要从主机上的 eth0 发送一些 UDP 数据包到它自己,也在 eth0 上。

我有一些可用的 Go 代码,但它似乎使用的是环回接口而不是预期的 eth0。

package main

import (
    "net"
)

func main() {
    ip := net.ParseIP("192.168.1.158")

    src := net.UDPAddr{IP: ip, Port: 8888,}
    dest := net.UDPAddr{IP: ip, Port: 88}

    conn, _ := net.DialUDP("udp", &src, &dest)

    conn.Write([]byte("hi"))
}

192.168.1.158 是我机器上接口的主要且唯一的 IP 地址。

运行 以下命令显示了流量:

sudo tcpdump udp -v -i lo

但是,我希望流量是 to/from 具有我定义的 IP 地址的系统接口。

我是不是漏掉了一步?

我也尝试过这种略有不同的方法,但结果相同:

src, _ := net.ResolveUDPAddr("udp", "192.168.1.158:8888")
dest, _ := net.ResolveUDPAddr("udp", "192.168.1.158:88")

However, I would expect the traffic be to/from the system interface with the IP address I've defined.

这完全是错误的期望,与围棋无关。

只需尝试 ping 192.168.1.158 并检查 tcpdump -i lo -n icmptcpdump -i eth0 -n icmp 数据实际传输的位置。您将看到数据包在 lo 接口上传输。类似的 ip route get 192.168.1.158 将向您显示到您本地地址的路由通过 lo 接口。