কীভাবে জাভাটিকে ডিএনএস ক্যাচিং টাইমআউটটি সম্মান করবেন?


102

আমরা জিও-বিতরণ এবং লোড-ব্যালেন্সিংয়ের জন্য জিএসএলবি ব্যবহার করি। প্রতিটি পরিষেবা একটি নির্দিষ্ট ডোমেন নাম বরাদ্দ করা হয়। কিছু ডিএনএস যাদু দ্বারা ডোমেন নামটি একটি আইপি-তে সমাধান করা হয় যা সর্বনিম্ন লোড সহ সার্ভারের সবচেয়ে কাছের হয়। লোড-ব্যালেন্সিংয়ের কাজ করার জন্য, অ্যাপ্লিকেশন সার্ভারকে ডিএনএস প্রতিক্রিয়া থেকে টিটিএলকে সম্মান করতে হবে এবং ক্যাশে সময় শেষ হয়ে গেলে আবার ডোমেন নামটি সমাধান করতে হবে। তবে জাভাতে আমি এটি করার কোনও উপায় বের করতে পারিনি।

অ্যাপ্লিকেশনটি জাভা 5-এ রয়েছে, লিনাক্সে (সেন্টোস 5) চলছে।

উত্তর:


77

বায়রনের উত্তর অনুসারে, আপনি পতাকা ব্যবহার করে বা কল করে সিস্টেম বৈশিষ্ট্য হিসাবে সেট করতে networkaddress.cache.ttlবা সেট করতে পারবেন না কারণ এগুলি সিস্টেম বৈশিষ্ট্য নয় - এগুলি সুরক্ষা বৈশিষ্ট্য।networkaddress.cache.negative.ttl-DSystem.setProperty

আপনি যদি এই আচরণটি ট্রিগার করতে কোনও সিস্টেম সম্পত্তি ব্যবহার করতে চান (যাতে আপনি -Dপতাকা বা কলটি ব্যবহার করতে পারেন System.setProperty), আপনি নিম্নলিখিত সিস্টেমের বৈশিষ্ট্যটি সেট করতে চাইবেন :

-Dsun.net.inetaddr.ttl=0

এই সিস্টেমের সম্পত্তি কাঙ্ক্ষিত প্রভাব সক্ষম করবে।

তবে সচেতন হন: আপনি যদি -Dজেভিএম প্রক্রিয়া শুরু করার সময় পতাকা ব্যবহার না করেন এবং পরিবর্তে কোড থেকে এই কলটি নির্বাচন করেন:

java.security.Security.setProperty("networkaddress.cache.ttl" , "0")

এই কোডটি অবশ্যই JVM এর অন্য কোনও কোড নেটওয়ার্কিং ক্রিয়াকলাপ চালানোর চেষ্টা করার আগে কার্যকর করা উচিত

এটি গুরুত্বপূর্ণ কারণ, উদাহরণস্বরূপ, আপনি Security.setPropertyযদি একটি .war ফাইল কল করে এবং সেই .war টমক্যাটটিতে স্থাপন করেন তবে এটি কার্যকর হবে না: টমক্যাট জাভা নেটওয়ার্কিং স্ট্যাকটি ব্যবহার করে আপনার .war কোডটি কার্যকর করার চেয়ে অনেক আগে নিজেকে শুরু করার জন্য। এই 'রেস -Dশর্ত'-এর কারণে, জেভিএম প্রক্রিয়া শুরু করার সময় পতাকাটি ব্যবহার করা বেশি সুবিধাজনক ।

যদি আপনি ব্যবহার -Dsun.net.inetaddr.ttl=0বা কল না করেন তবে আপনাকে সেই ফাইলটিতে সুরক্ষা বৈশিষ্ট্যগুলি Security.setPropertyসম্পাদনা $JRE_HOME/lib/security/java.securityএবং সেট করতে হবে, যেমন

networkaddress.cache.ttl = 0
networkaddress.cache.negative.ttl = 0

