2008-12-07 22 views
5

पर प्रतिबंधित करना जबकि विभिन्न फ़ायरवॉल और सुरंग योजनाओं के माध्यम से जेएमएक्स का पर्दाफाश करने के बारे में कुछ दस्तावेज प्रतीत होता है, तो मैं इसके विपरीत चाहता हूं। मैं यह सुनिश्चित करना चाहता हूं कि जेएमएक्स केवल स्थानीय मशीन के लिए सुलभ है। दुर्भाग्यवश ऐसा प्रतीत होता है कि "बॉक्स से बाहर" प्रबंधन विकल्प बंदरगाहों को स्थानीय इंटरफ़ेस में प्रतिबंधित करने की अनुमति नहीं देते हैं और नेटस्टैट उन्हें किसी भी/सभी इंटरफेस पर सुनता है।जेएमएक्स को स्थानीयहोस्ट

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#gdevf

मैं को स्वीकार मैं JMX, RMI रजिस्ट्री, कनेक्टर, एडेप्टर में अविवेक की परतों भ्रमित कर रहा हूँ है, आदि

मैं बस के माध्यम से इसे चालू करने के लिए और फिर सुरंग चाहते हैं एसएसएच दुनिया को उजागर करने के बाद और फिर कठिन और अनावश्यक उपयोगकर्ता प्रबंधन और सुरक्षा विन्यास करने के विरोध में। आरएमआई रजिस्ट्री में निर्मित एक का उपयोग करने में सक्षम होना अच्छा होगा और बाहरी को चलाने की आवश्यकता नहीं है।

उत्तर

1

ऐसा करने के सूर्य के तरीके से मदद नहीं कर सकता। जेएमएक्स एडेप्टर जेडीके के साथ आने के बाद भी (6 मुझे लगता है?) मैंने कम-प्रयास एडाप्टर सेटअप के लिए mx4j का उपयोग किया। 127.0.0.1 या एक आंतरिक-केवल इंटरफेस पर एक mx4j http एडाप्टर शुरू करना छोटा है। फिर एसओपी बंदरगाह के साथ एसएसएच करना था या wget कमांड के साथ स्क्रिप्ट का उपयोग करना था।

http://mx4j.sourceforge.net/

1

दुर्भाग्य से वर्तमान में ऐसा करने के लिए कोई रास्ता नहीं है।

सूर्य प्रलेखन के अनुसार एकमात्र -Dcom.sun.management.jmxremote केवल एक स्थानीय बंदरगाह खोलना चाहिए जबकि -Dcom.sun.management.jmxremote.port = एक दूरस्थ रूप से सुलभ बंदरगाह खोलता है।

दोनों तरीकों से एक अतिरिक्त यादृच्छिक बंदरगाह खुलता है जो दूरस्थ से सुलभ है।

मैंने देखा-Dcom.sun.management.jmxremote.host =, लेकिन ऐसा कोई प्रभाव नहीं प्रतीत होता है।

मैं इस निष्कर्ष पर आया कि सर्वर को ढालने के लिए कोई स्थानीय तरीका नहीं है और स्थानीय फ़ायरवॉल का उपयोग नहीं किया गया है।

2

थोड़ा देर से जवाब है, लेकिन अगर यह अभी भी आपके लिए एक समस्या (या किसी और) है, मुझे लगता है कि इस चाल करना होगा:

import java.io.IOException; 
import java.lang.management.ManagementFactory; 
import java.net.*; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.server.RMISocketFactory; 

import javax.management.MBeanServer; 
import javax.management.remote.*; 

public class LocalJMXPort { 
    public static void main(String[] args) { 
     try { 
      int port = 12468; 
      // Create an instance of our own socket factory (see below) 
      RMISocketFactory factory = new LocalHostSocketFactory(); 

      // Set it as default 
      RMISocketFactory.setSocketFactory(factory); 

      // Create our registry 
      LocateRegistry.createRegistry(port); 

      // Get the MBeanServer and setup a JMXConnectorServer 
      MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 
      JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://127.0.0.1:"+port+"/jndi/rmi://127.0.0.1:"+port+"/jmxrmi"); 
      JMXConnectorServer rmiServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); 
      rmiServer.start(); 

      // Say something 
      System.out.println("Connect your jconsole to localhost:"+port+". Press a key to exit"); 

      // Wait for a key press 
      int in = System.in.read(); 
      //Exit 
      System.out.println("Exiting"); 
      System.exit(0); 
     } catch(Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    static private class LocalHostSocketFactory extends RMISocketFactory { 
     public ServerSocket createServerSocket(int port) throws IOException { 
      ServerSocket ret = new ServerSocket(); 
      ret.bind(new InetSocketAddress("localhost", port)); 
      return ret; 
     } 

     public Socket createSocket(String host, int port) throws IOException { 
      return new Socket(host, port); 
     } 
    } 
} 

मैं सिर्फ यह एक साथ रखा और यह संभव है कि मैंने किया है कुछ सचमुच बेवकूफ है क्योंकि मेरा एकमात्र उद्देश्य स्थानीयहोस्ट के लिए बाध्यकारी होना था: बंदरगाह के बजाय पोर्ट: पोर्ट और वह हिस्सा काम करता प्रतीत होता है।

अगर ऐसी चीजें हैं जो बेहतर हो सकती हैं या सिर्फ सादे बेवकूफ हैं तो टिप्पणी करने के लिए स्वतंत्र महसूस करें।

3

यदि आप स्थानीय होस्ट से एक्सेस कर रहे हैं तो यह करना संभव है कि जेसीनसोल और जेवीसुअलवीएम इस मामले में क्या करें, जो सर्वर के स्थानीय-केवल पते को खोजने के लिए अटैच एपीआई का उपयोग करना है (आपको क्या मिलता है आप -Dcom.sun.management.jmxremote के साथ चलते हैं लेकिन नहीं-Dcom.sun.management.jmxremote.port = N) और उससे कनेक्ट करें। एक और जवाब में, थ्रेह ने कहा कि इस मामले में एक दूरस्थ रूप से सुलभ बंदरगाह भी खोला गया है, जो पिछले संस्करणों में सच था लेकिन कुछ सालों से ऐसा नहीं रहा है।

फ्रेड्रिक का समाधान काम करता है लेकिन अधिक है। आपको केवल RMIServerSocketFactory को परिभाषित करने की आवश्यकता है, न कि RMISocketFactory (जो क्लाइंट और सर्वर दोनों को परिभाषित करता है)। इससे क्लाइंट को विशेष रूप से कॉन्फ़िगर करने की आवश्यकता समाप्त हो जाती है। http://vafer.org/blog/20061010091658 पर कोड मुझे सही लगता है।

कमांड लाइन गुणों के साथ निर्मित "आउट ऑफ़ द बॉक्स" प्रबंधन -Dcom.sun.management.jmxremote केवल जेएमएक्स एपीआई के साथ प्रोग्रामिंग शुरू करने से पहले ही आपको ले जा सकता है। हम आमतौर पर आउट-ऑफ-द-बॉक्स प्रबंधन को पूर्ण समांतर एपीआई में विकसित करने के लिए अनिच्छुक रहे हैं, यही कारण है कि इस तरह की समस्याएं हैं जो इसकी पहुंच से बाहर हैं। हम बताते हैं कि कैसे एक से दूसरे here पर जाना है।

इमोनन मैकमैनस, जेएमएक्स स्पेक लीड