【问题标题】:How to set canonical hostname in linux?如何在 linux 中设置规范的主机名?
【发布时间】:2011-06-03 01:33:45
【问题描述】:

问题:如何“设置”java 的InetAddress.getCanonicalHostname() 方法报告的规范主机名?

上下文:我正在尝试在 CentOS 5.6 上运行 Neo4j(具有嵌入式码头服务器)。该服务启动得很好,但它绑定到了错误的地址 (IPv6),netstat 证明了这一点。而不是:::*,我需要它绑定到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)

【问题讨论】:

  • 你不能告诉neo4j绑定到哪个接口吗?
  • 我已经浏览了 neo4j 附带的各种 .properties 文件 - 我还没有找到可以用来影响界面的设置。所以这是可能的,但我不知道该怎么做。我在源代码中发现了一个名为 AddressResolver 的类,它使用 getCanonicalHostname() 来查找对此类配置的引用。
  • 根据ipv6verify.com:::* 首先不是一个有效的 IPv6 地址。与 0.0.0.0 等效的 IPv6 将改为 ::。它可能根本没有绑定到地址吗?
  • @JAB: :::* 表示“:: 上的所有端口”,就像0.0.0.0:* 表示0.0.0.0 上的所有端口一样。
  • @Thomas:是的,一旦 jimbojw 发布了 netstat 输出,我就明白了。我的困惑主要是由于他使用:::* vs. 0.0.0.0 而不是:::* vs. 0.0.0.0:*:: vs. 0.0.0.0

标签: java linux hostname neo4j


【解决方案1】:

您可以通过以下网络属性告诉您的 JVM 使用 IPv4 而不是 IPv6:-Djava.net.preferIPv4Stack=true

Networking properties

【讨论】:

  • 除非他确定不会有任何 IPv6 传入连接,否则他最好确保将 java.net.preferIPv6Addresses 设置为 false 不是更好吗?还是getCanonicalHostname() 忽略该属性?
  • 谢谢,我会试试这个并报告。
  • +1,接受 - 做到了!我尝试分别设置java.net.preferIPv4Stack=truejava.net.preferIPv6Addresses=false。前者使所有侦听器都绑定到0.0.0.0,除了端口15003(我不在乎)。后者也阻止了:: 的绑定,但没有导致绑定0.0.0.0 - 根本没有绑定。我没有同时尝试这两种选择。
  • 具体在 Neo4j 中进行此更改: 1. 打开 conf/neo4j-wrapper.conf 2. 找到名为“Java Additional Parameters”的部分 3. 添加以下行:wrapper.java.additional.3=-Djava .net.preferIPv4Stack=true
【解决方案2】:

也许设置-Djava.net.preferIPv4Stack=true 系统属性会有所帮助?

【讨论】:

    【解决方案3】:

    你必须告诉码头监听特定的接口(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> 这样做

    【讨论】:

    • 谢谢,我会试试这个并报告。
    • 还不能尝试。没有jettyconf.xml 文件,可能是因为neo4j 是直接嵌入的。我认为 neo4j 使用getCanonicalHostname() 调用的答案来设置它。
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2014-08-19
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多