2011-01-10 24 views
3

有沒有辦法在Windows Server 2008上運行Java VM(java.exe)並使用命令行參數或系統變量禁用所有網絡連接?如何禁用Java中的所有網絡連接

+0

解決方案應該能夠爲每個Java VM進程禁用網絡,並且應該從進程外部進行定義(不允許進程禁用其自己的網絡)。 – jelovirt 2011-01-10 10:15:45

+0

這可能會被問得好一點。 – trojanfoe 2011-01-10 10:18:26

回答

9

您可以通過啓用默認Java安全管理做到這一點。默認情況下,沒有執行安全措施,因此您可以執行任何操作,但是如果安全管理器已啓用,則會限制網絡訪問,文件訪問和許多其他操作,除非您在安全策略文件中另行指定。

使默認安全管理器在啓動時將此參數傳遞給JVM。

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

通過這樣做,從內部JVM這個任何網絡訪問嘗試將拋出java.net.NetPermission

這也會破壞文件訪問等功能,所以如果您需要允許,您需要在特殊安全策略文件(-Djava.security.policy=path/to/policy.file)中指定這些文件。應該有很多關於如何設置它的例子,只需搜索「java權限」即可開始。

2

嗯,我還沒有嘗試過,但理論上你可以設置系統屬性爲SOCKS代理到一個不存在的,並根據文檔所有TCP套接字將通過SOCKS代理嘗試 - 並失敗。

事情是這樣的:

java -DsocksProxyHost=127.0.0.1 SomeClass 
2

我有相同的任務來測試我們產品的離線安裝程序。上面所說的幾乎都是正確的,但創建.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 "*"; 
}; 

如果事情試圖在試驗過程中以外獲取內容時,出現安全異常。