防火墙内JVisualVM连接jstatd解决方案
jstatd启动后会打开两个端口,其中一个端口可通过参数“-p”指定,如果不指定默认为1099,另一个是一个随机端口,不能参数指定:
|
# netstat -lpnt|grep jstatd tcp 0 0 0.0.0.0:47260 0.0.0.0:* LISTEN 4998/jstatd tcp 0 0 0.0.0.0:1099 0.0.0.0:* LISTEN 4998/jstatd |
47260是一个随机端口,不方便穿透防火墙。这导致了一个问题,有防火墙时,JVisualVM将无法和jstatd正常通讯。看到的现象将如下:
|
较详细: RMI TCP Connection(4063)-192.168.1.31: [192.168.1.31: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)] 十二月 05, 2018 7:15:45 上午 sun.rmi.server.UnicastServerRef logCall 较详细: RMI TCP Connection(4064)-192.168.1.31: [192.168.1.31: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote |
启动参数:
|
jstatd -J-Djava.security.policy=/usr/local/jdk/bin/jstatd.policy -J-Djava.rmi.server.hostname=192.168.1.31 -p 1099 |
而正常的应当如下:
|
Dec 04, 2018 7:19:30 PM sun.rmi.server.UnicastServerRef logCall FINER: RMI TCP Connection(5)-192.168.1.37: [192.168.1.37: sun.tools.jstatd.RemoteVmImpl[-220b68dc:16778f1bf45:-7ff2, -324702369529557764]: public abstract byte[] sun.jvmstat.monitor.remote.RemoteVm.getBytes() throws java.rmi.RemoteException] |
原因正是JVisualVM和jstatd的随机端口47260不通。
解决方案一:gdb修改监听端口号
操作步骤:
|
# gdb /usr/local/jdk/bin/jstatd (gdb) set args -J-Djava.security.policy=/usr/local/jdk/bin/jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.31.98 -J-Djava.net.preferIPv4Stack=true -J-Djava.rmi.server.logCalls=true -p 8080 (gdb) b bind (gdb) r (gdb) bt #0 0x00007ffff74da040 in bind () from /lib64/libc.so.6 #1 0x00007fffd8eafc99 in Java_java_net_PlainSocketImpl_socketBind () from /usr/local/jdk1.8.0_121/jre/lib/amd64/libnet.so #2 0x00007fffe1015834 in ?? () #3 0x00007ffff60eb260 in ?? () #4 0x00007fffe10155b9 in ?? () #5 0x00007ffff0008000 in ?? () #6 0x00007fffe1015582 in ?? () #7 0x00007ffff60eb220 in ?? () #8 0x00007fffdac2d250 in ?? () #9 0x00007ffff60eb290 in ?? () #10 0x00007fffdac33d28 in ?? () #11 0x0000000000000000 in ?? () (gdb) info reg rax 0x0 0 rbx 0x7ffff00081f8 140737219953144 rcx 0x7ffff7374f60 140737340985184 rdx 0x10 16 rsi 0x7ffff60eb1a0 140737321546144 rdi 0x11 17 rbp 0x7ffff60eb1f0 0x7ffff60eb1f0 rsp 0x7ffff60eb188 0x7ffff60eb188 r8 0x7ffff0007730 140737219950384 r9 0x719d2f148 30498025800 r10 0x7ffff60ead50 140737321545040 r11 0x7ffff74da040 140737342447680 r12 0x7ffff60eb288 140737321546376 r13 0x0 0 r14 0x7ffff60eb290 140737321546384 r15 0x7ffff60eb1a0 140737321546144 rip 0x7ffff74da040 0x7ffff74da040 <bind> eflags 0x206 [ PF IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0 |
端口号是在调用系统函数bind时指定的,bind函数原型如下:
|
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
也就是第二个参数,sockaddr的结构为:
|
struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[X]; }; typedef unsigned short int sa_family_t; typedef uint16_t in_port_t; |
寄存器rsi保存了bind函数的第二个参数addr的地址0x7ffff60eb1a0(对应的十进制值为140737321546144),对于IPv4,sin_family的值一般为AF_INET(2),可gdb确认(查看addr的头2个字节值):
|
(gdb) p *(unsigned short*)0x7ffff60eb1a0 $10 = 2 |
结果符合预期,再查看sin_port的值:
|
(gdb) p *(unsigned short*)(0x7ffff60eb1a0+2) $11 = 0 |
值为0,表示随机端口,这正是需要修改的地方,将它改成十进制值443:
|
(gdb) set *(unsigned short*)(0x7ffff60eb1a0+2)=443 (gdb) p *(unsigned short*)(0x7ffff60eb1a0+2) $12 = 443 |
注意jstat即会绑定IPv4(AF_INET)地址,还会绑PF_NETLINK(16),而第一次bind时的端口正是随机端口,因此只需要修改这一处。
传递给bind的端口号需为网络字节序值,即大端值,所以不能简单的修改为十进制443,443的十六进制值为0x01BB,这个为小端值,对应的大端值为0xBB01。
|
(gdb) set *(unsigned short*)(0x7ffff60eb1a0+2)=0xBB01 (gdb) d (gdb) c Continuing. |
会遇到几个SIGSEGV,均不用管,继续执行即可进入正常工作状态:
|
Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7fffd9536700 (LWP 28085)] |
可以看到jstatd工作在期望的端口上:
|
# netstat -lpnt|grep jstatd tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 28058/jstatd tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 28058/jstatd |
至此JVisualVM已能够正常连接jstatd了。可考虑使用gdb脚本自动修改端口,这样就可广泛部署并且零门槛。
解决方案二:端口转发方式
不需要懂gdb操作,在jstatd安装反向代理,如rinetd或直接使用sshd或iptables做端口转发也可以。在JVisualVM也安装正向代理,如Proxifier等,数据路径如下:
|
JVisualVM <-> Proxifier <-> rinetd <-> jstatd |
网上搜索相关的资料即可。
解决方案三:使用增强型ejstatd
编译需要访问internet,执行“mvn package”编译(一些环境可能需要配置maven的proxy才能访问internet)。也可直接下载编译好的ejstatd:
防火墙内JVisualVM连接jstatd解决方案的更多相关文章
- jvisualvm 连接 jstatd 远程监控 jvm 或 Visual GC提示"不受此JVM支持“
Visual GC提示"不受此JVM支持",可以使用此方法解决. 一.添加配置文件 jstatd.all.policy [root@localhost /]# cd /usr/lo ...
- jvisualvm连接远程应用终于成功,附踩大坑记录!!(一:jstatd方式)
一.问题概述 连接远程java应用除了jstatd方式,还有jmx方式.不必拘泥于一种,一种不行可以果断尝试另一种,兴许就行了. 姊妹篇在这: jvisualvm连接远程应用终于成功,附踩大坑记录!! ...
- jvisualvm连接远程应用终于成功,附踩大坑记录!!(二:jmx方式)
一.问题概述 参考前一篇: jvisualvm连接远程应用终于成功,附踩大坑记录!!(一:jstatd方式) 这篇主要讲讲jmx方式. 二.启动前设置jmx参数 我这边拿tomcat举例,其余java ...
- 云计算之路-试用Azure:如何建立虚拟机之间的内网连接
在阿里云上,同一个帐户创建的所有虚拟机(云服务器)之间的内网是直接连通的.而Azure则完全不一样,一开始使用时有点不知所措,后来摸索出来了——在Azure中只有处于同一个虚拟网络(Virtual N ...
- Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池
连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...
- Navicat通过云主机内网连接阿里云RDS
背景 公司为了安全起见,RDS设置只允许阿里云主机的内网端可以访问.这就意味,如果要操作RDS就需要连接到云主机上之后通过mysql shell操作.操作起来很复杂麻烦,今天看同事用Navicat f ...
- 开源数据库连接池之Tomcat内置连接池
本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...
- 局域网内远程连接OPC配置方法详解
局域网内远程连接OPC配置方法详解 https://wenku.baidu.com/view/20fb8ea6d1d233d4b14e852458fb770bf78a3bcc.html OPC服务 ...
- win10不能被远程解决方案(开启远程桌面,防火墙仍不能被远程解决方案)
开启远程桌面,防火墙仍不能被远程解决方案 1.“Win+R”→“gpedit.msc” 2.依次展开“计算机配置”→“管理模版”→“系统”→“凭据分配”→找到“允许分配保存的凭据用于仅NTLM服务器身 ...
随机推荐
- 35-BigDecimal详解
详解 import java.math.BigDecimal; import java.math.BigInteger; import java.util.Scanner; public class ...
- spyder在编辑过程中被自己弄乱了,想要恢复成安装时默认的格式或者重置页面格式的解决办法
打开spyder,tools-->Reset Spyder to factory defaults,按照如上操作即可恢复成安装时的默认格式.
- vue 自定义组件directives
自定义指令:以v开头,如:v-mybind. 代码示例: <input v-mybind /> directives:{ mybind:{ bind:function (el) { el. ...
- centos 命令学习
关机&重启 shutdown -h 10 #计算机将于10分钟后关闭,且会显示在登录用户的当前屏幕中 shutdown -h now #计算机会立刻关机 shut ...
- VS2010,VS2012,VS2013中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
在VS2013开发环境下,C#引用COM组件遇到的两个问题: 一开始是COM组件没有注册导致代码引用报错,那么我就使用管理员的命令行方式下,入册COM组件: C:\WINDOWS\system32&g ...
- Linux驱动之LED驱动编写
从上到下,一个软件系统可以分为:应用程序.操作系统(内核).驱动程序.结构图如下:我们需要做的就是写出open.read.write等驱动层的函数.一个LED驱动的步骤如下: 1.查看原理图,确定需要 ...
- 安卓项目R,java文件不能自动更新,clean之后,R.java消失 (转自 Cynosure鱼)
今天整了个安卓项目,新增加了个跳转页面,添加完背景图,发现有个R.id找不到了,于是clean了一下,这下出问题了,发现各处的R.id都找不到,报错.结果一看是R.java没了然后各种百度结果:有 ...
- poj 1088 (dfs+记忆化) 滑雪
题目;http://poj.org/problem?id=1088 感觉对深搜还不太熟练,所以练习一下,类似于连连看的那题,注意的是所求的是最大达长度,并不是从最大的或者最小的点出发得到的就是最长的路 ...
- hdu 1429 (bfs+状态压缩) 胜利大逃亡续
http://acm.hdu.edu.cn/showproblem.php?pid=1429 典型的状压搜索,在普通的搜索基础上,利用二进制的特性记录钥匙与门, 二进制的每一位代表一把钥匙,比如说拿到 ...
- 如何让网站在百度有LOGO展示
什么叫没有了网站logo?准确来说应该是网站索引logo,这个logo确实网站很好的一个展示窗口,我以长沙seo关键词为例,我给大家举例! 我输入长沙SEO,出来的百度索引图,原本所有我标红的框子里都 ...