3

この問題で、数日間頭を悩ませていました。特定のネットワーク (たまたま DDOS 移行プロバイダー) 上のサイトでは、セキュリティ管理の checkConnect 呼び出しに、他のサイトと比較して非常に長い時間がかかっているようです。

このネットワーク上のサイトがセキュリティ マネージャのアクセス チェックを通過できない可能性はありますか? 私が認識していない構成はありますか? 私は(もっと)気が狂っていますか?

これは、実証するテストケースです...

package com.test;

import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class SSCCE
{

static class StatCounter
{
    boolean security;
    String host;
    long avg;
    long total;
    int iterations;

    StatCounter(String host)
    {
        this.host = host;
    }

    @Override
    public String toString()
    {
        return host + "\t\titerations (" + iterations + ")\t\tavg (" + avg + ")\t\tsecurity (" + security + ")";
    }

    void inc(long time)
    {
        ++iterations;
        total += time;
    }

    void avg()
    {
        avg = total / (long)iterations;
    }

    void reset()
    {
        total = 0;
        iterations = 0;
    }
}

static String[] hosts = new String[]
{
    "google.com",
    "youtube.com",
    "oracle.com",
    "random.org",
    "phpbb.com",
    "staminus.net", 

    // MUCH Higher Latency with site below (only with security manager enabled?)
    "blacklotus.net"
};

public static void main(String[] argv) throws Throwable
{
    int iterations = Integer.parseInt(argv[0]);
    List<StatCounter> counters = new ArrayList<StatCounter>(hosts.length);
    for(String host : hosts)
    {
        counters.add(new StatCounter(host));
    }
    System.out.println("Running Without Security");
    for(int i = 0; i < iterations; ++i)
    {
        for(StatCounter counter : counters)
        {
            long then = System.currentTimeMillis();
            new Socket(counter.host, 80).close();
            counter.inc(System.currentTimeMillis() - then);
        }
    }
    for(StatCounter counter : counters)
    {
        counter.avg();
        System.out.println(counter);
        counter.reset();
        counter.security = true;
    }
    System.setProperty("java.security.policy", "sscce.policy");
    System.setSecurityManager(new SecurityManager());

    System.out.println("\n\nRunning With Security");

    for(int i = 0; i < iterations; ++i)
    {
        for(StatCounter counter : counters)
        {
            long then = System.currentTimeMillis();
            new Socket(counter.host, 80).close();
            counter.inc(System.currentTimeMillis() - then);
        }
    }

    for(StatCounter counter : counters)
    {
        counter.avg();
        System.out.println(counter);
    }

}
}

ポリシー ファイル

grant
{
 permission java.net.SocketPermission "google.com:80", "connect";
 permission java.net.SocketPermission "youtube.com:80", "connect";
 permission java.net.SocketPermission "oracle.com:80", "connect";
 permission java.net.SocketPermission "random.org:80", "connect";
 permission java.net.SocketPermission "phpbb.com:80", "connect";
 permission java.net.SocketPermission "staminus.net:80", "connect";
 permission java.net.SocketPermission "blacklotus.net:80", "connect";
};

java com.test.SSCCE で実行

出力例

Running Without Security
google.com      iterations (4)      avg (65)        security (false)
youtube.com     iterations (4)      avg (61)        security (false)
oracle.com      iterations (4)      avg (104)       security (false)
random.org      iterations (4)      avg (101)       security (false)
phpbb.com       iterations (4)      avg (143)       security (false)
staminus.net        iterations (4)      avg (137)       security (false)
blacklotus.net      iterations (4)      avg (137)       security (false)


Running With Security
google.com      iterations (4)      avg (261)       security (true)
youtube.com     iterations (4)      avg (64)        security (true)
oracle.com      iterations (4)      avg (103)       security (true)
random.org      iterations (4)      avg (100)       security (true)
phpbb.com       iterations (4)      avg (882)       security (true)
staminus.net        iterations (4)      avg (303)       security (true)
blacklotus.net      iterations (4)      avg (4669)      security (true)

ご意見をお寄せいただきありがとうございます。

私が見る限り、すべて問題ないように見えます (ネットワーク遅延のように見えるものを除いて!)

4

1 に答える 1

4

追加のデバッグ情報を使用して JRE システム ライブラリをリバース エンジニアリングすることにより、この現象の根本原因を突き止めました。遅延の原因をネイティブメソッドまでた​​どることができました

java.net.Inet4AddressImpl.getHostByAddr([B)Ljava.lang.String

問題のホストをその IP アドレスから解決することが不明な理由で失敗し、タイムアウト後、呼び出し元のメソッドが有効なホスト名を返すために別のルートを試行します。いくつかの Web ベースの逆引きツールでこれを確認しましたが、blacklotus.net (または逆引きを防止する機能?) に問題がある可能性が最も高いようです。

これが、このような奇妙なケースに遭遇した他の誰かに役立つことを願っています. T-マイナス 36 時間、ケースはクローズ。

于 2013-09-24T07:00:25.807 に答える