2月
04
2010
2

OpenVPN導入2@Ubuntu 9.10

前回からのつづきです

証明書や秘密鍵などの生成が終わったので,サーバの設定に入ります

設定ファイルの雛形があるので,コピーして使います
なぜかサーバ用だけ固められているので,展開しましょう

% sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
% sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
% sudo gunzip /etc/openvpn/server.conf.gz

構成はL2トンネル+ブリッジにします

サーバの設定ファイルは以下の通り(IPとかは環境に応じて修正して下さい)

    主な変更箇所は

  • 接続時,自宅ネットワークのDNSサーバを参照
  • TLS-AUTHを使用
  • 暗号化アルゴリズムに256bitのAESを使用
  • リンクMTUを1472に設定
  • MTUはいずれ最適化しようと思いますが,ドキュメントに

    However, for many cases, using a value of 1472 will maximize performance for TUN devices over IPv4.

    と書いてあったので,とりあえず1472を指定(実はうちIPv6)
    フラグメントしてようが,とりあえず繋がってるのでよしとしますw
    もうすぐIPv6とおさらばするので

    port 1194
    proto udp
    dev tap0
    ca CAの証明書
    cert サーバの証明書
    key サーバの秘密鍵
    dh DHパラメータ
    ifconfig-pool-persist ipp.txt
    server-bridge 192.168.86.10 255.255.255.0 192.168.86.101 192.168.86.125
    push "dhcp-option DNS 192.168.86.10"
    keepalive 10 120
    tls-auth 共通鍵 0
    cipher AES-256-CBC
    comp-lzo
    persist-key
    persist-tun
    log-append  /var/log/openvpn.log
    verb 4
    link-mtu 1472
    

クライアントの設定ファイルもサーバに合わせて変更しましょう

    client
    dev tap
    proto udp
    remote VPNサーバの名前orアドレス 1194
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca CAの証明書
    cert クライアントの証明書
    key クライアントの秘密鍵
    ns-cert-type server
    tls-auth 共通鍵 1
    cipher AES-256-CBC
    comp-lzo
    verb 4
    link-mtu 1472
    

次にブリッジの設定です
ブリッジ操作用のコマンドを使うのでインストールしましょう

% sudo apt-get install bridge-utils

ブリッジの作成と削除を行うスクリプトの雛形があるので,コピーして使います

% sudo cp /usr/share/doc/openvpn/examples/sample-scripts/bridge-st* /etc/openvpn/

まず,ブリッジの作成を行うbridge-startスクリプトです
ブリッジにデフォゲを設定するように変更しました

#!/bin/bash                                                                                     

#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################

# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.86.10"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.86.255"
eth_gateway="192.168.86.1"

for t in $tap; do
    openvpn --mktun --dev $t
done

brctl addbr $br
brctl addif $br $eth

for t in $tap; do
    brctl addif $br $t
done

for t in $tap; do
    ifconfig $t 0.0.0.0 promisc up
done

ifconfig $eth 0.0.0.0 promisc up

ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
route add default gw $eth_gateway $br

つづいて,ブリッジの削除を行うbridge-stopスクリプトです
ブリッジの削除後,eth0をもとの設定に戻すように変更しました

#!/bin/bash                                                                                     

####################################
# Tear Down Ethernet bridge on Linux
####################################

# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged together
tap="tap0"

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.86.10"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.86.255"
eth_gateway="192.168.86.1"

ifconfig $br down
brctl delbr $br 

for t in $tap; do
    openvpn --rmtun --dev $t
done

ifconfig $eth $eth_ip netmask $eth_netmask broadcast $eth_broadcast
route add default gw $eth_gateway $eth

ブリッジの作成・削除とOpenVPNサーバの起動・終了のタイミングは次の順で行います

  1. ブリッジの作成
  2. OpenVPNサーバの起動
  3. OpenVPNサーバの終了
  4. ブリッジの削除

OpenVPNの起動前にbridge-startを実行して,終了後にbridge-stopを行うようにします
64-67行目と81-84行目を追加しました

% sudo vim /etc/init.d/openvpn
 34 start_vpn () {
 ・・・
 60     # Check to see if it's already started...
 61     if test -e /var/run/openvpn.$NAME.pid ; then
 62       log_failure_msg "Already running (PID file exists)"
 63     else
 64       # Add bridge
 65       if [ -f /etc/openvpn/bridge-start ]; then
 66         /etc/openvpn/bridge-start
 67       fi
 68
 69       $DAEMON $OPTARGS --writepid /var/run/openvpn.$NAME.pid \
 70       $DAEMONARG $STATUSARG --cd $CONFIG_DIR \
 71       --config $CONFIG_DIR/$NAME.conf $script_security < /dev/null || STATUS=1
 72     fi
 73     log_end_msg $STATUS
 74 }
 75 stop_vpn () {
 76   kill `cat $PIDFILE` || true
 77   rm -f $PIDFILE
 78   rm -f /var/run/openvpn.$NAME.status 2> /dev/null
 79   log_end_msg 0
 80
 81   # Remove bridge
 82   if [ -f /etc/openvpn/bridge-stop ]; then
 83     /etc/openvpn/bridge-stop
 84   fi
 85 }

これで,OpenVPNサーバを起動すると

% ifconfig
br0       ・・・
eth0      ・・・
lo        ・・・
tap0      ・・・

% route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
192.168.86.0    *               255.255.255.0   U     0      0        0 br0
default         192.168.86.1    0.0.0.0         UG    0      0        0 br0

のように,tap0とbr0が作られて,ゲートウェイが設定されるようになります

OpenVPNサーバを終了すると

% ifconfig
eth0      ・・・
lo        ・・・

