2011-06-02 67 views
1

問題:如何設置Java的InetAddress.getCanonicalHostname()方法報告的規範主機名?如何在linux中設置規範主機名?

上下文:我試圖在CentOS 5.6上運行Neo4j(它有一個嵌入式碼頭服務器)。該服務啓動得很好,但它與netstat證明的錯誤地址(IPv6)綁定。而不是:::*,我需要它綁定到0.0.0.0(IPv4)。

是否有JVM參數我可以用來強制getCanoncialHostname()返回我想要的字符串?如果沒有,我可以添加到我的hosts文件或其他Linux配置文件實現相同?

[編輯 - 添加的netstat輸出]

$ netstat -plten 
... 
Proto Local Address Foreign Address State  User  Inode  PID/Program name 
tcp 0.0.0.0:930  0.0.0.0:*   LISTEN  0   10240  - 
tcp 0.0.0.0:139  0.0.0.0:*   LISTEN  0   57484  - 
tcp 0.0.0.0:111  0.0.0.0:*   LISTEN  0   10104  - 
tcp 127.0.0.1:25  0.0.0.0:*   LISTEN  0   12714  - 
tcp 0.0.0.0:445  0.0.0.0:*   LISTEN  0   57483  - 
tcp :::7474   :::*    LISTEN  500  524965  28200/java 
tcp :::22   :::*    LISTEN  0   62967  - 
tcp :::1337   :::*    LISTEN  500  524953  28200/java 
tcp :::15003   :::*    LISTEN  500  481149  3926/java 
tcp :::60156   :::*    LISTEN  500  524951  28200/java 
tcp :::15004   :::*    LISTEN  500  524917  28177/java 

端口22是SSH - 我可以ssh到機器就好了,所以有證據表明,外國:::*地址是(原則上)就好了。

[編輯 - 添加遠程NMAP輸出]

從另一臺主機nmap的運行,具體列出了所有上述產生這樣的:

$ nmap -T4 -A -v -PE -PS22,25,80 -PA21,23,80,930,139,111,25,445,7474,22,1337,15003,60156,15004,3389 192.168.176.138 
... 
Initiating SYN Stealth Scan at 13:31 
Scanning 192.168.176.138 [1000 ports] 
Discovered open port 111/tcp on 192.168.176.138 
Discovered open port 139/tcp on 192.168.176.138 
Discovered open port 445/tcp on 192.168.176.138 
Discovered open port 22/tcp on 192.168.176.138 
Discovered open port 15003/tcp on 192.168.176.138 
Discovered open port 15004/tcp on 192.168.176.138 
Completed SYN Stealth Scan at 13:31, 0.04s elapsed (1000 total ports) 
+0

你就不能告訴綁定到Neo4j的哪個接口? – 2011-06-02 17:13:17

+0

我已經抓住了neo4j附帶的各種.properties文件 - 我還沒有找到可用於影響界面的設置。所以這是可能的,但我不知道如何去做。我在源代碼中找到一個名爲AddressResolver的類,它在查找對此類配置的引用時使用getCanonicalHostname()。 – jimbojw 2011-06-02 17:18:51

+0

根據http://www.ipv6verify.com/,「::: *」首先不是有效的IPv6地址。等同於'0.0.0.0'的IPv6將是'::'。有沒有可能它不會綁定到一個地址? – JAB 2011-06-02 17:22:22

回答

3

你可以告訴你的JVM通過以下網絡屬性使用IPv4的IPv6的代替:-Djava.net.preferIPv4Stack=true

Networking properties

+0

除非他確實知道不會有任何IPv6傳入連接,否則他會確保'java.net.preferIPv6Addresses'設置爲'false'而不是更好?或者'getCanonicalHostname()'忽略那個屬性? – JAB 2011-06-02 17:36:46

+0

謝謝,我會試試這個並報告回來。 – jimbojw 2011-06-02 17:41:17

+0

+1,接受 - 這樣做了!我試着單獨設置'java.net.preferIPv4Stack = true'和'java.net.preferIPv6Addresses = false'。前者使得所有監聽器都綁定到'0.0.0.0',但端口'15003'(我不在乎)。後者也阻止了'::'的綁定,但並沒有導致綁定'0.0.0.0' - 相反沒有任何約束。我還沒有嘗試過兩種選擇。 – jimbojw 2011-06-02 18:17:23

1

你必須告訴碼頭偵聽特定的接口(IP) ,看看這裏:http://www.paralint.com/blog/2007/05/18/making-jetty-listen-to-the-local-interface-only/

行:<Set name="Host"><SystemProperty name="jetty.host" default="localhost"/></Set> 這是否

+0

謝謝,我會試試這個並報告回來。 – jimbojw 2011-06-02 17:41:02

+0

還沒有試過。沒有'jettyconf.xml'文件,可能是因爲neo4j直接嵌入它。我認爲neo4j使用'getCanonicalHostname()'調用的答案來設置它。 – jimbojw 2011-06-02 18:04:37

2

中號aybe設置-Djava.net.preferIPv4Stack=true系統屬性會有幫助嗎?