linux之Go 中的服务器没有监听 tun0

sxdcgaq8080 阅读:157 2025-06-02 22:19:02 评论:0

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

服务器是:

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 时,服务器无法运行:

listen tcp 10.1.0.21:4444: bind: cannot assign requested address



它可以收听 10.1.0.20 ,但 Wireshark(以 root 身份)不会拦截 tun0 上的任何数据包,而我正在使用 netcat ( nc ) 向它发送数据包并且服务器成功响应。

为什么绑定(bind)不了 10.1.0.21 ?为什么 Wireshark 在监听 10.1.0.20 时无法拦截任何流量?

请您参考如下方法:

确保选择环回接口(interface)来捕获该流量,因为流量是本地的。另见:https://www.naturalborncoder.com/virtualization/2014/10/17/understanding-tun-tap-interfaces/

还有您关于绑定(bind)到 10.1.0.21 的其他问题已在上面的评论中回答。


标签:linux
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号