তবে এই সম্পত্তিগুলির আশেপাশের মন্তব্যে সুরক্ষা সতর্কতাগুলিতে মনোযোগ দিন। কেবলমাত্র এটি করুন যদি আপনি যুক্তিসঙ্গতভাবে আত্মবিশ্বাসী হন যে আপনি ডিএনএস স্পোফিং আক্রমণে সংবেদনশীল না হন ।


4
এফকিউএনটি হ'ল java.security.Security(কমপক্ষে jdk7 এ)
পাবলো ফার্নান্দেজ

4
কেবল একটি মন্তব্য, এই সুরক্ষা সতর্কতাগুলি বেশিরভাগ সুরক্ষা পরিচালক এবং দূরবর্তী লোডিং সম্পর্কিত। কোনও সাধারণ সার্ভার অ্যাপ্লিকেশনের জন্য যা ডিটিএসকে কিছুটা বাড়িয়ে টিটিএল হ্রাস করার জন্য বিশ্বাস করে। (তবে আমি মনে করি না যে 0 ভাল ন্যূনতম এবং সুরক্ষাবিহীন পরিচালকদের জন্য 30 এর ডিফল্ট বেশিরভাগ ক্ষেত্রেই ঠিক আছে)।
eckes

4
সিস্টেম সম্পত্তি ওপেনজেডিকে পাশাপাশি কাজ করে বা এটি ওরাকল নির্দিষ্ট?
mhlz

প্রথম অনুসন্ধান আপনাকে স্পোফিং আক্রমণ থেকে রক্ষা না করার পরে আর কখনও ডিএনএস যাচাই করবেন না, এটি অস্থায়ী পরিবর্তে স্পোফিং আক্রমণ স্থায়ী করে দেয়।
kbolino

67

জাভাতে কিছু মারাত্মকভাবে অদ্ভুত ডিএনএস ক্যাচিং আচরণ রয়েছে। আপনার সেরা বাজি হ'ল ডিএনএস ক্যাচিং বন্ধ করে দেওয়া বা 5 সেকেন্ডের মতো কিছু কম সংখ্যায় সেট করা।

नेटवर्कaddress.cache.ttl (ডিফল্ট: -1)
নাম পরিষেবা থেকে সফল নাম অনুসন্ধানের জন্য ক্যাশে নীতি সূচিত করে। সফল চেহারাটিকে ক্যাশে করতে সেকেন্ডের সংখ্যা নির্দেশ করতে মানটি পূর্ণসংখ্যা হিসাবে নির্দিষ্ট করা হয়। -1 এর মান "চিরকালের জন্য ক্যাশে" নির্দেশ করে।

नेटवर्कaddress.cache.negative.ttl (ডিফল্ট: 10)
নাম পরিষেবা থেকে আন-সফল নাম অনুসন্ধানের জন্য ক্যাশে নীতি সূচিত করে। সাফল্যরূপে অনুসন্ধানের ব্যর্থতা ক্যাশে করতে সেকেন্ডের সংখ্যাটি নির্দেশ করতে মানটি পূর্ণসংখ্যা হিসাবে নির্দিষ্ট করা হয়। 0 এর মান "কখনই ক্যাশে" নির্দেশ করে না। -1 এর মান "চিরকালের জন্য ক্যাশে" নির্দেশ করে।


7
দ্রষ্টব্য: এটি আপনার ওএসে সমস্ত ডিএনএস ক্যাচিং অক্ষম করে না। লাইব্রেরিতে জাভার নিজস্ব ভাঙ্গা ইন-মেমরি ক্যাশেটি কেবল অক্ষম করে। আপনি যখন জেভিএম আবেদন করবেন তখন আপনি কমান্ড লাইনে এই বৈশিষ্ট্যগুলি সহজেই সেট করতে পারেন।
নেলসন

