]
トップ 最新 追記

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)の図を参照していただきたい。

  1. どのサービスから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 が有効かどうかを確認するのである。

  2. 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 でソースを取ってきて、すぐに調べるといいのではないだろうか。
  3. あと、NRPEがきちんと設定できれば、CentOSだろうがDebianだろうが、相互に監視できる。
以上、簡単にソースコードを調べるだけで、具体的な設定の書き方がわかるので、apt-get source や、Redhat系でも、それに準じるコマンドで、ソースを確認していただきたい。

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の管理を運用がしっかりと握らないといけない。

iptstate

natの内容をtopのような形式で表示してくれるプログラム。いまのコネクション情報を見るのによいが、大規模な環境だと、役立つかなあ。ないよりはあった方が良いけど。ものすごいエントリー数になりそうなので、具体的になにができるだろうか。 iptstateの画像


2011-12-17 [長年日記]

_ ネットワークのインタフェースでの通信量の可視化

iftopというコマンドがある。apt-get install iftopで導入できる。

このプログラムの面白いのは、-m オプションで流れているトラフィックの上限値を決めて、テキストベースではあるが、通信量に応じて棒が伸び縮みするので、現在の通信量がリアルタイムでわかるという点である。

iftopコマンドの画像 scli

apt-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系列を使いましょう。