如何在Java中禁用所有网络连接

时间:2011-01-10 10:07:40

标签: java windows network-programming

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

3 个答案:

答案 0 :(得分:9)

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

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

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

通过执行此操作,来自JVM内部的任何网络访问尝试都将抛出java.net.NetPermission

这也会破坏文件访问等内容,因此如果您需要允许它,您需要在特殊的安全策略文件(-Djava.security.policy=path/to/policy.file)中指定它们。应该有很多关于如何设置它的例子,只需搜索“java权限”就可以让你开始。

答案 1 :(得分:2)

好吧,我没有尝试过,但理论上你可以将SOCKS代理的系统属性设置为不存在的,并且根据文档,将通过SOCKS代理尝试所有TCP套接字 - 并且失败。

这样的事情:

java -DsocksProxyHost=127.0.0.1 SomeClass

答案 2 :(得分:2)

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

  1. 无法解析主机名的Crated通用策略文件(请参阅下面的代码段);

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

  3. 通用.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 "*";
    };
    

    如果某些内容试图在测试期间将内容传递到外部,则会因安全性异常而失败。