かなり古い質問だと思いますが、今日同じ問題に遭遇し、理由を見つけたようです。問題は、Java (少なくとも openjdk バージョン "1.8.0_121") が最初に "PTR" レコードを検索し、次に結果が見つかった場合、Java が "A" レコード検索を実行しようとし、返された "A" を比較することです。 " 照会された最初の IP 番号を含むレコード。また、「A」クエリでそのような IP が見つからない場合、Java は「PTR」ルックアップ結果を返しません。彼らはそれを「なりすましの防止」と呼んでいます。ライブラリのソースは次のとおりです。
private static String getHostFromNameService(InetAddress addr, boolean check) {
String host = null;
for (NameService nameService : nameServices) {
try {
// first lookup the hostname
host = nameService.getHostByAddr(addr.getAddress());
/* check to see if calling code is allowed to know
* the hostname for this IP address, ie, connect to the host
*/
if (check) {
SecurityManager sec = System.getSecurityManager();
if (sec != null) {
sec.checkConnect(host, -1);
}
}
/* now get all the IP addresses for this hostname,
* and make sure one of them matches the original IP
* address. We do this to try and prevent spoofing.
*/
InetAddress[] arr = InetAddress.getAllByName0(host, check);
boolean ok = false;
if(arr != null) {
for(int i = 0; !ok && i < arr.length; i++) {
ok = addr.equals(arr[i]);
}
}
//XXX: if it looks a spoof just return the address?
if (!ok) {
host = addr.getHostAddress();
return host;
}
break;
私は何を言うことができますか?いたずらな言葉を省略する - 何もありません。このライブラリは Oracle JRE から共有されているため、他にできることはありません。