Yukiharu YABUKI の tDiary
このtDiaryを検索します。
2011-12-10 [長年日記]
_ nagios-plugin-nrpe の設定のキモとなりそうないくつかの点
nagiosという監視システムがある。わりと老舗の監視システムで、設定を覚えるまでは、ちょいと苦労するかもしれないが、覚えてしまえば、かなり柔軟なことができるシステムである。
もちろん、Debian GNU/Linux にも収録されており、デフォルトでインストールすると、自分自身を監視するデフォルトの設定ができあがっており、そこから設定例をみて自分で拡張することができる。
今回記事を書こうと思ったのは、Google検索上位で NRPE の設定について、いくつか参照をさせていただいた。その中で読者をミスリーディングさせるような記事もあり、NRPEの設定方法について、いくつかのチェックポイントを書いておきたい。
本来は、NagiosとNRPEの関係など詳しく書くべきだか、リモートホストの資源管理nrpeのインストール(http://anabuki.dip.jp/linkstation/nrpe.html)の図を参照していただきたい。
- どのサービスからNRPEが起動されるのか確認しよう。
私の触っている範囲の、CentOSとDebianでは、DaemonでNRPEを上げているパターンなのだが、世の中には、xinetdで、NRPEを上げる作法もあるようだ。xinetd経由だと、 /etc/nagios/nrpe.cfg の allowed_hosts を参照しないようなのである。だから、allowd_hosts=xxx.xxx.xxx.xxx/24という表記をしているが、xinetd 経由だと一見、動いているように見える。
だが、それだとdaemonに切り替えた時に動かなくて、「相性」の問題にされている節がある。そこで、提案したいのが、ps auxw コマンドなどで、nrpe が起動している時のオプションを確認すること。manなどを確認するとわかるが、-d が daemon モード -i が inetd または xinetd で起動されている。これをみることで allowed_hosts が有効かどうかを確認するのである。
- allowed_hostsの書き方
上記でも書いたが、allowed_hostsには、xxx.xxx.xxx.xxx/24という表記は使えない。ではどのような表記ができるのか。
forkで子プロセスが生成されて、シグナルを受け付けるなどの一般的な処理があって... 871 /* is this is a blessed machine? */ 872 if(allowed_hosts){ 873 874 if(!is_an_allowed_host(inet_ntoa(nptr->sin_addr))){ 875 876 /* log error to syslog facility */ 877 syslog(LOG_ERR,"Host %s is not allowed to talk to us!",inet_ntoa(nptr->sin_addr)); 878 879 /* log info to syslog facility */ 880 if(debug==TRUE) 881 syslog(LOG_DEBUG,"Connection from %s closed.",inet_ntoa(nptr->sin_addr)); 882 883 /* close socket prior to exiting */ 884 close(new_sd); 885 886 exit(STATE_OK); 887 } 888 else{ 889 890 /* log info to syslog facility */ 891 if(debug==TRUE) 892 syslog(LOG_DEBUG,"Host address is in allowed_hosts"); 893 } 894 } 896 #ifdef HAVE_LIBWRAP 897 898 /* Check whether or not connections are allowed from this host */ 899 request_init(&req,RQ_DAEMON,"nrpe",RQ_FILE,new_sd,0); 900 fromhost(&req); 901 902 if(!hosts_access(&req)){ 903 904 syslog(LOG_DEBUG,"Connection refused by TCP wrapper"); 905 906 /* refuse the connection */ 907 refuse(&req); 908 close(new_sd); 909 910 /* should not be reached */ 911 syslog(LOG_ERR,"libwrap refuse() returns!"); 912 exit(STATE_CRITICAL); 913 } 914 #endif 915 916 /* handle the client connection */ 917 handle_connection(new_sd); 918 919 /* log info to syslog facility */ 920 if(debug==TRUE) 921 syslog(LOG_DEBUG,"Connection from %s closed.",inet_ntoa(nptr->sin_addr)); 922 923 /* close socket prior to exiting */ 924 close(new_sd); 925 926 exit(STATE_OK); 927 } 928 929 /* first child returns immediately, grandchild is inherited by INIT process -> no zombies. .. */ 930 else 931 exit(STATE_OK); 932 }
952 /* checks to see if a given host is allowed to talk to us */ 953 int is_an_allowed_host(char *connecting_host){ 954 char *temp_buffer=NULL; 955 char *temp_ptr=NULL; 956 int result=0; 957 struct hostent *myhost; 958 char **pptr=NULL; 959 char *save_connecting_host=NULL; 960 struct in_addr addr; 961 962 /* make sure we have something */ 963 if(connecting_host==NULL) 964 return 0; 965 if(allowed_hosts==NULL) 966 return 1; 967 968 if((temp_buffer=strdup(allowed_hosts))==NULL) 969 return 0; 970 971 /* try and match IP addresses first */ 972 for(temp_ptr=strtok(temp_buffer,",");temp_ptr!=NULL;temp_ptr=strtok(NULL,",")){ 973 974 if(!strcmp(connecting_host,temp_ptr)){ 975 result=1; 976 break; 977 } 978 } 979 980 /* try DNS lookups if needed */ 981 if(result==0){ 982 983 free(temp_buffer); 984 if((temp_buffer=strdup(allowed_hosts))==NULL) 985 return 0; 986 987 save_connecting_host=strdup(connecting_host); 988 for(temp_ptr=strtok(temp_buffer,",");temp_ptr!=NULL;temp_ptr=strtok(NULL,",")){ 989 990 myhost=gethostbyname(temp_ptr); 991 if(myhost!=NULL){ 992 993 /* check all addresses for the host... */ 994 for(pptr=myhost->h_addr_list;*pptr!=NULL;pptr++){ 995 memcpy(&addr, *pptr, sizeof(addr)); 996 if(!strcmp(save_connecting_host, inet_ntoa(addr))){ 997 result=1; 998 break; 999 } 1000 } 1001 } 1002 1003 if(result==1) 1004 break; 1005 } 1006 1007 strcpy(connecting_host, save_connecting_host); 1008 free(save_connecting_host); 1009 } 1010 1011 free(temp_buffer); 1012 1013 return result; 1014 }
ソースコードnrpe.c 2.12の該当する部分である。libwrapのこと、allwed_hostsのチェック方法などがわかる。上記のチェックさえ通れば、FQDNでもいいわけである。apt-get source でソースを取ってきて、すぐに調べるといいのではないだろうか。 - あと、NRPEがきちんと設定できれば、CentOSだろうがDebianだろうが、相互に監視できる。
2011-12-15 [長年日記]
_ [Linux] nat/conntrack as conntrack-tools
Debian GNU/Linux で、NAT を扱う場面はいろいろある。私のNoteはLXCで複数のインタフェースを扱えるようにするのに、NATを使っている。一般的には、IPv4のアドレスを節約するための NAT、LVS(Linux Virtual Server)で使う、NATなど用途は広い。
本エントリは、netstat-natを補完するものです。conntrack as conntrack-tools について、書いていましたが、
$ cat /proc/net/ip_conntrack $ cat /proc/sys/net/ipv4/netfilter/ip_conntrack_countの内容と同じような出力を conntrack コマンドで見ることができます。あと、ぼーっと conntrack -E でテーブルの更新情報をみるのも楽しいかもしれません。
$ cat /proc/sys/net/nf_conntrack_max 65536この設定は、大規模な同時接続数としては少ない。netfilterのFAQによると、64MBで4096コネクションなので、8GBだと52万コネクションぐらいになる。これはメモリに常駐する管理エリアである。
# conntrack -S entries 89 searched 1078 found 62150 new 15991 invalid 868 ignore 1375 delete 22629 delete_list 10703 insert 4066 insert_failed 0 drop 0 early_drop 0 icmp_error 865 expect_new 0 expect_create 0 expect_delete 0 search_restart 0
# conntrack -C 89バケツ
別の方法として、起動時にモジュール組み込みでバケツ(ハッシュ領域)の指定ができるようだ。効率はそれなりに良さそうなのだが、再起動せずに変更できるのだろうか。また困ったから、大きくしたい時にサービスを止める必要があるとすると辛いかも。
conntrackdこのdaemonがあれば、コネクショントラックを複製できるので fail over の時間が早くなるのだが、仮想IPの管理を運用がしっかりと握らないといけない。
iptstatenatの内容をtopのような形式で表示してくれるプログラム。いまのコネクション情報を見るのによいが、大規模な環境だと、役立つかなあ。ないよりはあった方が良いけど。ものすごいエントリー数になりそうなので、具体的になにができるだろうか。
2011-12-17 [長年日記]
_ ネットワークのインタフェースでの通信量の可視化
iftopというコマンドがある。apt-get install iftop
で導入できる。
このプログラムの面白いのは、-m オプションで流れているトラフィックの上限値を決めて、テキストベースではあるが、通信量に応じて棒が伸び縮みするので、現在の通信量がリアルタイムでわかるという点である。
scliapt-get install scli
でインストールできる scli というプログラムだと、(https://twitter.com/#!/znz/status/147962604193710080)znzさんが試しているが、topみたいにsnmpの情報がみえるようだ。
2011-12-18 [長年日記]
_ synergyで、Debian と Windows のキーボードとマウスを共有する。
普段は、Debianをつかっているのですがお仕事などで、Windowsをつかうこともあります。台数が多いと机の上にキーボードをおくことになり、小型のキーボードを使っても少し邪魔です。
そんなときに、synergy を使うと、キーボードとマウスを Debian と Windows で共用できます。OSは違いますが、マルチスクリーンの気分です。
synergyはクライアントサーバ型であり、Debianだと quicksynergy パッケージを導入すると、GUIで比較的容易に導入できます。もちろん設定ファイルを書く既存のスタイルでもかまいません
一つ注意しないといけないのは、Debian Squeeze に収録されているバージョンは synergy の安定版の 1.3.1 がベースです。windowsにインストールする synergy も安定版の1.3系列を使いましょう。