2017-06-18 2 views
1

Betriebssystem: Red Hat Enterprise Linux Server release 6.6 (Santiago) Java jdk1.8.0_45 Standalone-Programm und Code läuft in Tomcat gibt falsche IP-Adresse für einige Hostnamen zurück. Korrekte IP wird von dig und nslookup auf demselben Computer zurückgegeben. Die Verwendung von strace -s 2048 -o strace_log -ff ergab keine nützlichen Informationen zur Fehlerbehebung. Die Verwendung von -Dsun.net.spi.nameservice.nameservers=8.8.8.8 oder des lokalen DNS-Servers (der von nslookup und dig verwendet wird) gibt dieselbe falsche Adresse zurück.Falsche IP-Adresse an Java-Programm zurückgegeben und Code in Tomcat ausgeführt

[INFO] sun.net.InetAddressCachePolicy.get() = 30 
[INFO] sun.net.spi.nameservice.provider.1 = null 
[INFO] sun.net.spi.nameservice.nameservers = 8.8.8.8 

Mit dnsjava mit -Dsun.net.spi.nameservice.provider.1="dns,dnsjava" kehrt korrekte IP-Adresse.

Wie kann ich überprüfen, welchen Nameserver Java tatsächlich verwendet? Oder weitere Techniken zur Fehlerbehebung?

Dank

Test.sh

#!/bin/sh 

HOST=REMOVED 

NAMESERVER=LOCAL_NAME_SERVER_IP 
NAMESERVER=8.8.8.8 

# -Djava.net.preferIPv4Stack=true \ #-Dsun.net.spi.nameservice.nameservers=$NAMESERVER \ 
# -javaagent:dnslog.jar \ 
# -Dsun.net.spi.nameservice.provider.1="dns,dnsjava" \ 
# -cp ".:./dnsjava-2.1.8.jar" \ 

javac Test.java 

rm strace_log.* 
strace -s 2048 -o strace_log -ff java \ 
    -Djava.net.preferIPv4Stack=true \ 
    -Dsun.net.spi.nameservice.nameservers=$NAMESERVER \ 
    Test https://$HOST 

dig $HOST > ${HOST}_dig.txt 
nslookup $HOST > ${HOST}_nslookup.txt 
java -cp "./dnsjava-2.1.8.jar" dig $HOST > ${HOST}_dnsjava.txt 

Test.java

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.*; 
import java.util.logging.*; 

public class Test extends Formatter { 

    public static void main(String[] args) throws Exception { 

    Logger log = Logger.getLogger(Test.class.getName()); 
    log.setUseParentHandlers(false); 

    ConsoleHandler handler = new ConsoleHandler(); 
    handler.setFormatter(new Test()); 
    log.addHandler(handler); 

    log.info("sun.net.InetAddressCachePolicy.get() = " + sun.net.InetAddressCachePolicy.get()); 
    log.info("sun.net.spi.nameservice.provider.1 = " + System.getProperty("sun.net.spi.nameservice.provider.1")); 
    log.info("sun.net.spi.nameservice.nameservers = " + System.getProperty("sun.net.spi.nameservice.nameservers")); 

    try { 
     if (args.length != 1 && args.length != 2) { 
     log.warning("Usage: java Test <https://address.server.edu> [timeout]"); 
     return; 
     } 

     log.info("Received host address " + args[0]); 
     URL constructedUrl = new URL(args[0]); 
     String host = constructedUrl.getHost(); 

     InetAddress address = InetAddress.getByName(host); 
     String ip = address.getHostAddress(); 
     log.info("Host = " + args[0] + " IP = " + ip); 

     InetAddress Address = InetAddress.getLocalHost(); 
     log.info("InetAddress.getLocalHost() = " + Address); 
     log.info("InetAddress.getCanonicalHostName() = " + Address.getCanonicalHostName()); 

     InetAddress SW[] = InetAddress.getAllByName(host); 
     for (int i=0; i < SW.length; i++) { 
     log.info("getAllByName[" + i + "] = " + SW[i]); 
     } 

     URLConnection conn = constructedUrl.openConnection(); 

     if (args.length == 2) { 
     conn.setConnectTimeout(Integer.valueOf(args[1]) * 1000); 
     } else { 
     conn.setConnectTimeout(5000); 
     } 
     log.info("Setting connection timeout to " + conn.getConnectTimeout()/1000 + " second(s)."); 

     log.info("Trying to connect to " + args[0]); 
     InputStreamReader reader = new InputStreamReader(conn.getInputStream(), "UTF-8"); 
     BufferedReader in = new BufferedReader(reader); 

     in.readLine(); 
     in.close(); 
     reader.close(); 

     log.info("Great! It worked."); 

    } catch (Exception e) { 
     log.info("Could not connect to the host address " + args[0]); 
     log.info("The error is: " + e.getMessage()); 
     log.info("Here are the details:"); 
     log.log(Level.SEVERE, e.getMessage(), e); 

     throw new RuntimeException(e); 
    } 
    } 

    public String format(LogRecord record) { 
    StringBuffer sb = new StringBuffer(); 

    sb.append("["); 
    sb.append(record.getLevel().getName()); 
    sb.append("]\t"); 

    sb.append(formatMessage(record)); 
    sb.append("\n"); 

    return sb.toString(); 
    } 
} 
+0

@jww Vielen Dank für Ihren Kommentar. Der Frage wird ein Code hinzugefügt. –

+0

Blick auf Strace-Ausgabe sieht eng aus wie Nscd "Name Service-Cache-Daemon" könnte der Schuldige sein. Die UDP-Nachricht wurde nicht an Port 53 gesendet. –

+0

'getent ahoosts HOST_NAME' hat bestätigt, dass nscd den falschen Wert zwischengespeichert hat. Sie müssen noch herausfinden, warum DNS-TTL nicht berücksichtigt wird. –

Antwort

1

Problem wurde durch einen Neustart nscd Daemon aufgelöst. Es war irgendwie hängen als in dort waren viele nscd -i hosts verarbeitet ausgeführt, aber es war immer noch auf Anfragen von app. Das erklärt wahrscheinlich, warum DNS-TTLs nicht geehrt wurden.

Verwandte Themen