Nice programing

ssh 로컬 포트 ​​포워딩을 통한 JConsole

nicepro 2020. 12. 9. 21:46
반응형

ssh 로컬 포트 ​​포워딩을 통한 JConsole


JMX가 노출 된 Java 서비스에 원격으로 연결하고 싶지만 방화벽에 의해 차단되었습니다. ssh 로컬 포트 ​​전달을 사용하려고했지만 연결이 실패합니다. wireshark를 살펴보면 jconsole에 연결하려고 할 때 방화벽에 의해 차단 된 포트 9999에 연결 한 후 일부 임시 포트를 통해 연결하려고하는 것으로 보입니다.

jconsole을 9999를 통해서만 연결하거나 프록시를 사용하는 방법이 있습니까? 이 문서는 여전히 최선의 해결책 ? 아니면 뭔가 빠졌나요?


jconsole을 9999를 통해서만 연결하거나 프록시를 사용하는 방법이 있습니까? 이 문서는 여전히 최선의 해결책? 아니면 뭔가 빠졌나요?

예, 그 기사가 맞습니다.

당신이 당신의 서버에 JMX 포트를 지정하면 ( -Dcom.sun.management.jmxremote.port=####), 당신은 실제로 지정하는 단지 응용 프로그램에 대한 레지스트리 포트입니다. 연결할 때 jconsole이 실제로 모든 작업을 수행하는 추가 서버 포트를 제공합니다. 작업을 시작하려면 레지스트리와 서버 포트를 모두 알아야 합니다 .

다음과 같은 방법이 레지스트리 및 서버 포트를 8000으로 설정하여 응용 프로그램을 실행하는 데 작동합니다 . 자세한 내용여기를 참조하십시오 .

-Dcom.sun.management.jmxremote.port=8000
-Dcom.sun.management.jmxremote.rmi.port=8000

제쳐두고, 내 SimpleJMX 라이브러리를 사용하면 두 포트를 쉽게 설정할 수 있으며 둘 다 동일한 포트로 설정할 수 있습니다.

따라서 전달해야하는 두 포트를 모두 알고 있으면 ssh명령을 설정할 수 있습니다 . 예를 들어 레지스트리 및 서버 포트를 8000으로 구성하는 경우 다음을 수행합니다.

ssh -L 8000:localhost:8000 remote-host

이렇게하면 원격 호스트의 localhost : 8000으로 전달되는 로컬 포트 ​​8000이 생성됩니다. -L여러 포트를 전달해야하는 경우 여러 인수 를 지정할 수 있습니다 . 그런 다음 jconsole을 localhost : 8000에 연결하면 원격 호스트에 적절하게 연결됩니다.

또한 서버에 여러 인터페이스가있는 경우 올바른 인터페이스에 바인딩 할 레지스트리 및 서버 포트를 가져 오려면 다음 변수를 모두 설정해야 할 수 있습니다.

-Djava.rmi.server.hostname=10.1.2.3

JConsole이 SOCKS를 지원하기 때문에 SSH 양말 터널을 사용하여이 작업을 수행하는 더 좋은 방법이 있습니다.

  1. 일부 사용 가능한 포트 (예 : 7777)에서 로컬로 SSH socks 프록시를 만듭니다.

    ssh -fN -D 7777 user @ firewalled-host

  2. SOCKS 프록시 (예 : localhost : 7777)와 JMX 서버의 주소 (예 : localhost : 2147)를 지정하여 JConsole을 실행합니다.

    jconsole -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 7777 서비스 : jmx : rmi : /// jndi / rmi : // localhost : 2147 / jmxrmi -J-DsocksNonProxyHosts =

아래 답변 중 하나에서 언급했듯이 JDK 8u60 + -J-DsocksNonProxyHosts=에서 작동하려면 옵션이 있어야합니다.


거의 모든 최신 JDK 버전 (7u25 이상)에서 이제 SSH를 통해 JConsole 및 Visual JVM을 매우 쉽게 사용할 수 있습니다 ( 이제 JMX를 단일 포트에 바인딩 할 수 있기 때문 ).

다음 JVM 매개 변수를 사용합니다.

-Dcom.sun.management.jmxremote.port=8090
-Dcom.sun.management.jmxremote.rmi.port=8090
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

그런 다음 SSH 연결을 시작합니다.

ssh my.javaserver.domain -L 8090:127.0.0.1:8090

JConsole에서 연결 한 후

원격 프로세스 :-> localhost : 8090

그리고 Java Visual VM

로컬-> JMX 연결 추가-> localhost : 8090을 마우스 오른쪽 버튼으로 클릭합니다.


최신 Java 버전 (약 8u66)에서 SSH socks 방법을 계속하면 socksNonProxyHosts를 비워 두어야합니다.

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 -J-DsocksNonProxyHosts=

참고 URL : https://stackoverflow.com/questions/15093376/jconsole-over-ssh-local-port-forwarding

반응형