zabbix通過JMX監控tomcat,防火牆策略配置

一、目前的環境

被監控端192.168.153.191

/usr/local/tomcat

下載了catalina-jmx-remote.jar放到了tomcat安裝目錄的lib目錄下,現在爲止這個jar包沒有派上用場。

/usr/local/jdk1.7.0_79

在tomcat的bin目錄下的catalina.sh腳本里面添加如下內容(可以寫成一行,這個百度下能找到)

Html代碼

CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=192.168.153.191"  
CATALINA_OPTS="${CATALINA_OPTS} -Djavax.management.builder.initial="  
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote=true"  
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.port=12345"  
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"  
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"

 

  按照平常的思維: 按理說只要在iptables裏開放一個12345端口就可以了

 

Zabbix_Server及Zabbix_Java_Gateway端192.168.153.181

安裝目錄就不說明了,一般可以在/usr/local/zabbix_server,/usr/local/zabbix_java_gateway

主要是想說明兩個配置文件

 

zabbix_server.conf

Xml代碼  收藏代碼

ListenPort=10051  
LogFile=/tmp/zabbix_server.log  
DBName=zabbix  
DBUser=zabbix  
DBPassword=zabbix  
DBPort=3306  
JavaGateway=127.0.0.1  
JavaGatewayPort=10052  
StartJavaPollers=5

 

 zabbix_java_gateway的配置文件(zabbix_java_gateway安裝目錄/zabbix_java/sbin/setting.sh)

Xml代碼  收藏代碼

LISTEN_IP="0.0.0.0"  
LISTEN_PORT=10052  
PID_FILE="/tmp/zabbix_java.pid"  
START_POLLERS=5

說明

1)Zabbix_Server與Zabbix_Java_Gateway在一臺機器上IP地址爲192.168.153.181

被監控的機器上,裝了tomcat ,IP地址爲192.168.153.191

兩臺機器上的系統都爲CentOS 6.5

 

2)已經通過前篇文章在被監控的機器上(192.168.153.191),配置好了JMX,防火牆(iptable)開放了12345端口。

Xml代碼  

# Firewall configuration written by system-config-firewall  
# Manual customization of this file is not recommended.  
*filter  
:INPUT ACCEPT [0:0]  
:FORWARD ACCEPT [0:0]  
:OUTPUT ACCEPT [0:0]  
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
-A INPUT -p icmp -j ACCEPT  
-A INPUT -i lo -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 12345 -j ACCEPT  
-A INPUT -j REJECT --reject-with icmp-host-prohibited  
-A FORWARD -j REJECT --reject-with icmp-host-prohibited  
COMMIT

 

 

 二、存在問題

telnet 192.168.153.191 12345 是可以連上的,但是jconsole連不上,zabbix web頁面上hosts項顯示也是連不上



 

 

 

 

 三、尋找問題原因

從來沒遇到過這樣的奇葩情況,開始一路google,baidu。找了十幾篇文章,都搞不定。有些文章指出使用(org.apache.catalina.mbeans.JmxRemoteLifecycleListener 這個類在catalina-jmx.remote.jar包中,在server.xml中配置一個Listener,我沒試過,這個我想估計是解決的一個方法)。

 

偶然看到小日本的一篇文章讓我茅塞頓開,文章網址:http://www.checksite.jp/jconsole-jmx-tomcat


發現被監控JMX開啓的監聽端口不止一個!馬上改下被監控端的iptables

Xml代碼  收藏代碼

# Firewall configuration written by system-config-firewall  
# Manual customization of this file is not recommended.  
*filter  
:INPUT ACCEPT [0:0]  
:FORWARD ACCEPT [0:0]  
:OUTPUT ACCEPT [0:0]  
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
-A INPUT -p icmp -j ACCEPT  
-A INPUT -i lo -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 12345:65535 -j ACCEPT  
-A INPUT -j REJECT --reject-with icmp-host-prohibited  
-A FORWARD -j REJECT --reject-with icmp-host-prohibited  
COMMIT

 

 

 結果還真TM連上了!有圖有真相



 
但總感覺,不需要開那麼多端口吧。。。於是想用二分法來試驗,到底是從哪個端口到哪個端口。試了幾個,感覺這個方法要找到這個臨界端口的話,太麻煩了,感覺思路不對(猜根本就不是這麼回事)。

 