% route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
192.168.86.0    *               255.255.255.0   U     0      0        0 eth0
default         192.168.86.1    0.0.0.0         UG    0      0        0 eth0

のように,tap0とbr0は削除され,もとの設定に戻ります

細かいところですが,このままだとOpenVPNサーバの起動中にnetworkingを再起動すると,ルーティングテーブルがバグります
テーブルを見れば分かるように,192.168.86.0についてはbr0が先に,デフォゲはbr0のメトリックの方が小さいので問題なく動きますが・・・
ちょっと気持ち悪い

% route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
192.168.86.0    *               255.255.255.0   U     0      0        0 br0
192.168.86.0    *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth0
default         192.168.86.1    0.0.0.0         UG    0      0        0 br0
default         192.168.86.1    0.0.0.0         UG    100    0        0 eth0

なので,networkingを再起動するときにOpenVPNサーバが動作していれば,OpenVPNサーバも一緒に再起動するようにしました
76-80行目と92-95行目を追加しました
本来ならnetworkingをstopする時にも,OpenVPNサーバを終了させるべきかも知れませんが,networkingをstopすることはまずないのでズボラしました

% sudo vim /etc/init.d/networking
 75 force-reload|restart)
 76 >... # Stop openvpn if running
 77 >...if [ -e /var/run/openvpn.server.pid ]; then
 78 >...>...OPENVPN="TRUE"
 79 >...>.../etc/init.d/openvpn stop
 80 >...fi
 81
 82 >...process_options
 83
 84 >...log_action_begin_msg "Reconfiguring network interfaces"
 85 >...ifdown -a --exclude=lo || true
 86 >...if ifup -a --exclude=lo; then
 87 >...    log_action_end_msg $?
 88 >...else
 89 >...    log_action_end_msg $?
 90 >...fi
 91
 92 >...# Restart openvpn
 93 >...if [ "$OPENVPN" = "TRUE" ]; then
 94 >...>.../etc/init.d/openvpn start
 95 >...fi
 96 >...;;

OpenVPNサーバが起動している場合,bridge-startでeth0のアドレスが変更されて経路情報も消えているので,85行目の「ifdown -a –exclude=lo」で

RTNETLINK answers: No such process
SIOCDELRT: No such process

といわれますが,特に問題はありません

以上で,OpenVPNの設定はオシマイです

Written by h2 in: PC | タグ:
2月
03
2010
0

OpenVPN導入1@Ubuntu 9.10

出先や実家から自宅のネットワークにアクセスするためにVPNを導入しています

PPTPは論外として,自宅鯖移行のついでにiPhone/iPod TouchがサポートしているL2TP over IPsecも考えたのですが,プロトコルの仕様が少し曖昧なせいかプラットフォームによっては安定しないそうなので(実際安定しなかった),OpenVPNにしました

以下,作業ログです

インストール

% sudo aptitude install openvpn

サーバとクライアントの確認に証明書を使いますが,貧乏なのでオレオレ証明書です

OpenVPNには認証局や証明書を作成するためのeasy-rsaという便利なスクリプトがついています

% cd /usr/share/doc/openvpn/examples/easy-rsa/2.0

まず,オレオレ認証局 (CA) を作ります
sourceコマンドを使用する箇所があるので,rootでシェルを起動しましょう

% sudo -s

varsを適宜書き換えます
KEY_SIZEは2048bit以上にすることを強くオススメします
オレオレなので他は何でもOKです

# vi vars
export KEY_SIZE=2048
export KEY_COUNTRY="国"
export KEY_PROVINCE="州"
export KEY_CITY="都市"
export KEY_ORG="組織"
export KEY_EMAIL="メアド"

作業に必要な環境変数を設定して,スクリプトを実行します

# . ./vars
# ./clean-all
# ./build-ca

いくつか質問されるので答えましょう
基本Enter連打でOKです

続いて,サーバの秘密鍵と証明書を作ります

# ./build-key-server サーバ名

いくつか質問されるので答えましょう
基本Enter連打でOKですが,チャレンジパスワードを聞かれます

さらに,クライアントの秘密鍵と証明書を作ります

一般的には,クライアントが自分で鍵と証明書要求CSRを作って,認証局が署名して返します
具体的には,クライアントがbuild-reqやbuild-req-passスクリプト(パスフレーズで保護された証明書を作成)で生成したCSRに,CAがsign-reqスクリプトで署名します

今回は自分以外に使用者がいないので,認証局上で直接クライアントの鍵を作ってしまいます

# ./build-key クライアント名

いくつか質問されるので答えましょう
基本Enter連打でOKですが,チャレンジパスワードを聞かれます

最後に,DiffieHellmanパラメータを生成します

# ./build-dh

秘密鍵とDHパラメータは管理者以外が読めないようにしておきましょう

# chmod 600 keys/*.key
# chmod 600 keys/dh2048.pem

直接生成したファイルを参照しても構いませんが,「/etc/openvpn」以下に必要なファイルを置きましょう
自分はkeysというディレクトリを作成して,その中にまとめてあります

# mkdir /etc/openvpn/keys
# cp keys/CA証明書 /etc/openvpn/keys/
# cp keys/サーバ証明書 /etc/openvpn/keys/
# cp keys/サーバ秘密鍵 /etc/openvpn/keys/
# cp keys/DHパラメータ /etc/openvpn/keys/

クライアントにCAの証明書と秘密鍵を渡します
秘密鍵の受け渡しは安全な方法で

TLS-AUTHの共通鍵も生成しておきます
念のためアクセス権が600になっているか確認しましょう

# openvpn --genkey --secret /etc/openvpn/keys/ta.key

次回につづく

Written by h2 in: PC | タグ:
2月
02
2010
0

ATOK X3 for LinuxをUbuntu 9.10 (Karmic Koala) x86_64版にインストール

