当前位置: 首页 > 知识库问答 >
问题:

node.js - 防火墙开启,UDP的广播回调接收不到?

微生毅
2024-10-11

连接的设备和电脑 不在同一网段下(比如设备是192.168.10.100, 本地IP是192.168.1.10),防火墙开启后,UDP的广播回调收不到,关闭就可以接收到;
使用Wireshark抓包是否开启防火墙都是正常的(发送广播和接收都是正常的);
我看到有些软件是可以做的开启防火墙也可以正常的;
我使用的是electron和nodeJS
请问下这种情况下怎么处理可以不开启防火墙也能正常获取到广播返回的数据;

const dgram = require('dgram')
  const client = dgram.createSocket('udp4')

  const broadcastAddress = '255.255.255.255'
  const port = 7000

  client.on('error', (err) => {
    console.log(`client error:\n${err.stack}`)
    client.close()
  })

  client.on('message', (msg, rinfo) => {
    // 防火墙开启后接收不到数据
    console.log(`${msg}`, rinfo)
    client.close()
  })

  // 设置套接字选项以允许广播
  client.bind(
    {
      address: localAddress,
      exclusive: false // 如果设置为true,则不允许其他套接字绑定到相同的地址和端口组合
    },
    function () {
      const message = Buffer.from(JSON.stringify({ device: 'mesh', method: 'discover' }))
      client.setBroadcast(true)
      client.send(message, 0, message.length, port, broadcastAddress, function (err) {
        if (err) {
          return console.log('Error sending broadcast:', err)
        }
      })
    }
  )

共有2个答案

鲜于凯歌
2024-10-11

可以尝试为防火墙开放7000端口
如果是linux系统sudo iptables -I INPUT -p udp --dport 7000 -j ACCEPT,如果是windows系统,在控制面板\系统和安全\Windows Defender 防火墙\高级设置中新建入站规则,添加UDP端口7000;

彭弘伟
2024-10-11

在防火墙开启时,UDP广播数据可能因安全策略被阻止。防火墙通常默认阻止未明确允许的入站广播流量,因为这类流量可能用于未经授权的扫描或网络攻击。然而,您可以通过配置防火墙规则来允许特定的UDP广播流量通过。

解决方案

  1. 配置防火墙规则
    您需要在防火墙中配置规则,允许UDP端口7000上的入站广播流量。这可以通过防火墙的管理界面或使用命令行工具完成,具体取决于您使用的操作系统和防火墙软件。

    对于Windows系统,您可能需要使用“高级安全Windows防火墙”来创建入站规则,允许UDP协议、特定端口(如7000)和所有源地址(因为广播地址是255.255.255.255,但实际来源可能来自不同IP)。

    对于Linux系统,您可以使用iptablesfirewalld等工具来添加类似的规则。例如,使用iptables添加规则的命令可能类似于:

    sudo iptables -A INPUT -p udp --dport 7000 -j ACCEPT

注意:这仅是一个基本示例,实际规则可能需要更详细的配置,以确保仅允许来自特定网络或接口的广播流量。

  1. 检查路由器和交换机设置
    有时,路由器或交换机也可能配置为阻止或限制广播流量。确保这些设备没有设置会阻止您的广播数据包的策略。
  2. 使用Wireshark进行调试
    继续使用Wireshark可以帮助您确认数据包是否被防火墙或网络设备拦截。通过监控网络接口,您可以看到数据包是否离开您的计算机并尝试到达目标,以及它们是否被其他设备或软件响应。
  3. 代码审查
    您的Node.js代码看起来基本正确,但请确保localAddress变量已正确定义并设置为本地网络接口的有效IP地址。此外,检查是否有其他网络配置(如子网掩码)可能影响广播的发送和接收。
  4. 软件和网络兼容性
    您提到有些软件可以在防火墙开启时正常工作。这可能是因为这些软件已经配置了必要的防火墙规则,或者它们使用了不同的通信机制(如TCP而非UDP,或不同的端口)。了解这些软件的实现可能有助于您找到解决问题的方法。
  5. 使用VPN或网络桥接
    如果设备和电脑不在同一网段,并且您无法修改防火墙规则或路由器设置,您可能需要考虑使用VPN(虚拟专用网络)或网络桥接技术来将设备置于与电脑相同的网络环境中。

通过上述步骤,您应该能够解决在防火墙开启时无法接收UDP广播数据的问题。如果问题仍然存在,请考虑咨询网络管理员或寻求专业的技术支持。

 类似资料:
  • 基本概念 netfilter Linux 内核包含一个强大的网络过滤子系统 netfilter。netfilter 子系统允许内核模块对遍历系统的每个网络数据包进行检查。这表示在任何传入、传出或转发的网络数据包到达用户空间中的组件之前,都可以通过编程方式检查、修改、丢弃或拒绝。netfilter 是 RHEL 7 计算机上构建防火墙的主要构建块。 尽管系统管理员理论上可以编写自己的内核模块以与 n

  • 问题内容: 可以说我有两台计算机。 他们通过彼此了解公共IP和私有IP 。 一个客户端正在侦听,另一个客户端正在发送一些字符串。 我希望通过UPD打孔看到这种情况: 能否再有一个伪示例说明如何通过对称NAT进行打孔?假设将有服务器S帮助猜测端口号并在客户端A和客户端B之间建立连接。 如果您还要考虑双重NAT,那将是很好的。 注意: 您可以使用STUN查找IP和端口,但是您必须编写自己的代码,以通过

  • 准备查看下centos服务器是用的那个防火墙管理工具,结果发现了问题 firewall是开启状态 但是这样看,firewall却是关闭状态,iptables是开启的 到底哪个是开启的,那个是关闭的啊? 新手,求帮助

  • 我们现有的软件定期向本地子网(X.X.X.255)上的特定端口(7125)广播UDP数据包。我们的监控软件运行在HP-UX(11.11)上,可以接收这些数据包,没有问题。然而,在将监控软件移植到Linux(RHEL6.1)之后,我们发现它并没有接收到广播数据包。tcpdump显示了到达Linux主机的数据包,但内核不会将它们发送给我们的软件。 我使用了几个Python2.x脚本,这些脚本模拟了监控

  • 我有一个服务器写在JavaServerSocket。 我有一个客户端,它位于一个公司防火墙之上,除了公共端口之外,它阻止了所有东西。 我已在SMTP端口(#25)上启动服务器。 有防火墙的用户连接到它,到目前为止一切正常。 然后服务器处理ServerSocket.accept()。据我所知,它在一个随机端口上创建一个套接字(每次端口号都不同)。因为防火墙而失败。 我的问题是-如何制作ServerS

  • 我们所有的例子这一点利用传输方式称为“单播”:“将消息发送给一个网络拥有唯一地址的目的地”,这种模式支持连接和无连接协议。 然而,UDP 提供了额外的传输模式对多个接收者发送消息: 多播:传送给一组主机 广播:传送到网络上的所有主机(或子网) 示例应用程序在本章将说明使用 UDP 广播发送消息,可以接收到所有主机在同一网络。为此我们将使用特殊的“有限广播”或“零”网络地址255.255.255.2