【问题标题】:Server in Go not listening on tun0Go 中的服务器没有监听 tun0
【发布时间】:2020-03-15 10:27:27
【问题描述】:

我正在运行一个简单的标准 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:绑定:无法分配请求的地址

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

为什么不能绑定到10.1.0.21?为什么Wireshark监听10.1.0.20时不能拦截任何流量?

【问题讨论】:

  • 你检查过设备文件的权限吗?
  • @MarkusWMahlberg 我如何检查它们?我以 root 身份运行该程序,但我仍会仔细检查。我正在使用它来调试 my other question,两者都在 Ubuntu 上
  • 您分配了 .21 而不是 .20。您必须运行 ip addr add 10.1.0.21/24 dev tun0 才能使其可用。
  • @Peter “您分配了 .21 而不是 .20。您必须运行 ip addr add 10.1.0.21/24 dev tun0 才能使其可用。” 10.1.0.21/2410.1.0.20/24 不一样吗?
  • 一点也不。一个在子网中分配 0.20,另一个在同一子网中分配 0.21。如果这是您所期望的,它会分配子网中的所有地址。它只是 addr add 10.1.0.20 netmask 255.255.255.0 的缩写(或类似的东西;我忘记了确切的命令)。

标签: linux go tun


【解决方案1】:

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

您关于绑定到10.1.0.21 的其他问题已在上面的 cmets 中得到解答。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多