偶然間敲了個命令:netstat -anlp(敲兩次命令之間重啓過tomcat,不過這裏爲什麼顯示的ip是192.168.153.19跟192.168.153.18,應該是192.168.153.191跟192.168.153.181,不過這個先不管!也許是虛擬機的問題,不管它,忽略!)

PS:192.168.153.2是我的windows宿主機

 

應驗了上面的猜測,確實不是這麼回事啊!

 

 重啓tomcat後

 再重啓tomcat



 

 

 從以上3個圖看,得出結論,被監控端會開啓兩個端口,一個端口是12345(在被監控端tomcat安裝目錄的bin子目錄下的setenv.sh文件中已經指明瞭CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.port=12345"),另一個端口應該是動態隨機的(因此無法知道JMX會監聽哪個端口),這是一個比較頭痛的問題!

怪不得小日本會這麼寫iptables的策略。

 

四、解決辦法

1) 臨時方案

將上述3張圖,顯示的33022或48289或36479,端口開放出來,但這種方式,重啓tomcat,或重啓服務器後就不行了,是下下策。

 

2)開放很多端口

一種辦法就是在被監控端的iptables策略寫成下面的方式。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 12345:65535 -j ACCEPT

這個方法重啓tomcat,重啓服務器,都沒問題,但是開放了太多端口。

 

3)終極方案

就是要用到catalina-jmx-remote.jar (強烈推薦這種方案)

下載catalina-jmx-remote.jar

   不同版本Tomcat有不同的catalina-jmx-remote.jar,在tomcat的下載頁(我用的tomcat版本是7.0.62)面http://tomcat.apache.org/download-70.cgi,找到以下JMX Remote jar,把這個文件放到tomcat安裝目錄的lib子目錄下

修改Tomcat安裝目錄conf子目錄下的server.xml配置文件

Xml代碼  

省略...  
<Server port="8005" shutdown="SHUTDOWN">  
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />  
  <!-- Security listener. Documentation at /docs/config/listeners.html  
  <Listener className="org.apache.catalina.security.SecurityListener" />  
  -->  
  <!--APR library loader. Documentation at /docs/apr.html -->  
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->  
  <Listener className="org.apache.catalina.core.JasperListener" />  
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->  
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />  
  <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"  
          rmiRegistryPortPlatform="12345" rmiServerPortPlatform="12346" />  
省略...

 

       

 修改上面所說的Tomcat安裝目錄bin子目錄下的catalina.sh腳本

Xml代碼  收藏代碼

CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=192.168.153.191"  
CATALINA_OPTS="${CATALINA_OPTS} -Djavax.management.builder.initial="  
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote=true"  
#CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.port="#端口配置不用了  
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"  
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"

 

 

修改/etc/sysconfig/iptables 防火牆策略

Xml代碼  收藏代碼

# Firewall configuration written by system-config-firewall  
# Manual customization of this file is not recommended.  
*filter  
:INPUT ACCEPT [0:0]  
:FORWARD ACCEPT [0:0]  
:OUTPUT ACCEPT [0:0]  
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
-A INPUT -p icmp -j ACCEPT  
-A INPUT -i lo -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 12345 -j ACCEPT  
-A INPUT -m state --state NEW -m tcp -p tcp --dport 12346 -j ACCEPT  
-A INPUT -j REJECT --reject-with icmp-host-prohibited  
-A FORWARD -j REJECT --reject-with icmp-host-prohibited  
COMMIT

 

    注意:與server.xml配置裏的org.apache.catalina.mbeans.JmxRemoteLifecycleListener監聽器所配置的端口一致

Xml代碼  

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"  
          rmiRegistryPortPlatform="12345" rmiServerPortPlatform="12346" />

 

   

    然後,重啓被監控機器上(192.168.153.191)的tomcat,在windows宿主機上用jconsole.jar測試是否可以連接,結果連接成功了!

    

 


zabbix_server請求zabbix_java_gateway去連接JMX可能有一定延遲,所以需要等一會兒,JMX標誌要過一會纔會顯示會綠色


zabbix web監控頁面hosts項的192.168.153.191  的 JMX的標誌也變綠了。大功告成!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章