ようやくKarmicに移行できたので,ATOKも入れ直してみました

以前書いた「ATOK X3 for LinuxをUbuntu 9.04 (Jaunty Jackalope) x86_64版にインストール」というエントリとほとんど同じです

  1. Xから全員ログアウト
  2. 「Ctrl+Alt+F2」でコンソールに切り替え
  3. CDをマウント
  4. 環境変数LANGを設定
    % export LANG=C
    
  5. 空のファイル「/etc/gtk-2.0/gtk.immodules」を作成
    % sudo touch /etc/gtk-2.0/gtk.immodules
    
  6. CDドライブに移動して,スクリプトを実行
    % cd /media/cdrom
    % sudo bash ./setupatok_tar.sh
    
  7. 質問が3つ表示されるので順に「yes」,「/usr/bin/gtk-query-immodules-2.0」,「/etc/gtk-2.0/gtk.immodules」と答える
  8. IA-32ライブラリをインストール
    % sudo apt-get install ia32-libs
    
  9. IIMFのライブラリをインストール
    % cd bin/tarball/IIIMF
    % tar zxvf iiimf-client-lib-trunk_r3104-js1.i386.tar.gz -C (どこか適当な場所)
    % tar zxvf iiimf-protocol-lib-trunk_r3104-js1.i386.tar.g -C (どこか適当な場所)
    % sudo mv (どこか適当な場所)/usr/lib/* /usr/lib32/
    
  10. アップデート
    1. ATOK X3 for Linux アップデートモジュール(wgetの場合はコチラ
    2. 解凍
      % tar zxvf atokx3up2.tar.gz
      
    3. ATOKのアップデート
      % cd atokx3up2/bin/ATOK
      % sudo tar zxvf atokxup-20.0-3.0.0.i386.tar.gz -C /
      
    4. IIMFのアップデート
      % cd ../IIMF
      % sudo tar zxvf iiimf-server-trunk_r3104-js3.i386.tar.gz --exclude=’./usr/lib’ -C /
      % sudo tar zxvf iiimf-server-trunk_r3104-js3.i386.tar.gz ./usr/lib
      % sudo mv usr/lib/* /usr/lib32/
      
    5. GTKのアップデート
      % sudo tar zxvf iiimf-gtk-64-trunk_r3104-js3.x86_64.tar.gz -C /
      % sudo tar zxvf iiimf-gtk-trunk_r3104-js3.i386.tar.gz --exclude=’./usr/lib’ -C /
      % sudo tar zxvf iiimf-gtk-trunk_r3104-js3.i386.tar.gz ./usr/lib
      % sudo mv usr/lib/gtk-2.0/immodules /usr/lib32/gtk-2.0/
      
    6. ATOK X3 for Linux Ubuntu 9.04(GTK+ 2.16) 対応モジュール(wgetの場合はコチラ
    7. モジュールのインストール
      % sudo tar zxvf atokx3gtk216.tar.gz -C /
      
  11. CDをアンマウント
  12. 好みに応じてIIIMFステータス非表示ツールを設定
    1. 公式サイトからIIIMFステータス非表示ツールをDL(wgetの場合はコチラ
    2. 「/opt/atokx3/bin/」に展開し,パーミッションをroot:root (755)にする
    3. 「/etc/X11/xinit/xinput.d/iiimf」の末尾に「/opt/atokx3/bin/iiimf_status_hide」を追加
  13. 起動設定
    % sudo bash /opt/atokx3/sample/setting_debian4.sh
    
  14. 「Ctrl+Alt+F7」でXに切り替え
  15. 再ログイン
Written by h2 in: PC | タグ: ,
2月
01
2010
0

PT2設定 予約録画

epgrec

日経Linuxの記事用に開発された録画予約システムのepgrecを使用します

Ajaxを使ったUIで,市販のHDDレコーダのように番組表を見ながら予約できます

epgrecは公式サイトからDLできますが,日経Linux2010年2月号に収録されてるバージョンは受信可能電波の自動スキャン機能が使えます

  1. epgdump
      epgrecではEPGデータの取得にepgdumpが必要です
      2SNのアップ板からDLできます

      % tar zxvf epgdumpr2-utf8.tar.gz
      % cd epgdumpr2/
      % make
      % sudo cp epgdump /usr/local/bin
      

      録画したtsファイルがあれば,epgdumpをテストしてみましょう
      出力ファイルに「-」を指定すると標準出力に出力されます

      地デジの32chを録画した場合

      % epgdump 0032ontvjapan.com test.ts -
      

      BSの場合

      % epgdump /BS test.ts -
      
  2. epgrec
      epgrecのインストールはWordPressとかとほぼ同じで簡単です

      データをMySQLに格納するので,epgrec用のデータベースとユーザを作ります

      mysql> create database epgrec;
      Query OK, 1 row affected (0.00 sec)
      mysql> grant all privileges on epgrec.* to h2@localhost identified by 'パスワード';
      mysql> flush privileges;
      

      ソースを任意の場所に展開します
      自分は「/var/www/epgrec」に展開しました

      % sudo tar zxvfp epgrec-nk201002sp.tar.gz -C /var/www/
      

      epgrecはEPGの定期更新や予約録画にcronとatを使うので,「/etc/at.deny」から「www-data」を削除しておきましょう

      録画データの保存先は別パーティションの「/home」以下にしたいので,リンクを張っておきました

      % sudp mkdir /home/tv
      % sudo chown h2:h2 /home/tv
      % chmod 777 /home/tv
      % cd /var/www/epgrec/
      % ln -s /home/tv tv
      

      あとは,ブラウザでepgrecにアクセスして,指示に従って設定するだけです

      設定が終わると,EPG更新用の設定をcronの設定ディレクトリにコピーして,cronを再起動するように指示されます

      % sudo cp /var/www/epgrec/cron.d/getepg /etc/cron.d/
      % sudo service cron restart
      

epgrecは便利ですが,そのまま外部に公開するのは危険です
認証もないし,MySQLのパスワードも丸見えです

Written by h2 in: PC | タグ: ,
1月
31
2010
2

PT2設定 とりあえず録画まで

昨年末,なんとなくノリで買ってしまったPT2をようやくセットアップしました

一番苦労したのはUbuntu 9.10 (Karmic) x64のインストールですw

Karmicはこれまでデスクトップ,ノート,VMと5台を越える環境でインストールを試みてきたのですが,まともに起動したことがありませんでした

今回も例に漏れず,セットアップ直後からちょっとおかしかったんですが,なんとか無事に起動にこぎ着けました

なのに・・・アップデートするとudevのバグで起動不可能

ググったらLive CDを使った修復法が見つかりましたが,Live CDにはmdモジュールがないので,RAID必須な自分はAlternateしか持ってない(ブランクメディアもない)

方法としては,procとかをマウントして,chrootしてapt-get dist-upgardeするモノだったので,インストーラを途中で止めてやってみたんですが,今度はファイルシステムを認識しなくなりました・・・><

この時点で5時間以上経過・・・
追求するのは面倒なので9.04 (Jaunty) を入れて,アップグレードすることに

結論としてはこれが一番まちがいなく,ラクでした

無事OSが入ったところで,ようやくPT2の設定を開始

ちょうど今月の日経Linuxの特集2が「PT2で地デジ録画システムを作る」だったので,基本は付録DVDに収録されていたものを使いましたが,記事用に改良されたepgrec以外は全てネットでDLできます

  1. B-CAS用カードリーダー
      使用したカードリーダはGemalto PC Twinです
      USBのCCID (Chip/Smart Card Interface Devices) クラス対応なので簡単です

      % sudo apt-get install libccid libpcsclite-dev pcsc-tools
      

      lsusbでカードリーダが認識されているのを確認したら,B-CASをさしてカードが認識されてるか調べましょう

      % pcsc_scan
      PC/SC device scanner
      V 1.4.15 (c) 2001-2009, Ludovic Rousseau <ludovic.rousseau@free.fr>
      Compiled with PC/SC lite version: 1.4.102
      Scanning present readers...
      0: Gemplus GemPC Twin 00 00
      
      Fri Jan 29 07:47:08 2010
       Reader 0: Gemplus GemPC Twin 00 00
        Card state: Card inserted,
      ・・・
           Japanese Chijou Digital B-CAS Card (pay TV)
      
  2. ビルド用環境の準備
      いろいろビルドするので,要りそうなものを入れておきましょう
      カーネルモジュールをビルドするのでヘッダも要ります

      % sudo apt-get install build-essential autoconf automake linux-headers-`uname -r`
      
  3. ARIB STD-B25解除用プログラム
      付録DVDのものを使用しましたが,まるも製作所でもDL出来ます

      % tar zxvf arib25-0.2.4.tar.gz
      % cd arib25-0.2.4/src
      % make
      % sudo make install
      
  4. ドライバと録画ツール
      付録DVDより新しいものがあったので,リポジトリからDLしました
      まずはドライバ

      % tar jxvf tip.tar.bz2
      % cd pt1-ee357d8f987f/driver/
      % make
      % sudo make install
      

      つづいて録画ツール
      記事用に改良されたepgrecを使うにはパッチを当てる必要がありますが,パッチは付録DVDに収録されているバージョン用です
      パッチを見ると分かりますが,ソースファイルを1つ追加して,Makefileに追加したファイル用のエントリを追加しているだけなので,適当に修正しました
      雑誌の付録なので,これ以上詳しく書くのは止めておきます

      % cd ../recpt1/
      % ./autogen.sh
      % ./configure --enable-b25
      % make
      % sudo make install
      

ここまで終わったら,再起動します

再起動後,dmesgを確認しましょう

% dmesg | grep pt1
[    9.879815] pt1-pci.c: r14:0c752a0a1e55 2010-01-25
[   11.487094] pt1_thread run

デバイスファイルも出来ているはずです

% ls- al /dev/*pt1*
crw-rw-rw- 1 root video 251, 0 2010-01-30 01:49 /dev/pt1video0
crw-rw-rw- 1 root video 251, 1 2010-01-30 01:49 /dev/pt1video1
crw-rw-rw- 1 root video 251, 2 2010-01-30 01:49 /dev/pt1video2
crw-rw-rw- 1 root video 251, 3 2010-01-30 01:49 /dev/pt1video3

いよいよ録画です
マスプロのページなどで自分の住んでいる地域の物理チャネルを確認しましょう

とりあえずTVQ (26ch) を30秒録画してみます

% recpt1 --strip --b25 26 30 test.ts

録画したtsファイルはVLCなどで見ることができます

録画だけでなくストリーミングも出来ます
録画時間を「-」にすると無制限録画になります
ポートを指定しない場合はUDP1234が使用されます
/dev/null に捨てずに同時に録画することもできます

% recpt1 --udp --addr 視聴するPCのアドレス --port ポート番号 --strip --b25 26 - /dev/null

自分はMacのVLCで見ていますが,MacのVLCにはバグがあるようです
URLを「udp://録画PC:1234/」としても,メディアリソースロケータの欄を見ると先頭に「http://」が挿入されて「http://udp://録画PC:1234/」にアクセスしようとするので,「http://」を削除する必要があります
ただなぜかこれだけでは再生されず,さらに続けて「udp://」にアクセスすると再生が開始されます

チャンネル変更もできます

% recpt1ctl --pid recpt1のプロセス番号 --channel チャンネル番号

たまたまやっていた24をとってみました
URLが「udp://」になっているのが分かると思います
recpt1

地デジはインターレスなので「インターレス解除」を「破棄」にしましょう

PT2は優秀ですね〜
Atom330+IONのPCですが,Xを起動して,録画+別の番組をストリーミングしても,CPU使用率は1〜2%です

とりあえず今回はここまで

Written by h2 in: PC | タグ: ,
12月
13
2009
0

Zabbixのトリガーを修正

ZabbixのテンプレートTemplate_Linuxには,ApacheやSyslogのデーモンが生きているか監視して,問題があれば障害を報告するトリガーがあります

監視方法には,

  • Zabbixサーバがポートにアクセスしてデーモンの生存を調べる方法
  • Zabbixエージェントがデーモンのプロセスを監視する方法

の2種類があります

今回の対象は,後者のプロセスの監視です

Template_Linuxのトリガーは,Apacheのデーモン名はhttpd,Syslogのデーモン名はsyslogdであることを前提にしています

ですが,ディストリビューションによっては,Apacheのデーモンの名前がapacheやapache2だったりと多少異なりますし,Syslogもsidのようにrsyslogの採用が増えてきました

ということでちょっと変更して修正してやりましょう

ホストにテンプレートをリンクしたままの人も多いと思いますが,自分は最初リンクさせてアイテムやトリガーなどを継承した後,アンリンクして個々のホストに応じてカスタマイズしています

今回の変更もホストにテンプレートをリンクしたまま行う場合は,テンプレート自体を変更する必要があります

変更自体はいたって簡単です

Apacheの場合は次の通り

  1. Itemsから”Number of running processes apache”を選択
  2. Keyを”proc.num[httpd]“→”proc.num[apache2]“などに変更

Syslogの場合も同様です

これでApacheやSyslogが落ちてる時は,「Apache is not running on ・・・」や「Syslogd is not running on ・・・」のような障害が報告されるようになります

プロセス数の監視はデーモンが生きているかはもちろん,負荷などの状態を把握するのにも便利なので,ポートの監視よりオススメです

最近Zabbixネタばっかりですね
しかも内容がどんどん薄くなってるような・・・

Written by h2 in: ネットワーク | タグ: ,
12月
12
2009
3

Zabbix 1.8のグラフの文字化けに対応

前回インストールした Zabbix 1.8なんですが,日本語表示にしたときにグラフの凡例が化けていました
zabbix18-7

自分は別にかまわないのですが,教育用に立てたzabbixなので日本語の方がとっつきやすいかなぁと思って,直してみました

化け方から見て,フォントが日本語の文字のグリフに対応するデータを持ってないのが原因だと思われるので,
とりあえずIPAフォントに変更してみます

環境は前回と同じで,Debian sid x64です

まずはaptでフォントをインストール

$ sudo aptitude install otf-ipafont

次に,zabbixのフロントエンドの中にfontsディレクトリがあるので,そこにIPAフォントのリンクを張ります
拡張子をotfではなくttfにしてリンクを張ってますが,これはzabbixがotfだとフォントを読み込んでくれないためです
IPAフォントはOpenTypeですが,中身はTrueTypeなので問題ないでしょう

$ cd /var/www/zabbix/fonts/
$ sudo ln -s /usr/share/fonts/opentype/ipafont/ipag.otf ipag.ttf

つづいて,zabbixがグラフに使用するフォントを変更

$ sudo vim /var/www/zabbix/include/defines.inc.php
define('ZBX_GRAPH_FONT_NAME', 'DejaVuSans');
→define('ZBX_GRAPH_FONT_NAME', 'ipag');

これで一応日本語表示できます
ただ,どう考えても見難いですよね
英語表示にした時も見づらい・・・
zabbix18-9 zabbix18-10

ということでIPAはやめて,お気に入りのmeiryoKeConsoleにしました
zabbix18-11 zabbix18-12

大分見やすくなったんではないでしょうか?
みなさんも好きなフォントで試してみてください

本当は表示言語毎にフォントを変えるようにした方がいいのかも知れませんが,実運用はやっぱり英語の方がよさそうだし,面倒なのでこれで妥協します

Written by h2 in: ネットワーク | タグ: ,
12月
09
2009
1

早速Zabbix 1.8を入れてみた

今日(といっても昨日ですが),予想より早くZabbix 1.8が出たので早速入れてみました

以下,簡単な手順メモ

環境はDebian sid x64です
apacheとphp5は入ってるものとします

基本的な流れはインストールマニュアルに従ってます

  1. zabbix用のユーザの作成
    一般ユーザとUID, GIDを区別できるようにしたいので,適当な値を調べて指定します
    ログインとかはしないのでその辺はセオリー通り

    $ sudo groupadd -g 107 zabbix
    $ sudo useradd -u 105 -g zabbix -d /dev/null -s /bin/false zabbix
    
  2. ソースのDLと展開
    $ wget http://prdownloads.sourceforge.net/zabbix/zabbix-1.8.tar.gz
    $ tar zxvf zabbix-1.8.tar.gz
    
  3. DBの設定
    まず,zabbix用のDBとユーザを作成します

    mysql> create database zabbix character set utf8;
    mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'パスワード';
    mysql> flush privileges;
    mysql> quit;
    

    続いて,作成したDBにSQLファイルを読み込みます

    $ cat zabbix-1.8/create/schema/mysql.sql| mysql -u zabbix -p zabbix
    $ cat zabbix-1.8/create/data/data.sql | mysql -u zabbix -p zabbix
    $ cat zabbix-1.8/create/data/images_mysql.sql | mysql -u zabbix -p zabbix
    
  4. ビルド
    proxyは使わないので,serverとagentをビルドします
    DBMSはMySQL,NET-SNMPとIPMIも使うのでオプションを次のようになります
    Jabberもおもしろそうなので使ってみます

    build-essentialしか入っていない場合は,libmysqlclient-dev, libcurl-dev (=libcurl4-openssl-dev), libsnmp-dev, libiksemel-dev, libopenipmi-devあたりが必要になるでしょう

    ただ,(うちだけ?)configureスクリプトが不安定なので注意が必要です
    libiksemel-devを入れても

    checking for IKSEMEL... configure: error: Jabber library not found
    

    といわれるので,–with-jabber=/usr/lib とするとなぜか通るようになります(configureはいったいどこ探してるんでしょうかね?)
    さらに不思議なのは,その後–with-jabberに戻しても通るようになってることです
    あと–with-openipmiを指定してもIPMIがnoになるのですが,同じオプションで30回くらい繰り返すとOpenIPMIになりました
    意味不明です・・・

    PCがおかしい?
    いやいや,VMだしOSインストール直後なんですけど・・・

    そういえば,1.6の頃も–enable-agentが効いてないことがあったなぁ

    ともあれ,configureオプションは次の通り
    なんかバギーなので実行後,最後に表示される設定一覧で指定した通りになってるか確認しましょう

    $ cd zabbix-1.8
    ./configure --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-openipmi --with-jabber
    ・・・
    Configuration:
    
      Detected OS:           linux-gnu
      Install path:          /usr/local
      Compilation arch:      linux
    
      Compiler:              gcc
      Compiler flags:        -g -O2   -I/usr/include/mysql  -DBIG_JOINS=1    -DUNIV_LINUX -DUNIV_LINUX     -I/usr/local/include -I/usr/lib/perl/5.10/CORE -I. -I/usr/include     -I/usr/include
    
      Enable server:         yes
      With database:         MySQL
      WEB Monitoring via:    cURL
      Native Jabber:         yes
      SNMP:                  net-snmp
      IPMI:                  openipmi
      Linker flags:             -L/usr/lib -lOpenIPMI -lOpenIPMIposix     -L/usr/lib/mysql  -liksemel    -lcurl  -L/usr/lib -lnetsnmp -lcrypto  -L/usr/lib -lnetsnmp -lcrypto
      Libraries:             -lm -lresolv      -lmysqlclient   -liksemel -lcurl  -lnetsnmp 
    
      Enable proxy:          no
    
      Enable agent:          yes
      Linker flags:             -L/usr/lib -lOpenIPMI -lOpenIPMIposix
      Libraries:             -lm -lresolv 
    
      LDAP support:          no
      IPv6 support:          no
    ・・・
    $ sudo make install
    
  5. ポート名の登録
    管理対象のマシンの/etc/servicesにエントリを追加

    zabbix_agent    10050/tcp
    zabbix_trap     10051/tcp
    
  6. サーバの設定
    サンプルをコピーして編集します
    1.8では項目の説明が分かりやすくなってます

    $ sudo mkdir /etc/zabbix
    $ sudo cp misc/conf/zabbix_server.conf /etc/zabbix/
    $ sudo vim /etc/zabbix/zabbix_server.conf
    

    変更箇所のみ

    LogFile=/var/log/zabbix/zabbix_server.log
    PidFile=/var/run/zabbix/zabbix_server.pid
    DBUser=zabbix
    DBPassword=パスワード
    FpingLocation=/usr/bin/fping
    
  7. エージェントの設定
    サンプルをコピーして編集します

    $ sudo cp misc/conf/zabbix_agentd.conf /etc/zabbix/
    $ sudo vim /etc/zabbix/zabbix_agentd.conf
    

    変更箇所のみ

    PidFile=/var/run/zabbix/zabbix_agentd.pid
    LogFile=/var/log/zabbix/zabbix_agentd.log
    Hostname=ホスト名(アクティブチェックを利用する際はサーバの設定と要統一)
    
  8. PIDファイルとログファイル用のディレクトリを作成
    $ sudo mkdir /var/run/zabbix
    $ sudo mkdir /var/log/zabbix
    $ sudo chown zabbix:zabbix /var/run/zabbix
    $ sudo chown zabbix:zabbix /var/log/zabbix
    
  9. 起動スクリプトを作成
    まず,サーバ

    $ sudo cp misc/init.d/debian/zabbix-server /etc/init.d/
    $ sudo vim /etc/init.d/zabbix-server
    

    変更箇所のみ

    DAEMON=/usr/local/sbin/${NAME}
    PID=/var/run/zabbix/$NAME.pid
    

    続いて,エージェント

    $ sudo cp misc/init.d/debian/zabbix-agent /etc/init.d/
    $ sudo vim /etc/init.d/zabbix-agent
    

    変更箇所のみ

    DAEMON=/usr/local/sbin/${NAME}
    PID=/var/run/zabbix/$NAME.pid
    

    起動時に自動で起動するように設定します

    $ sudo update-rc.d zabbix-server defaults
    update-rc.d: using dependency based boot sequencing
    insserv: warning: script 'zabbix-server' missing LSB tags and overrides
    insserv: warning: script 'zabbix-agent' missing LSB tags and overrides
    
    $ sudo update-rc.d zabbix-agent defaults
    update-rc.d: using dependency based boot sequencing
    insserv: warning: script 'K01zabbix-server' missing LSB tags and overrides
    insserv: warning: script 'zabbix-agent' missing LSB tags and overrides
    insserv: warning: script 'zabbix-server' missing LSB tags and overrides
    

    LSB(Linux Standard Base)タグがないと警告がでます
    起動順序に依存関係がある場合うまくいかないこともあるので,適当にLSBタグを書いておきましょう

    一度リンクを消します

    $ sudo update-rc.d -f zabbix-server remove
    $ sudo update-rc.d -f zabbix-agent remove
    

    起動・終了スクリプトにタグを追加します
    serverがagentより先に起動し,後で終了するように指定します

    $ sudo vim /etc/init.d/zabbix-server
    ### BEGIN INIT INFO
    # Provides: zabbix-server
    # Required-Start: $network mysql
    # Required-Stop:
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: Zabbix Server start/stop script
    # Description: Start and stop Zabbix Server daemon
    ### END INIT INFO
    
    $ sudo vim /etc/init.d/zabbix-agent
    ### BEGIN INIT INFO
    # Provides: zabbix-agent
    # Required-Start: $network mysql zabbix-server
    # Required-Stop: zabbix-server
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: Zabbix Agent start/stop script
    # Description: Start and stop Zabbix Agent daemon
    ### END INIT INFO
    

    もう一度update-rc.dを実行

    $ sudo update-rc.d zabbix-server defaults
    $ sudo update-rc.d zabbix-agent defaults
    
  10. Webフロントエンドのコピー
    $ sudo mkdir /var/www/zabbix
    $ sudo cp -a frontends/php/* /var/www/zabbix/
    $ sudo chown -R root:root /var/www/zabbix
    
  11. デーモンの起動
    $ sudo /etc/init.d/zabbix-agent start
    $ sudo /etc/init.d/zabbix-server start
    
  12. フロントエンドの設定
    ブラウザでフロントエンドにアクセスすると,タイムゾーンが設定されていないといわれたので設定

    $ sudo vim /etc/php5/apache2/php.ini
    date.timezone = Asia/Tokyo
    $ sudo /etc/init.d/apache2 restart
    

    zabbix18-1

    いろいろチェック項目にエラーがあるので設定を変更します

    $ sudo vim /etc/php5/apache2/php.ini
    post_max_size = 16M
    max_execution_time = 300
    mbstring.func_overload = 2
    $ sudo aptitude install php5-mysql php5-gd
    $ sudo /etc/init.d/apache2 restart
    

    zabbix18-2

    続いて,DBの設定です
    zabbix18-3 zabbix18-4

    あとは,今設定した内容の設定ファイルをDLして設置するだけ
    zabbix18-5

    ログイン画面です
    デフォルトのIDはadmin, パスワードはzabbixです
    すぐログインして変更しましょう
    zabbix18-6

    ちらっと使ってみた感じですが,細かいところがいろいろ修正されていて使い勝手が向上しています
    Zabbixエージェントに加えてSNMPやIPMIを利用しているので,各ホストが何で監視されているのか把握しやすくなったのがうれしいです

    ためしに表示言語を日本語にするとグラフが化けますね〜
    化けるのはグラフだけなので,設定の問題ではなさそうな気がします
    どうせ英語で使うので大した問題ではないです
    zabbix18-7 zabbix18-8

Written by h2 in: ネットワーク | タグ: ,
12月
04
2009
0

ルータのsyslogをログサーバに転送する

ルータなどのネットワーク機器は大量のログを保管できないが,その代わり大抵のルータはsyslogサーバにログを転送することができる

今回ログサーバに採用したのはDebian lenny
インストール直後はほとんど何も入ってなくて軽いのが決め手

他にもUnix系のOSなら大抵syslogサーバを使っている
Windowsにはsyslogサーバは入ってないけど,ちょっとしたテストなんかにはGST Syslog Serverが便利

lennyはsyslogではなくrsyslogを採用している

直接 /etc/rsyslog.conf を編集してもいいけど,お作法に従って /etc/rsyslog.d 以下にファイルを置いて読み込ませる

ファシリティはlocal0とします

設定ファイルの名前は *.conf であれば何でもOK
今回はYAMAHA RTX1200のログなので /etc/rsyslog.d/rtx1200.conf にしました
ログファイルの名前もお好きに

$ModLoad imudp
$UDPServerRun 514
local0.* /var/log/rtx1200.log

ファイアウォールがある場合は UDP 514番ポートを開けておきましょう

rsyslogを再起動します

$ sudo /etc/init.d/rsyslog restart

ついでにローテーションの設定もしておきます
/etc/logrotate.d/rsyslog に 先ほど指定したログファイルを追加するだけでOK
logrotateはデーモンではないので,cronからlogrotateが実行される際に変更したファイルも読み込まれます

大量にログが転送されてくるとか,シビアなコンディションの場合はlogrotateを使わずにrsyslogのログローテーション機能を使った方が確実でしょう

あとは,ルータの設定です

ログレベルはnoticeとします
YAMAHAならこんな感じ

# syslog host 鯖のアドレス
# syslog facility 16
# syslog notice on

Ciscoならこんな感じかな

# logging 鯖のアドレス
# logging facility local0
# logging trap 5

当たり前ですが,ntpとかでルータと鯖の時間併せておきましょう

Written by h2 in: ネットワーク | タグ: , ,
11月
02
2009
0

MBRのおさらい

先日お亡くなりになったMacBookのHDD
データがなくなったのは仕方ないが,なんとか活用できないものか?

Intel Macは既にEFIを利用していて,パーティションテーブルにはGPTを採用している
そして,WikipediaによるとGPTはディスクの後方にもGPTヘッダーとパーティションテーブルを備えているらしい

互換性を保つためGPTではLBA0にMBRが存在するらしく,ディスク全体がひとつのパーティションであるように見えるらしいが,問題のHDDのLBA0には欠損があるようで読み取れなかった

ということで,このHDDを利用して,勉強がてらパーティション情報を復活させてみようと思う

その前に確認の意味も込めてMBRのおさらいをしてみる

実験台にされたのはUbuntu 9.04 (64bit) メインのLinuxマシン
こいつはソフトウェアRAIDを組んでるマシンだが今回は片方のディスクを対象にする

このディスクの情報は下記の通り

% sudo sfdisk -l /dev/sda

ディスク /dev/sda: シリンダ数 60801、ヘッド数 255、63 セクタ/トラック
ユニット = 8225280 バイトのシリンダ、1024 バイトのブロック、0 から数えます

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sda1   *      0+      7       8-     64228+  fd  Linux raid 自動検出
/dev/sda2          8    1831    1824   14651280   fd  Linux raid 自動検出
/dev/sda3       1832   56783   54952  441401940    5  拡張領域
/dev/sda4          0       -       0          0    0  空
/dev/sda5       1832+  56540   54709- 439450011   fd  Linux raid 自動検出
/dev/sda6      56541+  56783     243-   1951866   82  Linux スワップ / Solaris

まず,MBRを取り出してやる
MBRはHDDのCHSだとC:0 H:0 S:1,LBAだと0から512バイトの領域なので

% sudo dd if=/dev/sda of=mbr bs=512 count=1

取り出したMBRをダンプしてやる
zオプションを使ってることから明らかなように作業はLinuxでやってます

$ od -tx1z -Ax mbr
・・・
0001b0 00 00 00 00 00 00 00 00 18 cd 01 00 00 00 80 01  >................<
0001c0 01 00 fd fe 3f 07 3f 00 00 00 c9 f5 01 00 00 00  >....?.?.........<
0001d0 01 08 fd fe ff ff 08 f6 01 00 20 1f bf 01 00 fe  >.......... .....<
0001e0 ff ff 05 fe ff ff 28 15 c1 01 a8 84 9e 34 00 00  >......(......4..<
0001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa  >..............U.<
000200

MBRの大半はIPLで占められていて,先頭から446バイト後方にパーティションテーブルが,さらに64バイト後方に2バイトのシグネチャ (0xAA55) がある

ダンプ結果を見ると確かにシグネチャ 0xAA55が確認できる
(リトルエンディアンな点に注意)

0×0001b8-0×0001bbの4バイトには,ディスクIDも確認できる

ダンプデータから,パーティションテーブルの情報を抜き出して見る
パーティションテーブルには4つのエントリがあり,各エントリの構成は先頭から順に,次のようになっている

  • ブートフラグ (8bits)
  • 開始位置 (CHS) (24bits)
  • パーティションタイプ (8bits)
  • 終了位置 (CHS) (24bits)
  • 開始位置 (LBA) (32bits)
  • セクタ数 (LBA) (32bits)

また,CHS形式の値は先頭から順に,次のようになっている

  • Head (8bits)
  • Cylinder上位 (2bits)
  • Sector (6bits)
  • Cylinder下位 (8bits)

従ってパーティションの情報は次の通り

Partition Boot Flag Partition Type Start (CHS) End (CHS) Start (LBA) Sector Counts
1 80h FDh C:0 H:1 S:1 C:7 H:254 S:63 63 128457
2 0h FDh C:8 H:0 S:1 C:1023 H:254 S:63 128520 29302560
3 0h 05h C:1023 H:254 S:63 C:1023 H:254 S:63 29431080 882803880
4 0h 0h C:0 H:0 S:0 C:0 H:0 S:0 0 0

基本パーティションと拡張パーティションをあわせて3つしかないので4番目のエントリは0で埋められている

ブートフラグを見ると第1パーティションにブート可能を示す80hが格納されており,他のパーティションには0hが格納されている

BIOSによってMBRが0×7C00にロードされると,IPLはブートフラグが80hになっているパーティションを探す

古いBIOSでは,パーティションテーブルの先頭から順に1バイトずつ,DL, DH, CL, CHレジスタに格納される
つまり,DLレジスタでこの80hをドライブナンバー,DHでヘッド数,CHでシリンダ数の下位8ビット,CLの第7-8ビットでシリンダ数の上位2ビットを指定してINT 13hをコールすることで,パーティションテーブルのブートレコードが読み込まれる

拡張INT 13hでは,CHSではなくLBAを利用する

ちなみに,GRUBなどはIPLを書き換えて独自のブートプロセスをとるため,この限りではない

CHS方式では1024個のシリンダしか扱えないので,最近の大容量のHDDではCHSによるジオメトリではなくリニアなLBAを使用するが,CHSのエントリとしては1023/254/63が格納されている

sfdiskの結果をみると,H:254 S:63は固定で,シリンダの値としてディスク容量から算出された1024より大きな値が表示されている

パーティションはシリンダの境界から始めるのがルールだが,第1パーティションだけは例外でMBRの次のヘッダである C:0 H:1 S:1から始まる

LBAの開始アドレスとそのパーティションのセクタ数を足してみると,次のパーティションの開始アドレスになっており,リニアにアドレスが振られていることが分かる

パーティションタイプは,FDhがLinuxのソフトウェアRAID,05hが拡張領域.他にもNTFSなら0×07とかになる

続いて,CHSとLBAの変換方法はHDDの基本的な構造から考えれば自明

CHS->LBA
 LBA = C * 1トラックのセクタ数 * ヘッド数 + H * 1トラックのセクタ数 + S – 1
    = (C * ヘッド数 + H) * 1トラックのセクタ数 + S – 1
LBA->CHS
 C = LBA / 1トラックのセクタ数 / ヘッド数
 H = (LBA / 1トラックのセクタ数) % ヘッド数
 S = LBA % 1トラックのセクタ数 + 1

計算してみると分かるが,LBAから算出した値はsfdiskの表示する1024を超えたシリンダ番号と一致する

Written by h2 in: PC | タグ: ,

TheBuckmaker WordPress Themes Webhosting, MP3, AAC & Co