昨天監控公司的托管主機時發現監控不上,回想起來其實就是個小問題,分分鍾能解決的事,排錯的過程才是真正耗心費神的。
監控環境:
A zabbix server: 192.168.17.110 server端設在公司內部 B zabbix agent: 10.200.66.90 (被動模式)這台服務器為托管機 A(192.168.17.110)通過vpn與托管機B(10.200.66.90)通信,由於防火牆策略,A能ping通B,B不能ping通A,即發起tcp連接的機器必須為A(A--->B),從B方發起的連接(B--->A)是被拒絕的。
zabbix agent端配置文件:
egrep -v "^#|^$" /usr/local/zabbix/conf/zabbix_agentd.conf LogFile=/tmp/zabbix_agentd.log DebugLevel=3 Server=192.168.17.120 ListenPort=10050 #ServerActive=192.168.17.120 Hostname=10.200.66.92
在zabbix server端運行zabbix_get獲取數據報錯:
Get value from agent failed: ZBX_TCP_READ() failed: [104] Connection reset by peer
zabbix_get [30318]: Check access restrictions in Zabbix agent configuration
是由於AB只能單向發起連接請求導致的嗎?
在過去的幾小時筆者也在糾結是否是這個原因,是不是agent端因為不能主動發起連接所以server獲取不到數據呢?
ssh端口轉發能解決嗎?
既然A到B能通,B到A不通,那可以將B端的10050端口轉發到A主機嗎?
ssh端口轉發的三種模式:本地端口轉發,遠程端口轉發,動態端口轉發
A到B能通,B到A不通,照理說應該在A機器上進行ssh遠程端口轉發,打通B端10050口到A端的通道,但被動模式下A並不是用確定的端口與B的10050通信,所以ssh端口轉發並不能解決筆者的問題
問題所在
前面一系列猜想都是因為未對zabbix被動模式有深入理解而導致的,被動模式並不要求AB能互相發起連接,只要A(server)能向B(agentd)發起連接足矣。A通過B的10050端口向B發起TCP連接,三次握手完成后即可進行數據傳輸。因此問題不應該在此。應該還是配置出問題了!!
查看agent端日志
tail /tmp/zasbbix_agentd.log
......
...... 104276:20170829:095704.310 failed to accept an incoming connection: connection from "10.200.58.10" rejected, allowed hosts: "192.168.17.110"
日志說明了一切,都是vpn惹的禍,server(192.168.17.110)通過vpn后進行了地址轉換,最終與agent通信的已經不是在內網中的真實IP了,而是變成了10.200.58.10。
解決該問題只需更改server名或server IP即可:將agent配置文件中Server=192.168.17.120改為Server=10.200.58.10