1

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

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

是否有我可以在安装时运行的 DOS shell 命令来添加异常?(在谷歌上也找不到任何东西。)

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

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

谢谢。

4

1 回答 1

3

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

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

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

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

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

于 2012-01-10T17:21:37.977 回答