【问题标题】:Listen all IP packets including ICMP, TCP and UDP?监听所有 IP 数据包,包括 ICMP、TCP 和 UDP?
【发布时间】:2017-08-25 04:17:25
【问题描述】:

特别是在golang中,有net.ListenIPnet.ListenTCP这样的接口。

我想知道,如果进程 p1 ListenIP(192.168.1.1) 和进程 p2 ListenTCP(192.168.1.1:80),所有发往 192.168.1.1 的数据包(无论是 TCP 还是 UDP)都会被 p1 拦截,而 p2 将永远不会接受 TCP 连接?

【问题讨论】:

  • 为什么不自己测试一下呢?设置起来应该不难。
  • @RayfenWindspear 谢谢。我已经完成了测试,结果 p2 仍然可以接受 TCP 连接。令人困惑。

标签: sockets networking go tcp


【解决方案1】:

这里是net.ListenIP()的源码:

// ListenIP listens for incoming IP packets addressed to the local
// address laddr.  The returned connection's ReadFrom and WriteTo
// methods can be used to receive and send IP packets with per-packet
// addressing.
func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error) {
    net, proto, err := parseNetwork(netProto)
    if err != nil {
        return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: err}
    }   
    switch net {
    case "ip", "ip4", "ip6":
    default:
        return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(netProto)}
    }   
    fd, err := internetSocket(net, laddr, nil, noDeadline, syscall.SOCK_RAW, proto, "listen", noCancel)
    if err != nil {
        return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: err}
    }   
    return newIPConn(fd), nil 
}

它创建一个原始套接字,在 linux 上,IPPROTO_RAW socket 仅用于发送。 TCP 和 UDP 数据包永远不会传递到原始套接字,它们总是由内核协议栈处理。 ICMP 数据包的副本被传递到匹配的原始套接字。所有其他发往未由内核子系统处理的协议的数据包都被传递到原始套接字。

【讨论】:

  • 内核 tcp/ip 栈(如 tcp、udp)可以处理的数据包将被传递到内核栈,内核栈不能处理的数据包将被传递到原始套接字。我理解你的意思吗?
  • 几乎,请注意,ICMP 数据包的副本被传递到匹配的原始套接字。例如,您可以调用net.ListenIP("ip4:icmp", laddr) 来获取ICMP echo 数据包(ping 请求),但内核已经向发送者发送了回复(默认情况下)。
  • 如果我想拦截所有数据包(发往某个 ip 地址或网络接口),以便其他进程永远不会收到 tcp 或 udp 数据包。那可能吗?我正在用户空间中实现一个交换机/路由器。
【解决方案2】:

您可能想改用TUN device。这确实是拦截所有 IP 流量的唯一方法。

您可以使用像 https://github.com/songgao/water 这样的库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多