Zabbix + iptables NATで遠隔拠点のプライベートIPアドレスサーバーを監視する
遠隔拠点にある、グローバルIPアドレスを持たない(プライベートIPアドレスしか持たない)サーバーも含むサーバー群をZabbixで監視する場合、拠点ごとにZabbix Proxyを設置するのが一般的だと思います。
(参考)
・SCSK ZABBIX大解説 第5回 応用編 (2/3)Zabbixプロキシの利用
https://www.scsk.jp/product/oss/tec_guide/zabbix/1_zabbix5_2.html
ここでは、何らかの理由でZabbix Proxyを設置したくない場合、拠点にゲートウェイサーバーを用意して、iptablesのNATテーブルでZabbixの通信パケットを転送することで監視を実現する方法をまとめます。
なお、Zabbixの詳細な設定手順については、ここでは省略します。
以下などを参照してください。
(参考)
・さくらのナレッジ
統合監視ツール「Zabbix」によるサーバー監視
https://knowledge.sakura.ad.jp/585/
Zabbixサーバー、エージェント間の通信
Zabbixサーバーと、監視対象サーバーに導入するZabbixエージェント間の通信は双方向で、以下のポートを使用します。
- Zabbixサーバー → Zabbixエージェント TCP/10050
- Zabbixエージェント → Zabbixサーバー TCP/10051
なお、後者の「Zabbixエージェント → Zabbixサーバー TCP/10051」については、アクティブチェック型の監視をする場合に必要とのことで、アクティブチェック型の監視をしないのであれば、必要ありません。
(参考)
・Zabbixのポート要件
http://www.zabbix.jp/node/1029
・zabbix_agentdからの通信について
http://www.zabbix.jp/node/949
グローバルIPアドレスを持たないZabbixエージェントがある場合、例えば、下図のように、ゲートウェイサーバーのiptablesでZabbixの通信を転送することができます。
Zabbixサーバーから見て、ゲートウェイサーバーのTCP/20050がZabbixエージェントのホストに見えるようにします。
また、Zabbixエージェントから見て、ゲートウェイサーバーがZabbixサーバーに見えるようにします。
※ここで、ZabbixサーバーからZabbixエージェントへの通信で、ポートをデフォルトのTCP/10050ではなくTCP/20050としたのは、TCP/10050はゲートウェイサーバー自身のZabbix監視で使用する可能性があるためです。
設定例
今回の設定例の全体構成は下図のようになります。
Zabbixサーバーから拠点AのDBサーバーを監視します。
拠点Aでは、ゲートウェイサーバーはグローバルIPアドレスとプライベートIPアドレスを持ち、プライベート側のネットワーク(192.168.0.0/24)でZabbixエージェントを稼働しているDBサーバーと通信できるものとします。
DBサーバーのZabbixエージェント設定
/etc/zabbix/zabbix_agentd.conf を編集します。
Zabbixエージェントから見て、ゲートウェイサーバーがZabbixサーバーに見えるようにします。
Server=192.168.0.101 // ゲートウェイサーバーのプライベートIPアドレス Hostname=db_server // Zabbixサーバーで登録するHostnameと一致させる ServerPort=10050 ListenPort=10051
ゲートウェイサーバーの設定
・カーネルのip転送を有効化
# sysctl -w net.ipv4.ip_forward=1
再起動後も有効にするための設定を行います。
# vi /etc/sysctl.conf #net.ipv4.ip_forward = 0 net.ipv4.ip_forward = 1
/etc/sysctl.confへの変更をすぐにサーバーに反映させます。
# sysctl -p /etc/sysctl.conf
・iptablesの設定
これ以降のiptables設定は、Zabbixに関わる通信の分のみ記載しています。
グローバル側インタフェースeth0, プライベート側インタフェースeth1で、セッション確立後のアクセスはすべて許可します。
# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A OUTPUT -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
・iptablesの設定(Zabbixサーバー→Zabbixエージェントの通信)
DNATで、ZabbixサーバーからDBサーバーZabbixエージェントへの通信パケット(TCP/20050)をDBサーバーのTCP/10050ポートに転送します。
# iptables -t nat -A PREROUTING -i eth0 -s XXX.XXX.XXX.XXX -d YYY.YYY.YYY.YYY \ -p tcp --dport 20050 -j DNAT --to-destination 192.168.0.201:10050
SNATで、DBサーバーTCP/10050への通信パケットの送信元IPアドレスを XXX.XXX.XXX.XXX からゲートウェイサーバーのプライベートIPアドレス 192.168.0.101 に書き換えます。
(この設定がないと、DBサーバーからの戻りパケットがゲートウェイサーバーに戻ってきません。ただし、DBサーバーのネットワーク設定で、デフォルトゲートウェイをゲートウェイサーバーの 192.168.0.101 と設定していれば、このSNATエントリーがなくても、パケットは戻ります。)
iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.201 --dport 10050 \ -j SNAT --to-source 192.168.0.101
FORWARDチェーンで、TCP/10050へ転送するパケットのターゲットをACCEPTとします。
(FORWARDチェーンのターゲットのデフォルトがACCEPTであれば、FORWARDチェーンのルールは不要です。)
# iptables -A FORWARD -p tcp --dport 10050 -j ACCEPT
DBサーバーに転送後、セッションが確立されたあとのパケットを許可します。
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
・iptablesの設定(Zabbixエージェント→Zabbixサーバーへの通信)
DNATで、DBサーバーから受け取ったZabbixサーバーへの通信パケット(TCP/10051)をZabbixサーバーに転送します。
# iptables -t nat -A PREROUTING -i eth1 -s 192.168.0.201 -d 192.168.0.101 \ -p tcp --dport 10051 -j DNAT --to-destination XXX.XXX.XXX.XXX
SNATで、Zabbixサーバーへの通信パケットの送信元IPアドレスを、ゲートウェイサーバーのIPアドレスの YYY.YYY.YYY.YYY に書き換えます。
# iptables -t nat -A POSTROUTING -s 192.168.0.201 -p tcp \ --dport 10051 -j SNAT --to-source YYY.YYY.YYY.YYY
FORWARDチェーンで、TCP/10051へ転送するパケットのターゲットをACCEPTとします。
(FORWARDチェーンのターゲットのデフォルトがACCEPTであれば、FORWARDチェーンのルールは不要です。)
# iptables -A FORWARD -p tcp --dport 10051 -j ACCEPT
Zabbixサーバーのホストエントリー登録
Zabbixサーバーから見て、ゲートウェイサーバーのTCP/20050がZabbixエージェントのホストに見えるようにします。
- Host name: db_server // Zabbixエージェントで設定するHostnameと一致させる
- IP: YYY.YYY.YYY.YYY
- Port: 20050
以上の設定で、Zabbixサーバーから、インターネットに公開されていないDBサーバーの監視ができるようになりました。
まとめ
遠隔拠点のインターネットに公開されていないプライベートIPアドレスのサーバーをZabbixで監視する場合、Zabbix Proxyの代わりにiptables NATテーブルを使用する方法をまとめました。
本来はZabbix Proxyを使用すべきなのでしょうが、「Zabbix用のMySQLはインストールしたくない」など何らかの理由があって、監視対象のサーバーが少ない場合はこの方法で代用することができるでしょう。