4
আমি জানি না যে "ভাঙ্গা" বৈধ। জাভা (সুরক্ষার কারণে) ডিএনএস এন্ট্রি চিরকালের জন্য বা জেভিএম পুনরায় চালু না হওয়া অবধি, যেটি প্রথমে আসে aches এটি (আমি যা বলতে পারি তা থেকে) নকশা দ্বারা। সেটিংসটি জাভা.সিকিউরিটি নীতি ফাইলে বা কমান্ড লাইনে তৈরি করা যেতে পারে। সেটিংস প্রতিটি জন্য পৃথক। তথ্যসূত্র: rgagnon.com/javadetails/java-0445.html
মিলনার

4
নোট করুন আপনি এগুলিকে সিস্টেম বৈশিষ্ট্য হিসাবে সেট করতে পারবেন না (যেমন -D পতাকা বা System.setProperty ব্যবহার করে) কারণ তারা সিস্টেম বৈশিষ্ট্য নয় - এগুলি সুরক্ষা বৈশিষ্ট্য।
লেস হ্যাজলউড

6
এই ডকুমেন্টেশন 1.7 এ কিছুটা আলাদা। বিশেষত, ক্যাশে চিরকালের জন্য কেবল তখনই ঘটে যখন কোনও সুরক্ষা ব্যবস্থাপক উপস্থিত থাকে: "কোনও সুরক্ষা পরিচালক ইনস্টল করা অবস্থায় চিরকালের জন্য ক্যাশে হওয়া এবং সুরক্ষা ব্যবস্থাপক ইনস্টল না থাকা অবস্থায় কোনও নির্দিষ্ট সময়কালের জন্য ক্যাশে থাকা ডিফল্ট আচরণ হয়" " docs.oracle.com/javase/7/docs/technotes/guides/net/…
ব্রেট ওকেন

4
@ মিশেল দেখুন System.getSecurityManager()। জাভা 8 এর জন্য দস্তাবেজ: ডকস.অরাকল.com
জাভাসে /

22

এটি অবশ্যই নতুন রিলিজ (এসই 6 এবং 7) এ স্থির করা হয়েছে। Tcpdump ব্যবহার করে বন্দর 53 ক্রিয়াকলাপটি দেখার সময় নিম্নলিখিত কোড স্নিপেট চালানোর সময় আমি 30 সেকেন্ডের ক্যাচিং টাইম সর্বাধিক অভিজ্ঞতা অর্জন করি।

/**
 * http://stackoverflow.com/questions/1256556/any-way-to-make-java-honor-the-dns-caching-timeout-ttl
 *
 * Result: Java 6 distributed with Ubuntu 12.04 and Java 7 u15 downloaded from Oracle have
 * an expiry time for dns lookups of approx. 30 seconds.
 */

