如何禁用Java中的所有networking连接

有没有办法在Windows Server 2008上运行Java VM( java.exe ),并使用命令行参数或系统variables禁用所有networking连接?

您可以通过启用默认的Java安全管理器来完成此操作 默认情况下没有执行安全措施,因此您可以执行任何操作,但是如果安全管理器已启用,则会限制网络访问,文件访问和许多其他操作,除非您在安全策略文件中另行指定。

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

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

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

这也将打破文件访问的东西,所以如果你需要允许它,你需要在一个特殊的安全策略文件( -Djava.security.policy=path/to/policy.file )中指定它们。 应该有很多关于如何设置它的例子,只要搜索“java permissions”就可以开始。

那么,我还没有尝试,但理论上你可以设置SOCKS代理的系统属性到一个不存在的,根据文档所有的TCP套接字将通过SOCKS代理尝试 – 并失败。

像这样的东西:

 java -DsocksProxyHost=127.0.0.1 SomeClass 

我有相同的任务来测试我们产品的离线安装程序。 上面所说的几乎都是正确的,但是创建.policy文件并不是第一次。 这是我做的:

  1. Crate通用策略文件,没有权限解析主机名(参见下面的代码片段);

  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 "*"; }; 

如果在测试过程中尝试获取内容以外的内容,则会导致安全异常。