我有一个 Java 程序,它使用 UDP 数据包与网络上的其他程序通信。我注意到在我的 Windows XP 机器上,我无法接收入站数据包,经过一番研究,我发现是防火墙导致了问题。
有没有办法为Java程序添加防火墙异常(exception)?谷歌搜索没有透露任何信息。
有没有我可以在安装时运行的 DOS shell 命令来添加异常? (也无法在 Google 上找到任何相关信息。)
有没有一种方法可以让 Windows 知道入站数据包已被请求,从而解决这个问题?例如,我发送一个广播数据包,然后其他系统响应。关于将哪些端口用于允许响应数据包的广播,我可以做些什么?
我可以采用完全不同的方式来接收回复吗?我仍然需要广播,因为这将在甚至不一定有 DNS 的网络上运行,所以我不能依赖像 Zeroconf 这样的东西(更不用说没有可用于 Java 的 Zeroconf 支持这一事实)来发现网络上的其他机器。
谢谢。
最佳答案
关于防火墙,需要考虑三件事:
在防火墙中“打开”端口的最简单方法是让防火墙后面的程序向其对等方发送数据报。这(通常)会创建一个临时规则,允许将数据报从对等方返回到本地程序。但是,Windows Vista 和 Windows 7 只有在本地程序已被授权在网络上进行通信时才会这样做。首次运行该程序时,会出现一个对话框,询问是否允许它与网络对话。如果您单击“允许访问”以外的任何内容,则该程序将被永久阻止。
最好的方法是让具有管理员权限的用户手动打开程序正在监听和/或发送的任何端口号。
即使您打开一个端口,某些防火墙仍可能会阻止您的数据报。这可能是由于一些模糊不清的东西造成的,比如你的有效负载的前几个字节巧合地匹配了防火墙不喜欢的一些模式。例如,Symantic Antivirus 可能会阻止任何 UDP
前几个字节为0x20 0x01 0x00 0x00
的数据报,因为它假定这是一个 Teredo 隧道。同样,如果您的数据报仅比路径 MTU 大几个字节,一些防火墙会看到一个小的 IP 片段并将其丢弃以防止古老的 DoS 攻击媒介。
我的建议是根据您的应用程序的需要在 1 或 2 之间进行选择,并通过将每个数据报的前几个字节设置为常量并将每个数据报保持在 1400 字节以下来尽量避免选择 3。
关于java - Windows XP 防火墙阻止入站 UDP 数据包 : programmatic exception for Java program or workaround?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8691646/