import java.util.*;
import java.text.*;
import java.security.*;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class Test {
    final static String hostname = "www.google.com";
    public static void main(String[] args) {
        // only required for Java SE 5 and lower:
        //Security.setProperty("networkaddress.cache.ttl", "30");

        System.out.println(Security.getProperty("networkaddress.cache.ttl"));
        System.out.println(System.getProperty("networkaddress.cache.ttl"));
        System.out.println(Security.getProperty("networkaddress.cache.negative.ttl"));
        System.out.println(System.getProperty("networkaddress.cache.negative.ttl"));

        while(true) {
            int i = 0;
            try {
                makeRequest();
                InetAddress inetAddress = InetAddress.getLocalHost();
                System.out.println(new Date());
                inetAddress = InetAddress.getByName(hostname);
                displayStuff(hostname, inetAddress);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(5L*1000L);
            } catch(Exception ex) {}
            i++;
        }
    }

    public static void displayStuff(String whichHost, InetAddress inetAddress) {
        System.out.println("Which Host:" + whichHost);
        System.out.println("Canonical Host Name:" + inetAddress.getCanonicalHostName());
        System.out.println("Host Name:" + inetAddress.getHostName());
        System.out.println("Host Address:" + inetAddress.getHostAddress());
    }

    public static void makeRequest() {
        try {
            URL url = new URL("http://"+hostname+"/");
            URLConnection conn = url.openConnection();
            conn.connect();
            InputStream is = conn.getInputStream();
            InputStreamReader ird = new InputStreamReader(is);
            BufferedReader rd = new BufferedReader(ird);
            String res;
            while((res = rd.readLine()) != null) {
                System.out.println(res);
                break;
            }
            rd.close();
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

16
হ্যাঁ, জাভা 1.5 এর অসীম ক্যাশিংয়ের একটি ডিফল্ট মান ছিল। জাভা 1.6 এবং 1.7 এর 30 সেকেন্ড ডিফল্ট রয়েছে।
মাইকেল 21

7
১.7 এর নথীকরণটি কেবলমাত্র সেই ক্ষেত্রেই সত্য হতে পারে যেখানে কোনও সুরক্ষা ব্যবস্থাপক উপস্থিত না থাকে: "কোনও সুরক্ষা ব্যবস্থাপক ইনস্টল করা অবস্থায় চিরকালের জন্য ক্যাশে হওয়া এবং কোনও নির্দিষ্ট সময় নির্দিষ্টকরণের জন্য প্রয়োগের জন্য ক্যাশে রাখা ডিফল্ট আচরণ হয় when পরিচালক ইনস্টল করা নেই "" docs.oracle.com/javase/7/docs/technotes/guides/net/…
ব্রেট ওকেন

4
@ এই তথ্যটির জন্য উত্সটি ভাগ করে নিতে মিশেল কেয়ার?
rustyx

4
@ আরস্টিক্স ওরাকল এর ১.6 এবং ১.7 জেডিকে জেআর / লিবিব / সুরক্ষা / জাভা সুরক্ষায় নেটওয়ার্কড্রেসক্রেস.সিটিএল আছে: "# ডিফল্ট মান চিরকালের জন্য (চিরকাল)। সুরক্ষার কারণে, এই # ক্যাচিং চিরকালের জন্য তৈরি করা হয় যখন কোনও সুরক্ষা পরিচালক সেট করা আছে। যখন কোনও সুরক্ষা # ম্যানেজার সেট না করা থাকে তখন 30 সেকেন্ডের জন্য ডিফল্ট আচরণটি ক্যাশে করা হয় "" সুতরাং জাভা ওয়েব স্টার্টের মাধ্যমে স্থাপন করা অ্যাপলেট এবং অ্যাপ্লিকেশনগুলি এখনও চিরতরে ক্যাশে করে নাহলে এটি 30 সেকেন্ড।
মাইকেল

4
ওপেনজেডকে 8 এর জাভা.সিকিউরিটির একটি কোড পয়েন্টার, যা বলে যে কোনও সুরক্ষা ব্যবস্থাপক ছাড়া টিটিএল 30s: hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/f940e7a 48b72 / src / share/… । আমি ম্যাক ওএস এক্স এবং উবুন্টু 14.04 এ এটি পরীক্ষা করেছি।
Troj

18

বায়রনের উত্তরের প্রসারিত করতে, আমি বিশ্বাস করি এই পরিবর্তনটি কার্যকর করতে java.securityআপনার %JRE_HOME%\lib\securityডিরেক্টরিতে ফাইলটি সম্পাদনা করতে হবে ।

এখানে প্রাসঙ্গিক বিভাগ:

#
# The Java-level namelookup cache policy for successful lookups:
#
# any negative value: caching forever
# any positive value: the number of seconds to cache an address for
# zero: do not cache
#
# default value is forever (FOREVER). For security reasons, this
# caching is made forever when a security manager is set. When a security
# manager is not set, the default behavior is to cache for 30 seconds.
#
# NOTE: setting this to anything other than the default value can have
#       serious security implications. Do not set it unless 
#       you are sure you are not exposed to DNS spoofing attack.
#
#networkaddress.cache.ttl=-1 

java.securityফাইল এখানে ডকুমেন্টেশন ।


5
এটি যুক্ত করার জন্য, টমক্যাট using ব্যবহার করার সময় আমার নেটওয়ার্ক / সিকিউরিটি ফাইলটি সংশোধন করতে হয়েছিল, যেমন নেটওয়ার্কেড্রেস.সিএইচটিএল বা সূর্য.net.inetaddr.r.l প্রোগ্রাম হিসাবে বা জাএএএএপিপিএস ভেরিয়েবলের মাধ্যমে কাজ করে না।
ব্রম্প

4
@ ব্র্যাম্প ধন্যবাদ ভাই, আমিও একই সমস্যার মুখোমুখি হয়েছি এবং মন্তব্য এবং উত্তরের জন্য আপনার মন্তব্য এবং উত্তর +1 ব্যবহার করে সমাধান করেছি।
ভাভিক আম্বানি

7

অন্যান্য উত্তরগুলির সংক্ষিপ্তসার হিসাবে, আপনি কীভাবে ডিএনএস লুকআপকে ক্যাশে করা যায় তা সামঞ্জস্য <jre-path>/lib/security/java.securityকরতে সম্পত্তিটির মান সেট করতে পারেন networkaddress.cache.ttl। মনে রাখবেন যে, এই হল না একটি সিস্টেম সম্পত্তি কিন্তু একটি নিরাপত্তা সম্পত্তি। আমি এটি ব্যবহার করে এটি সেট করতে সক্ষম হয়েছি:

java.security.Security.setProperty("networkaddress.cache.ttl", "<value>");

এটি সিস্টেমের সম্পত্তি দ্বারাও সেট করা যেতে পারে -Dsun.net.inetaddr.ttlযদিও এটি অন্য কোনও স্থানে সেট করা থাকলে এটি কোনও সুরক্ষা সম্পত্তি ওভাররাইড করবে না।

আমি এটি যুক্ত করতে চাই যে আপনি যদি ওয়েবস্পিয়ারে ওয়েব পরিষেবাদিগুলির সাথে এই সমস্যাটি দেখেন তবে আমি যেমন ছিলাম সেটিং networkaddress.cache.ttlযথেষ্ট হবে না। আপনাকে সিস্টেমের সম্পত্তিটি সেট disableWSAddressCachingকরতে হবে true। সময়-থেকে-লাইভ সম্পত্তি থেকে পৃথক, এটি একটি JVM তর্ক হিসাবে বা এর মাধ্যমে সেট করা যেতে পারে System.setProperty)।

আইবিএম কিভাবে WebSphere হ্যান্ডলগুলি ক্যাশে DNS উপর একটি প্রশংসনীয় বিস্তারিত পোস্টঃ হয়েছে এখানে । উপরের সম্পর্কিত টুকরাটি হ'ল:

ওয়েব পরিষেবাদির জন্য ঠিকানা ক্যাচিং অক্ষম করতে, আপনাকে অতিরিক্ত একটি জেভিএম কাস্টম সম্পত্তি অক্ষম WSAddressCasing সেট করতে হবে to ওয়েব পরিষেবার জন্য ঠিকানা ক্যাচিং অক্ষম করতে এই সম্পত্তিটি ব্যবহার করুন। যদি আপনার সিস্টেমটি সাধারণত প্রচুর ক্লায়েন্টের থ্রেড নিয়ে চলে এবং আপনি wsAdrCache ক্যাশে লক যুক্তির মুখোমুখি হন তবে ওয়েব পরিষেবাদির ডেটা ক্যাচিং প্রতিরোধ করতে আপনি এই কাস্টম সম্পত্তিটি সত্য হিসাবে সেট করতে পারেন।


2

মতে সরকারী ওরাকল জাভা বৈশিষ্ট্য , sun.net.inetaddr.ttlসূর্যের বাস্তবায়ন-নির্দিষ্ট সম্পত্তি, যা "ভবিষ্যতের সংস্করণগুলিতে মধ্যে সমর্থিত নাও হতে পারে" হয়। "পছন্দসই উপায় হ'ল সুরক্ষা সম্পত্তিটি ব্যবহার করা" networkaddress.cache.ttl

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.