【问题标题】:reply to udp packet is blocked对 udp 数据包的回复被阻止
【发布时间】:2013-04-24 09:44:02
【问题描述】:

我正在编写一个 C 程序来搜索本地网络上的 smb 共享并挂载它们。 为了获取找到的 smb 服务器的主机名,我向服务器发送了一个 udp nbns 数据包。 数据包正确,服务器回复。 我正在使用wireshark来检查这个。 我将我发送的数据包与 nbstat 发送的数据包进行了比较,我还比较了服务器返回的数据包。 除了 id 和校验和之外,它们是相同的。

当我使用 nbstat 发出请求时,回复数据包被正确接收,但是对我自己的数据包的回复可能被防火墙阻止了。 在收到服务器的回复后,客户端机器向服务器发送一条 icmp“Destination unreachable (Port unreachable)”消息。 我怀疑是我的防火墙发送的。

这是wireshark的输出

没有。时间源目标协议长度信息
12 29.870065 192.168.1.245 192.168.1.21 NBNS 92 姓名查询 NBSTAT * 13 29.870494 192.168.1.21 192.168.1.245 NBNS 253 名称查询响应 NBSTAT
14 29.870559 192.168.1.245 192.168.1.21 ICMP 281 目的地不可达(端口不可达)

我应该怎么做才能让回复通过?

【问题讨论】:

    标签: c udp firewall


    【解决方案1】:

    您的程序是否在侦听 UDP 端口 137 以接收服务器回复? 如果不是,这就解释了为什么您的主机发送 ICMP 数据包端口不可达。

    如果您在端口 137 上侦听,请在发送 NBNS 查询时尝试将源端口配置为端口 137。因此防火墙现在应该允许数据包到此端口。

    【讨论】:

    • 我不小心将绑定指向了错误的 sockaddr 结构。我将它绑定到服务器 ip 上的 137 端口。将其更改为正确的 sockaddr 实例会使 ICMP 消息消失。我想我的问题已经解决了。
    • 当你终于明白时,事情会变得如此简单。我最后的评论是不正确的。我假设我的程序应该在端口 137 上侦听,为了实现这一点,我创建了两个 struct sockaddr_in 实例,一个带有服务器 ip 和端口 137,一个带有客户端 ip 和端口 137。我将第一个用于套接字,第二个用于绑定。这是错误的。我现在将第一个用于套接字和绑定。这解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多