【问题标题】:Windows XP firewall blocking in-bound UDP packets: programmatic exception for Java program or workaround?Windows XP 防火墙阻止入站 UDP 数据包:Java 程序的编程异常或解决方法?
【发布时间】:2012-01-31 06:36:42
【问题描述】:

我有一个 Java 程序,它使用 UDP 数据包与网络上的其他程序进行通信。我注意到在我的 Windows XP 机器上,我无法接收入站数据包,经过一番研究,我发现是防火墙造成了问题。

有没有办法为 Java 程序添加防火墙例外?谷歌搜索并没有透露任何信息。

有没有我可以在安装时运行的 DOS shell 命令来添加异常? (也无法在 Google 上找到任何相关内容。)

有没有办法让 Windows 知道入站数据包是被请求的?例如,我发送一个广播包,然后其他系统响应。对于允许响应数据包用于广播的端口,我能做些什么?

有没有一种完全不同的方式可以让我收到回复?我仍然需要广播,因为这将在甚至不一定有 DNS 的网络上运行,所以我不能依赖 Zeroconf 之类的东西(更不用说没有可用于 Java 的良好 Zeroconf 支持的事实)来发现网络上的其他机器。

谢谢。

【问题讨论】:

  • 你不知道整个过程发生在哪个端口上吗?问候
  • 如果有防火墙,你什么也做不了。您可以将防火墙视为切断的电线。自己修改防火墙设置也是非常糟糕的主意(并且需要以管理员身份运行)
  • 好吧,对于接收端口号,我可以静态分配一个,也可以让操作系统决定并将该信息通过广播包传递给远程机器。所以,我想我可以通知防火墙特定端口,但我想知道所有这些其他程序如何在不涉及用户的情况下配置它。
  • 我认为最简单的答案是找到一种方法让 Windows 知道传入的数据包是被请求的。如果我要建立一个传出 TCP 连接,那么同一连接的传入数据包就可以正常工作。不幸的是,传出的数据包必须是 UDP,因为它必须被广播(相对于可能数百次 TCP 尝试)。我可以使用稍微面向连接的数据报协议吗?

标签: java udp windows-firewall


【解决方案1】:

关于防火墙需要考虑三件事:

  1. 在防火墙中“打开”端口的最简单方法是让防火墙后面的程序向其对等方发送数据报。这(通常)创建一个临时规则,允许从对等方返回数据报到本地程序。但是,Windows Vista 和 Windows 7 仅当本地程序已被授权在网络上进行通信时才会执行此操作。首次运行程序时,会出现一个对话框,询问是否允许它与网络通信。如果您单击“允许访问”以外的任何内容,则该程序将被永久阻止。

  2. 最好的方法是让具有管理员权限的用户手动打开程序正在侦听和/或发送的任何端口号。

  3. 即使您打开一个端口,某些防火墙仍可能会阻止您的数据报。这可能是由于您的有效负载的前几个字节巧合地匹配防火墙不喜欢的某些模式这样晦涩难懂的东西。例如,Symantic Antivirus 可能会阻止任何 UDP
    其前几个字节为0x20 0x01 0x00 0x00 的数据报,因为它假定这是一个 Teredo 隧道。同样,如果您的数据报仅比路径 MTU 大几个字节,一些防火墙会看到一个小的 IP 片段并将其丢弃以防止古老的 DoS 攻击向量。

我的建议是根据您的应用程序的需要在 1 或 2 之间进行选择,并通过将每个数据报的前几个字节设置为常量并将每个数据报保持在 1400 字节以下来尽量避免 3。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2019-04-07
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多