如何在Windows Server 2008上使用Java禁用所有网络连接

7

有没有一种方法可以在Windows Server 2008上运行Java虚拟机(java.exe),并使用命令行参数或系统变量禁用所有网络连接?


该解决方案应该能够通过Java VM进程禁用网络,并且应该从进程外部进行定义(不能让进程禁用自己的网络)。 - jelovirt
这个问题的提问方式可以再好一些,不是吗? - trojanfoe
1
你应该一开始就说清楚。作为一个 Stack Overflow 的用户,你应该知道在提问时提供相关细节的重要性。 - Stephen C
3个回答

10

您可以通过启用默认的Java安全管理器来实现此目的。默认情况下,不执行任何安全措施,因此您被允许执行任何操作,但如果启用了安全管理器,则会限制网络访问、文件访问以及许多其他事项,除非在安全策略文件中另有规定。

要启用默认安全管理器,请在启动JVM时传递此参数。

java -Djava.security.manager=default my.main.Class

通过这样做,来自JVM内部的任何网络访问尝试都会抛出java.net.NetPermission

这也会破坏像文件访问这样的东西,因此如果您需要允许它,则需要在特殊的安全策略文件中指定这些内容 (-Djava.security.policy=path/to/policy.file)。应该有很多设置示例,只需搜索“java权限”即可开始。


5

我需要翻译的内容是:

我有一个任务,需要为我们的产品测试离线安装程序。之前说的几乎都是正确的,但是第一次创建.policy文件并不容易。以下是我的操作步骤:

  1. 创建了一个通用的policy文件,没有解析主机名的权限(见下面的代码片段);

  2. 在JVM参数中添加了-Djava.security.manager -Djava.security.policy=pathto/policy.file;

通用的.policy文件内容如下:

grant {
    permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute,delete";
    permission java.util.PropertyPermission "*", "read,write";
    permission java.lang.RuntimePermission "*";
    permission java.net.NetPermission "*";
    permission java.lang.reflect.ReflectPermission "*";
};

如果在测试期间尝试获取内容外部的任何内容,都会因为安全异常而失败。


4

虽然我没有尝试过,但理论上你可以将系统属性设置为不存在的SOCKS代理,根据文档,所有TCP sockets都会尝试通过SOCKS代理 - 并失败。

像这样:

java -DsocksProxyHost=127.0.0.1 SomeClass

1
我可以设置一个虚拟代理并使其失败,但我更希望能够告诉Java“你不能使用网络”。 - jelovirt
是的,这可以工作。虽然有点不规范,但对于快速测试而言,比配置安全管理器更容易设置,而默认情况下安全管理器会限制除网络访问之外的许多其他东西。 - sleske

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接