Linux Go中的服务器未侦听tun0

Linux Go中的服务器未侦听tun0,linux,go,tun,Linux,Go,Tun,我正在运行一个简单、标准的Go TCP服务器,我想将它绑定到我的tun0接口 服务器是: func main() { conn, err := net.Listen("tcp", "10.1.0.21:4444") if err != nil { fmt.Println(err) return } defer conn.Close() fmt.Println("Running on 10.1.0.21:4444")

我正在运行一个简单、标准的Go TCP服务器,我想将它绑定到我的tun0接口

服务器是:

func main() {
    conn, err := net.Listen("tcp", "10.1.0.21:4444")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer conn.Close()

    fmt.Println("Running on 10.1.0.21:4444")
    c, err := conn.Accept()
    if err != nil {
        fmt.Println(err)
        return
    }

    for {
        data, err := bufio.NewReader(c).ReadString('\n')
        if err != nil {
            fmt.Println(err)
            return
        }

        fmt.Print("Got ", data)
        myTime := "Hello"
        c.Write([]byte(myTime))
    }
}
作为root用户,要创建tun0,我运行:

ip tuntap add mode tun dev tun0
ip addr add 10.1.0.20/24 dev tun0
ip link set dev tun0 up
在收听
10.1.0.21
时,服务器无法运行:

侦听tcp 10.1.0.21:4444:bind:无法分配请求的地址

它可以监听
10.1.0.20
,但Wireshark(作为root)不会截获tun0上的任何数据包,而我正在使用
netcat
nc
)向其发送数据包,服务器会成功响应


为什么它不能绑定到
10.1.0.21
?为什么Wireshark在侦听
10.1.0.20
时无法拦截任何流量?

确保选择环回接口以捕获该流量,因为流量是本地的。另见:


您关于绑定到
10.1.0.21
的另一个问题已在上述评论中得到回答。

您是否检查了设备文件的权限?@MarkusWMahlberg如何检查?我以root用户身份运行该程序,但我仍将再次检查。我用这个来调试,都是在UbuntuYou分配的.21而不是.20上。您必须运行
ip addr add 10.1.0.21/24 dev tun0
以使其可用。@Peter“您分配的是.21而不是.20。您必须运行ip addr addr add 10.1.0.21/24 dev tun0以使其可用。”难道
10.1.0.21/24
10.1.0.20/24
不一样吗。一个在子网中分配.20,另一个在同一子网中分配.21。它不会分配子网中的所有地址(如果这是您所期望的)。它只是
addr add 10.1.0.20 netmask 255.255.255.0
(或者类似的东西;我忘记了确切的命令)的缩写。