2008-12-07 29 views
5

Mặc dù có một số tài liệu về cách hiển thị JMX thông qua các sơ đồ tường lửa và đường hầm khác nhau, tôi muốn loại bỏ điều ngược lại. Tôi muốn đảm bảo rằng JMX chỉ có thể truy cập vào máy cục bộ. Thật không may nó xuất hiện rằng tùy chọn quản lý "ra khỏi hộp" không cho phép hạn chế các cổng vào một giao diện cục bộ và netstat cho thấy chúng lắng nghe trên bất kỳ/tất cả các giao diện.Hạn chế JMX đến localhost

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

Tôi phải thừa nhận tôi đang hoang mang bởi các lớp về mình trong JMX, RMI registry, kết nối, adapter vv

Tôi muốn chỉ bật tính năng này và sau đó thông qua đường hầm SSH ngược với việc phơi bày nó với thế giới và sau đó phải thực hiện cấu hình bảo mật và quản lý người dùng khó khăn và không cần thiết. Nó sẽ là tốt đẹp để có thể sử dụng một xây dựng trong RMI đăng ký và không phải chạy một bên ngoài.

Trả lời

1

Không thể trợ giúp với cách làm mặt trời. Ngay cả sau khi adapter jmx bắt đầu đến với jdk (6 tôi nghĩ?) Tôi tiếp tục sử dụng mx4j cho thiết lập bộ chuyển đổi ít nỗ lực nhất. Nó là tầm thường để bắt đầu một bộ chuyển đổi http mx4j trên 127.0.0.1 hoặc một giao diện chỉ sử dụng nội bộ. Sau đó, SOP đã được ssh với cổng chuyển tiếp hoặc sử dụng các script với lệnh wget.

http://mx4j.sourceforge.net/

1

Rất tiếc, hiện tại không có cách nào để thực hiện điều đó.

Theo tài liệu Sun chỉ có một -Dcom.sun.management.jmxremote chỉ nên mở cổng cục bộ trong khi -Dcom.sun.management.jmxremote.port = mở cổng truy cập từ xa.

Cả hai cách mở một cổng ngẫu nhiên bổ sung có thể truy cập từ xa.

Tôi đã xem -Dcom.sun.management.jmxremote.host =, nhưng điều đó dường như không có bất kỳ ảnh hưởng nào.

Tôi đi đến kết luận rằng không có cách nào và sử dụng tường lửa cục bộ để bảo vệ máy chủ.

2

Một trễ trả lời chút nhưng nếu nó vẫn còn là một vấn đề đối với bạn (hoặc người khác), tôi nghĩ rằng điều này sẽ làm các trick:

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); 
     } 
    } 
} 

tôi chỉ cần đặt nó lại với nhau và có thể là tôi đã làm một cái gì đó thực sự ngu ngốc bởi vì mục tiêu duy nhất của tôi là để có nó ràng buộc với localhost: cổng thay vì *: cổng và một phần đó dường như làm việc.

Hãy bình luận nếu có những thứ có thể được cải thiện hoặc chỉ đơn giản là ngu ngốc.

3

Nếu bạn đang truy cập từ máy chủ cục bộ, bạn có thể thực hiện những gì JConsole và JVisualVM thực hiện trong trường hợp này, đó là sử dụng API đính kèm để tìm địa chỉ của máy chủ (bạn sẽ nhận được gì) bạn chạy với -Dcom.sun.management.jmxremote nhưng không phải -Dcom.sun.management.jmxremote.port = N) và kết nối với điều đó. Trong một câu trả lời khác, Thraidh nói rằng một cổng từ xa có thể truy cập được mở ngay cả trong trường hợp này, đó là sự thật trong các phiên bản trước đó nhưng đã không được như vậy trong một vài năm.

Giải pháp của Fredrik hoạt động nhưng quá mức cần thiết. Bạn chỉ cần xác định RMIServerSocketFactory, không phải RMISocketFactory (định nghĩa cả máy khách và máy chủ). Điều này giúp loại bỏ sự cần thiết phải cấu hình máy khách đặc biệt. Mã số tại http://vafer.org/blog/20061010091658 có vẻ đúng với tôi.

Quản lý "out-of-the-box" được xây dựng với các thuộc tính dòng lệnh như -Dcom.sun.management.jmxremote chỉ có thể đưa bạn đến trước khi bạn cần bắt đầu lập trình với chính API JMX. Nói chung, chúng tôi miễn cưỡng có quản lý out-of-the-box phát triển thành một API song song hoàn chỉnh, đó là lý do tại sao có những vấn đề như thế này là ngoài tầm với của nó. Chúng tôi giải thích làm thế nào để đi từ một đến khác here.

Éamonn McManus, Dòng chỉ dẫn JMX