2014年12月13日土曜日

centos6.5にcactiを入れてみる

cactiの設定をいじる必要が出てきたので、勉強がてら構築してみる。

■環境は以下の通り
 ・Cactiサーバー
   OS:CentOS 6.5 on vagrant(Windows8.1)
   Cacti:0.8.8c
   host:cacti1
   IP:192.168.0.76

 ・監視対象
   OS:Windows2012 R2
   監視方式はsnmp
   host:w2k12
   ip:192.168.0.70


1.cactiのインストール
1.1 必要パッケージのインストール
$ yum install -y httpd php php-mysql php-snmp php-xml mysql mysql-server net-snmp rrdtool
1.2 phpの設定
#外部コマンドを実行するためsafe_modeをOFFにする
safe_mode = Off

#タイムゾーンを合わせる
date.timezone = "Asia/Tokyo"

#TemplateがImportできるようにする
file_uploads = On

#インストール手順にはずしたほうがよいと・・
;session.save_path = "/var/lib/php/session"
1.3 Apacheの設定
#以下の設定になっていることを確認する

LoadModule php5_module modules/libphp5.so

AddHandler php5-script .php
AddType text/html .php

DirectoryIndex index.php

# Cacti - the complete rrdtool-based graphing solution
#
# Allows only localhost by default
#
# Allowing cacti to anyone other than localhost should be considered
# dangerous unless properly secured by SSL

# Make sure, that httpd can read your cacti directories.
# At minimum, you need
#    chmod ugo+r -R /your/cacti/dir
# Make sure to replace with your directories

# When using SELinux, set the following:
#    chcon -R -h -t httpd_sys_content_t /your/cacti/dir
# when using SELinux and you private homedir, enable
#    setsebool -P httpd_enable_homedirs 1
#    setsebool -P httpd_read_user_content 1

Alias /cacti /var/www/html/cacti

   AllowOverride None
   Order Deny,Allow
   Deny from all
   Allow from 127.0.0.1
   Allow from 192.168.0.0/24
   Allow from ::1
   Options Indexes Includes FollowSymLinks

# These directories do not require access over HTTP
#

    Order Deny,Allow
    Deny from All
    Allow from None


1.4 MySQLの設定
$ sudo service mysqld start
$ sudo chkconfig mysqld on
$ /usr/bin/mysqladmin -u root password 'new-password'
$ /usr/bin/mysqladmin -u root -h cacti1.hayachi617.jp password 'new-password'
$ sudo /usr/bin/mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] n
 ... skipping.

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

$ mysqladmin --user=root --password reload
Enter password:

1.5 snmpの設定
snmp-netで構築してみる(spiderは別途)
$ yum install -y net-snmp net-snmp-libs net-snmp-utils
以下の設定を追加
rocommunity public
$ sudo service snmpd start

#稼働確認

$ snmpwalk -v 1 -c public localhost .1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux cacti1.hayachi617.jp 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64
1.6 cactiの設定
まずはモジュールの入手
$ cd /var/www/html/
$ sudo wget http://www.cacti.net/downloads/cacti-0.8.8c.tar.gz
$ sudo tar xvfz cacti-0.8.8c.tar.gz
つぎにMySQLへの設定です。
$ cd cacti-0.8.8c
$ mysql cacti --user=root -p < cacti.sql
$ mysql --user=root mysql -p

mysql> GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'cactiuser';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

$ sudo useradd cactiuser
$ sudo chown -R cactiuser rra/ log/
$ sudo chmod ugo+r -R /var/www/html/cacti
$ sudo su - cactiuser 
$ crontab -e 

*/5 * * * * /usr/bin/php /var/www/html/cacti/poller.php > /dev/null 2>&1

$ sudo cd ..
$ sudo ln -s cacti-0.8.8c /var/www/html/cacti
$ sudo chkconfig httpd on
$ sudo chkconfig snmpd on
$ sudo service httpd start

ここで、端末からブラウザでアクセスしてみる http://192.168.0.76/cacti




最後にパッチが出ていれば適用する http://www.cacti.net/download_patches.php 今時点では出ていませんでした(14/12/13) 2.Windowsサーバーのセットアップ

2014年11月24日月曜日

ActiveDirectory+CentOS + sambaで認証

ActiveDirectory+CentOS + sambaの環境を作って、AD上のセキュリティグループでアクセス制限をかける 環境を作ろうとしたが、ちょっと苦戦したので、まとめて記載。

構築した環境は以下の通り

 ◆ADサーバー
  ・OS:Windows2012
  ・ドメイン名:net.hayachi617.jp
  ・IP:192.168.0.70

 ◆メンバーサーバー
  ・OS:CentOS 6.5
  ・hostname:centos1
  ・samba:3.6.23-12.el6
  ・IP:192.168.0.72

ADの環境とメンバーサーバーのOSまでは構築済みとして、samba環境を構築するところから(認証目的)
※conf関連は必要な箇所だけ抜粋して記載。

1.samba環境の準備

 DNSとNTPがADに向いていることを確認する。
search net.hayachi617.jp
nameserver 192.168.0.70

server 192.168.0.70

2.sambaの環境構築

 次にsambaのインストール。

$ sudo  yum install samba -y
 続いてsambaの設定。
        workgroup = NET
        security = ads
        realm = NET.HAYACHI617.JP
        password server = *
        winbind use default domain = yes
        winbind offline logon = true
        template shell = /bin/bash
        template homedir = /home/%U
        idmap uid = 10000-11000
        idmap gid = 10000-11000

;       security = user
設定変更できたら、反映し、ドメインに参加する!
$ sudo authconfig --enablewinbind --update
Starting Winbind services:                                 [  OK  ]
$ suodo authconfig --krb5kdc=* --krb5realm=DDP.DENTSU.JP --update
Starting Winbind services:                                 [  OK  ]
$ sudo authconfig --enablewinbindauth --update
Starting Winbind services:                                 [  OK  ]

$ sudo net ads join -U test # DomainのAccount Operators以上の権限を持つアカウントを指定

Enter test's password:
Using short domain name -- NET
Joined 'CENTOS1' to dns domain 'net.hayachi617.jp'

$ sudo service winbind restart
$ wbinfo -u

administrator
guest
krbtgt
test
 
ということで、AD上のアカウント一覧が表示できればOK。実際にtestユーザーでログインしてみる
 あとはアクセスできるユーザーをグループで制限する。ここを参照。system-authで変更をかけていたが、sudoやsuでは制限がかかるが、sshではログインができてしまった。pam_winbind.confに設定してみたところ、無事反映された。

あとrootからのsuによる切り替えでは、ログインができてしまう(まぁsuになれないので大きな問題ではないと思うが。。)

2014年9月25日木曜日

CentOS+samba+ActiveDirectory環境でアクセス制限をかける

備忘録。 Wjndows2008のActiveDirectory配下に、CentOS + sambaを使ってドメイン参加し、認証の一元化を行っている環境で、AD上のすべてのユーザーがアクセスできてしまわないように制限ををかける。

 方法1./etc/security/pam_winbind.confで制御
・
・
[global]
require_membership_of=xxx,yyy,zzz
・
・

方法2./etc/pam.d/system-authで制御
・
・
[global]
 account   required        pam_winbind.so  use_first_pass require_membership_of=xxx,yyy,zzz
・
・

いずれにしても、ポイントは
・カンマ区切りで並べるという点
・xxx,yyy,zzzは、名称でもSIDでもOK
というところ。

(2014/11/24)方法2だとsuやsudoの時には有効なのですが、sshでログインするときに有効にならない(ログインできてしまう)。方法1打と効いた。

2014年9月23日火曜日

jqでjsonを扱う

json形式のデータを簡単に扱うためのコマンド「jq」。
Linux版はもちろん、Windows版もあり重宝する。CentOSをベースに備忘録で記載しておく。


# モジュールを入手

$ wget http://stedolan.github.io/jq/download/linux64/jq
$ chmod a+x jq
$ sudo mv jq /usr/local/bin
$ jq

jq - commandline JSON processor [version 1.4]
Usage: ./jq [options]  [file...]

For a description of the command line options and
how to write jq filters (and why you might want to)
see the jq manpage, or the online documentation at
http://stedolan.github.com/jq
次に使い方。たとえば路線/駅名データ等の地理情報をAPIで提供してれるHeartRails Expressというサービスがあるので、そこから皇居付近の駅を検索し、得られたjsonデータを見てみる。
※緯度・経度はGoogleマップで検索

# まずはjqなしで見てみる。

$ curl "http://express.heartrails.com/api/json?method=getStations&x=139.752249&y=35.683782"

{"response":{"station":[{"x":139.751813,"next":"有楽町","prev":"永田町","distance":"710m","y":35.677443,"line":"東京メトロ有楽町線","postal":"1000013","name":"桜田門","prefecture":"東京都"},{"x":139.757667,"next":"大手町","prev":"九段下","distance":"890m","y":35.690442,"line":"東京メトロ東西線","postal":"1000003","name":"竹橋","prefecture":"東京都"},{"x":139.76178,"next":"日比谷","prev":"大手町","distance":"940m","y":35.6805,"line":"東京メトロ千代田線","postal":"1000005","name":"二重橋前","prefecture":"東京都"}]}}
|jq ".response"

# 何ともみづらいので、整形。

$ curl "http://express.heartrails.com/api/json?method=getStations&x=139.752249&y=35.683782" | jq "."

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
116   582  116   582    0     0    112      0  0:00:05  0:00:05 --:--:--  9238
{
  "response": {
    "station": [
      {
        "x": 139.751813,
        "next": "有楽町",
        "prev": "永田町",
        "distance": "710m",
        "y": 35.677443,
        "line": "東京メトロ有楽町線",
        "postal": "1000013",
        "name": "桜田門",
        "prefecture": "東京都"
      },
      {
        "x": 139.757667,
        "next": "大手町",
        "prev": "九段下",
        "distance": "890m",
        "y": 35.690442,
        "line": "東京メトロ東西線",
        "postal": "1000003",
        "name": "竹橋",
        "prefecture": "東京都"
      },
      {
        "x": 139.76178,
        "next": "日比谷",
        "prev": "大手町",
        "distance": "940m",
        "y": 35.6805,
        "line": "東京メトロ千代田線",
        "postal": "1000005",
        "name": "二重橋前",
        "prefecture": "東京都"
      }
    ]
  }
}
見やすくなりましたね。いろいろとフィルタや関数機能もあるみたいなので、触ってみると面白そうです。

2014年9月15日月曜日

rpm-buildの環境を作る

rpmを作成するための環境構築をメモで残しておく。 まずはインストール。
$ sudo yum install rpmdevtools
次にbuildするユーザに切り替えて、環境を作る。
$ su - hayashi

##build用ディレクトリと、マクロが作成される

$ rpmdev-setuptree
$ ls
rpmbuild

##マクロを修正する

$ vi ~/.rpmmacros
%_topdir      %(echo $HOME)/rpmbuild
%_smp_mflags  -j3
%__arch_install_post   /usr/lib/rpm/check-rpaths   /usr/lib/rpm/check-buildroot

# 追加
%_sourcedir %{_topdir}/SOURCES/%{name}-%{version}-%{release}.src
これで準備完了。追加した箇所はパッケージ、バージョンごとにソースを配置して作成できるための設定。
試しに、ソースパッケージ(haproxy-1.5.3.tar.gz)を入手してrpmを作ってみる。

$ ls /tmp/haproxy/haproxy-1.5.3.tar.gz
$ mkdir ~/rpmbuild/SOURCES/haproxy-1.5.3-1.src
$ cp /tmp/haproxy/haproxy-1.5.3.tar.gz ~/rpmbuild/SOURCES/haproxy-1.5.3-1.src/
$ cd ~/rpmbuild/SOURCES/haproxy-1.5.3-1.src/
specファイルを修正する場合は、rpmdev-extractを使うと展開する際に便利(rpmでもtarballでも対応)
$ rpmdev-extract haproxy-1.5.3.tar.gz
$ cp haproxy-1.5.3/examples/haproxy.spec ~/rpmbuild/SPECS/
$ rpmbuild -bb ~/rpmbuild/SPECS/haproxy.spec
$ ls -R  ~/rpmbuild/RPMS
.:
x86_64

./x86_64:
haproxy-1.5.3-1.x86_64.rpm

$
出来上がり。またspecファイルを修正しない場合は、
$ rpmbuild -tb ~/rpmbuild/SOURCES/haproxy-1.5.3-1.src/haproxy-1.5.3.tar.gz
$
でいけますね。

WordPress3.9.1 + CentOS6.4 を構築してみる(その0)

今後WordPressを使うかもしれない。いまどきAWSとかAzureではイメージを展開するだけで
使えてしまうご時世だが、それだと面白くないし、最新バージョンが使えるようしたほうがよいと
思い立ち、いちから自前で作ってみる(スキルアップ)。

 ・Apache or nginx
  WordPressのサイトに、nginxよりはapacheを推奨するとの記載があったのでapache
  にしてみる。実際にplug-inによっては、nginxで使うにあたり修正をする必要がある
  ケースもありそうだった。今後、脆弱性対応でVerUPも必要そうだし、なるべく推奨
  がよさそう。最後にnginxにしてみても面白いかも。
 
 ・各コンポーネントのバージョン 
  安定版レベルで最新版を使う(ベータ版は避ける)。
  CentOS 6.4 (x64_64)  ※ちょっと古い・・
  WordPress 3.9.1
   Apache 2.4.9 + fastcgi
  PHP 5.5.12 + PHP-frm
  MySQL 5.6.19

 ・WordPressのPlug-in
   バックアップ
   セキュリティ
   冗長化
   パフォーマンス改善
  に関するものを、使ってみる。

 ・可用性
  各コンポーネント(Web/DB)も冗長化をしてみる。

このあたりをやってみたいと思う。進め方としては、

 1.1台のOS上にすべてを入れてみる(シングル構成)
 2.冗長化をしてみる
 3.Plug-inを入れてみる
 4.バージョンアップをしてみる

とする。また構築するにあたり、今度の配布などを考えて、各コンポーネントをrpm化しインストールする。
長くなるので別の記事で残す。
 

2014年9月13日土曜日

マルチドメインSSL処理をhaproxy 1.5 + keepalivedで組む

負荷分散で、マルチドメインSSL処理を組める構成を検討することがあったので、
 haproxy1.5 + keepalived
をやってみる。環境は以下の通り

 ・OSは2台(keeplived + haproxy + Webサーバー)
 ・
 ・haproxyはポート443でリスンする
 ・ドメインは、「host1.hayachi617.jp」と「host2.hayachi617.jp」の2つとする。
 ・webサーバーは8080でリスンする
 ・webサーバーのヘルスチェックは、hc.htmlとする
 ・「host1.hayachi617.jp」は、Active-Standbyの構成  ・「host2.hayachi617.jp」は、負荷分散(ラウンドロビン)でSessionStickyとする。


1.haproxy1.5のインストール

 rpmがないので、ソースからビルドする。rpm-build環境はここで作成したものを使う。
$ sudo yum install pcre-devel openssl-devel
$ mkdir ~/rpmbuild
$ cd ~/rpmbuild/SOURCES/
$ wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.3.tar.gz
$ rpmdev-extract haproxy-1.5.3.tar.gz
$ cp -p haproxy-1.5.3/examples/haproxy.spec ../SPECS/haproxy153.spec

 SSLを使えるように修正する
$ vi ../SPECS/haproxy153.spec

(元)
 %{__make} USE_PCRE=1 DEBUG="" ARCH=%{_target_cpu} TARGET=linux26
(新)
 %{__make} USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 DEBUG="" ARCH=%{_target_cpu} TARGET=linux26

$ mv haproxy-1.5.3.tar.gz ./haproxy-1.5.3-1.src/
$ rpmbuild -bb ./SPECS/haproxy153.spec
出来上がり!でアカウント作って、インストールする
$ useradd haproxy
$ sudo rpm -ivh ./RPMS/x86_64/haproxy-1.5.3-1.x86_64.rpm
$ haproxy -vv

Copyright 2000-2014 Willy Tarreau  <w@1wt.eu>

Build options :
  TARGET  = linux26
  CPU     = generic
  CC      = gcc
  CFLAGS  = -m64 -march=x86-64 -O2 -g -fno-strict-aliasing
  OPTIONS = USE_ZLIB=1 USE_OPENSSL=1 USE_PCRE=1

Default settings :
  maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200

Encrypted password support via crypt(3): yes
Built with zlib version : 1.2.3
Compression algorithms supported : identity, deflate, gzip
Built with OpenSSL version : OpenSSL 1.0.1e-fips 11 Feb 2013
Running on OpenSSL version : OpenSSL 1.0.1e-fips 11 Feb 2013
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
Built with PCRE version : 7.8 2008-09-05
PCRE library supports JIT : no (USE_PCRE_JIT not set)
Built with transparent proxy support using: IP_TRANSPARENT IP_FREEBIND

Available polling systems :
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 3 (3 usable), will use epoll.

OpenSSLも有効になっているようです。インストール完了。

2.haproxyの設定

 haproxyの設定をする。
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # ログの出力(level:debug)
    log         127.0.0.1 local6 debug
 
    # pidファイルのパス
    pidfile     /var/run/haproxy.pid
 
    # 1プロセスに対する最大接続数
    maxconn     4096

    #SSL鍵長
    tune.ssl.default-dh-param 2048

    # 実行ユーザとグループ
    user        haproxy
    group       haproxy
 
    # 起動プロセスはバックグラウンドで動作します
    daemon
 
    # 起動するプロセス数(ログの解析が難しくなるため1つが推奨とのこと)
    nbproc 1
  
    # プロセスごとの最大ファイルディスクリプタを設定。書かなくても自動で設定されるらしい
    #ulimit-n 12000
 
    # 統計情報(*1)
    stats socket /var/run/haproxy/stats.socket user haproxy group haproxy level admin

    # 統計情報:アイドル時のタイムアウト(デフォルト10秒)
    stats timeout 60s

    # 統計情報:最大接続数
    stats maxconn 5

#---------------------------------------------------------------------
# デフォルト設定
#---------------------------------------------------------------------
defaults
    # L7⇒http、L4⇒TCP。L4のほうが性能がよい
    mode        http 
 
    # ログの設定。globalセクションでの設定が引き継ぐ
    log         global
 
    # NULLなコネクション(監視用アクセス)のログを書き出さない設定
    option      dontlognull
 
    # ヘルスチェックのログを書き出す。
    option      log-health-checks
 
    # backendサーバに接続できない時のタイムアウト値(ミリ秒:デフォルト10000msec)
    timeout connect 10000

    # クライアントサイドでのタイムアウト数。"timeout server"と同じ値が推奨。
    timeout client  30000

    # サーバサイドのタイムアウト秒数
    timeout server  30000
 
    # 接続に失敗した際のリトライ回数
    retries     3

#---------------------------------------------------------------------
# 統計情報のWeb参照用の設定。8088ポートで受ける(*2)
#---------------------------------------------------------------------
listen hastats *:8088
    mode http
    maxconn 64
    timeout connect 5000
    timeout client  10000
    timeout server  10000

    stats enable
    stats show-legends

    #statsページのパス
    stats uri /haproxy?hastats

    #statsページに認証を設定
    stats auth testid:testpass

#---------------------------------------------------------------------
# 1.複数 SSL 処理
#---------------------------------------------------------------------
frontend  ssl
    #証明書を複数指定する(*3)
    bind *:443 ssl crt /vagrant/web1.cer crt /vagrant/web1.cer

    #X-Forwarded-Host ヘッダーを追加する
    http-request set-header X-Forwarded-Host %[req.hdr(host)]

    # X-Forwarded-For を使う
    option forwardfor

    # ドメインによってbackupendを切り替える
    use_backend    host_web1_hayachi617_jp  if { ssl_fc_sni web1.hayachi617.jp }
    use_backend    host_web2_hayachi617_jp  if { ssl_fc_sni web2.hayachi617.jp }

    # web1の振り分け先はActive-Standbyにする
    backend host_web1_hayachi617_jp
        balance roundrobin
        option  httpchk    GET /hc.html
        server  a1 192.168.0.57:8080 check inter 5000 downinter 500 # active node
        server  a2 192.168.0.58:8080 check inter 5000 backup        # passive node

    # web2の振り分け先はCookieによるSessionSticky構成とする
    backend host_web2_hayachi617_jp
        balance roundrobin
        option  httpchk    GET /hc.html
        cookie SERVERID insert nocache indirect
        server  a3 192.168.0.57:8080  cookie ck_a3 check
        server  a4 192.168.0.58:8080  cookie ck_a4 check

それぞれの設定の意図は、コメントで記載。(*1)(*2)については以下記載する。

3.hapxoyをコマンドで操作する

 設定ファイルの(*1)について。 コマンドで操作する場合は、socatを使うらしい。socatはepelのレポジトリにあるので、 まずはそこから。
$ wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6Server/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -ivh  epel-release-6-8.noarch.rpm
$ sudo yum install --enablerepo=epel socat
これで準備完了。
## (1)で指定したユーザーに変更し、
$ su - haproxy

## haproyの情報を出力してみる
$ echo "show info" | socat stdio /var/run/haproxy/stats.socket

Name: HAProxy
Version: 1.5.3
Release_date: 2014/07/25
Nbproc: 1
Process_num: 1
Pid: 16597
Uptime: 0d 1h38m46s
Uptime_sec: 5926
Memmax_MB: 0
Ulimit-n: 8235
Maxsock: 8235
Maxconn: 4096
Hard_maxconn: 4096
CurrConns: 0
CumConns: 4
CumReq: 4
MaxSslConns: 0
CurrSslConns: 0
CumSslConns: 0
Maxpipes: 0
PipesUsed: 0
PipesFree: 0
ConnRate: 0
ConnRateLimit: 0
MaxConnRate: 1
SessRate: 0
SessRateLimit: 0
MaxSessRate: 1
SslRate: 0
SslRateLimit: 0
MaxSslRate: 0
SslFrontendKeyRate: 0
SslFrontendMaxKeyRate: 0
SslFrontendSessionReuse_pct: 0
SslBackendKeyRate: 0
SslBackendMaxKeyRate: 0
SslCacheLookups: 0
SslCacheMisses: 0
CompressBpsIn: 0
CompressBpsOut: 0
CompressBpsRateLim: 0
ZlibMemUsage: 0
MaxZlibMemUsage: 0
Tasks: 29
Run_queue: 1
Idle_pct: 100
node: web1.hayachi617.jp
description:

## 対話で進めてみる
$ socat readline /var/run/haproxy/stats.socket
prompt
>

## helpを表示
> help
Unknown command. Please enter one of the following commands only :
  clear counters : clear max statistics counters (add 'all' for all counters)
  clear table    : remove an entry from a table
  help           : this message
  prompt         : toggle interactive mode with prompt
  quit           : disconnect
  show info      : report information about the running process
  show pools     : report information about the memory pools usage
  show stat      : report counters for each proxy and server
  show errors    : report last request and response errors for each proxy
  show sess [id] : report the list of current sessions or dump this session
  show table [id]: report table usage stats or dump this table's contents
  get weight     : report a server's current weight
  set weight     : change a server's weight
  set server     : change a server's state or weight
  set table [id] : update or create a table entry's data
  set timeout    : change a timeout setting
  set maxconn    : change a maxconn setting
  set rate-limit : change a rate limiting value
  disable        : put a server or frontend in maintenance mode
  enable         : re-enable a server or frontend which is in maintenance mode
  shutdown       : kill a session or a frontend (eg:to release listening ports)
  show acl [id]  : report avalaible acls or dump an acl's contents
  get acl        : reports the patterns matching a sample for an ACL
  add acl        : add acl entry
  del acl        : delete acl entry
  clear acl <id> : clear the content of this acl
  show map [id]  : report avalaible maps or dump a map's contents
  get map        : reports the keys and values matching a sample for a map
  set map        : modify map entry
  add map        : add map entry
  del map        : delete map entry
  clear map <id> : clear the content of this map
  set ssl <stmt> : set statement for ssl

## haproxyの情報出力
> show info
Name: HAProxy
Version: 1.5.3
Release_date: 2014/07/25
Nbproc: 1
Process_num: 1
Pid: 2927
Uptime: 0d 0h06m10s
Uptime_sec: 370
Memmax_MB: 0
Ulimit-n: 8235
Maxsock: 8235
Maxconn: 4096
Hard_maxconn: 4096
CurrConns: 0
CumConns: 6
CumReq: 6
MaxSslConns: 0
CurrSslConns: 0
CumSslConns: 0
Maxpipes: 0
PipesUsed: 0
PipesFree: 0
ConnRate: 0
ConnRateLimit: 0
MaxConnRate: 1
SessRate: 0
SessRateLimit: 0
MaxSessRate: 1
SslRate: 0
SslRateLimit: 0
MaxSslRate: 0
SslFrontendKeyRate: 0
SslFrontendMaxKeyRate: 0
SslFrontendSessionReuse_pct: 0
SslBackendKeyRate: 0
SslBackendMaxKeyRate: 0
SslCacheLookups: 0
SslCacheMisses: 0
CompressBpsIn: 0
CompressBpsOut: 0
CompressBpsRateLim: 0
ZlibMemUsage: 0
MaxZlibMemUsage: 0
Tasks: 29
Run_queue: 1
Idle_pct: 100
node: lvs1.hayachi617.jp
description:

## 統計情報を出力してみる(カンマ区切りで出力される)
>show stat
#pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,comp_in,comp_out,comp_byp,comp_rsp,lastsess,last_chk,last_agt,qtime,ctime,rtime,ttime,
hastats,FRONTEND,,,0,0,64,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,2,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,,
hastats,BACKEND,0,0,0,0,7,0,0,0,0,0,,0,0,0,0,UP,0,0,0,,0,421,0,,1,2,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,0,0,0,0,-1,,,0,0,0,0,
ssl,FRONTEND,,,0,0,2000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,3,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,0,0,0,0,,,,,,,,
host_web1_hayachi617_jp,a1,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,1,0,0,0,421,0,,1,4,1,,0,,2,0,,0,L7OK,200,0,0,0,0,0,0,0,0,,,,0,0,,,,,-1,OK,,0,0,0,0,
host_web1_hayachi617_jp,a2,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,0,1,0,0,421,0,,1,4,2,,0,,2,0,,0,L7OK,200,1,0,0,0,0,0,0,0,,,,0,0,,,,,-1,OK,,0,0,0,0,
host_web1_hayachi617_jp,BACKEND,0,0,0,0,200,0,0,0,0,0,,0,0,0,0,UP,1,1,1,,0,421,0,,1,4,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,0,0,0,0,-1,,,0,0,0,0,
host_web2_hayachi617_jp,a3,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,1,0,0,0,421,0,,1,5,1,,0,,2,0,,0,L7OK,200,0,0,0,0,0,0,0,0,,,,0,0,,,,,-1,OK,,0,0,0,0,
host_web2_hayachi617_jp,a4,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,0,1,0,0,421,0,,1,5,2,,0,,2,0,,0,L7OK,200,1,0,0,0,0,0,0,0,,,,0,0,,,,,-1,OK,,0,0,0,0,
host_web2_hayachi617_jp,BACKEND,0,0,0,0,200,0,0,0,0,0,,0,0,0,0,UP,1,1,1,,0,421,0,,1,5,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,0,0,0,0,-1,,,0,0,0,0,
・
・
・

# 終了
>quit
4.hapxoyの統計情報を見る
 指定したポートおよびURI(http:///192.168.0.57:8088/haproxy?hastats)にアクセスすることで、コマンドラインのshow statと同じ情報がWebサイトで見ることができる。設定で認証をかけているので、記載しているIDとPASSでログイン。


なるほどですね。

5.haproxyの小ネタ(その他)
 その他の小ネタで、設定ファイルの(*3)のサーバ証明書ですが、ここではコモンネーム毎にサーバー証明書と中間証明書と秘密鍵を1つのファイルにまとめて簡素化している。
-----BEGIN CERTIFICATE-----
(サーバー証明書)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(中間証明書)
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
(秘密鍵)
-----END RSA PRIVATE KEY-----
6.keepalivedで冗長化する
ここまでで、haproxyの設定は完了したので、あとは冗長化。
## keepalivedのインストール
$ sudo yum install keepalived
設定のポイントは、
 ・VIPは、192.68.0.61とする
 ・VIPをつけるインターフェースはeth1とする
 ・冗長化のみでフォワーディングはしない
 ・Active条件はhaproxyのプロセス存在とする(haproxy自体がおかしな動きはしない想定)
 ・2台とも同じ設定にすることで、先に起動したほうがmasterになる(みたい)
 ・スタータス"master","backup","falut"になった時にそれぞれシェルが実行される
  (でも中身は今後)
とする。
# =====================
# Global
# =====================
global_defs {
    notification_email {
        root@localhost
    }
    lvs_id virtuals
    smtp_server localhost
    smtp_connect_timeout 40
    notification_email_from root@localhost
}

# =====================
# Check
# =====================
vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
}

# =====================
# VRRP
# =====================
vrrp_instance VirtualInstance1 {
    state BACKUP
    interface eth1
    virtual_router_id 1
    priority 100
    advert_int 5
    nopreempt
    authentication {
        auth_type PASS
        auth_pass passwd
    }
    virtual_ipaddress {
        192.168.0.61
    }
    track_script {
        check_haproxy
    }

    notify_master "/etc/keepalived/master.sh"
    notify_backup "/etc/keepalived/backup.sh"
    notify_fault "/etc/keepalived/fault.sh"
}

(2015/11/06 追記)
SSLv3(POODLE脆弱性)の対応ということで、SSLv3の無効化を記載
#---------------------------------------------------------------------
・
・
#---------------------------------------------------------------------
# 1.複数 SSL 処理
#---------------------------------------------------------------------
frontend  ssl
    #証明書を複数指定する(*3)
    bind *:443 ssl crt /vagrant/web1.cer crt /vagrant/web1.cer
・
・
こちらの設定を、
#---------------------------------------------------------------------
・
・
#---------------------------------------------------------------------
# 1.複数 SSL 処理
#---------------------------------------------------------------------
frontend  ssl
    #証明書を複数指定する(*3)
    bind *:443 ssl crt /vagrant/web1.cer crt /vagrant/web1.cer no-sslv3
・
・
でいける。
(2015/12/11 追記)
・keepalivedでIPの確認方法を記載
$ ip addr show eth1

4: eth1:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.5x/24 brd 192.168.0.1 scope global eth1
    inet 192.168.0.61/32 scope global eth2
・ssl通信の確認方法を記載
#---------------------------------------------------------------------
$ openssl s_client -connect localhost:443 -ssl3

CONNECTED(00000003)
139752400205640:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1193:SSL alert number 40
139752400205640:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:590:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : SSLv3
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1418264801
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

でSSLv3で接続しに行き、失敗していることが確認できる。

2014年7月21日月曜日

MySQL5.6をrpmでインストールしてみる

MySQLのインストールをやってみた。

■環境
 ・CentOS 6.4(x64) on VirtualBox
 ・MySQL 5.6.19

1.rpmの入手
  このサイトからrpmをする。入手できるモジュールは以下の通り。
  bundleパッケージには以下のモジュールが含まれている。
serverMySQLサーバー本体
client各種クライアントツール
develC API開発用ヘッダファイルと静的リンクライブラリ
sharedC API共有ライブラリ
shared-compat古いバージョンの共有ライブラリ
embeddedlibmysqld(サーバーを直接動作させるライブラリ)
testMySQLテストスイート
 # mkdir /tmp/mysql;cd /tmp/mysql
 # wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.19-1.el6.x86_64.rpm-bundle.tar
 # tar xvf MySQL-5.6.19-1.el6.x86_64.rpm-bundle.tar
 # ls
 MySQL-5.6.19-1.el6.x86_64.rpm-bundle.tar  MySQL-server-5.6.19-1.el6.x86_64.rpm
 MySQL-client-5.6.19-1.el6.x86_64.rpm      MySQL-shared-5.6.19-1.el6.x86_64.rpm
 MySQL-devel-5.6.19-1.el6.x86_64.rpm       MySQL-shared-compat-5.6.19-1.el6.x86_64.rpm
 MySQL-embedded-5.6.19-1.el6.x86_64.rpm    MySQL-test-5.6.19-1.el6.x86_64.rpm

2.インストールをする
 続いてインストール。
 # rpm -ihv MySQL-server-5.6.19-1.el6.x86_64.rpm
 Preparing...                ########################################### [100%]
        file /usr/share/mysql/czech/errmsg.sys from install of MySQL-server-5.6.19-1.el6.x86_64 conflicts with file from package mysql-libs-5.1.66-2.el6_3.x86_64
        file /usr/share/mysql/danish/errmsg.sys from install of MySQL-server-5.6.19-1.el6.x86_64 conflicts with file from package mysql-libs-5.1.66-2.el6_3.x86_64
        file /usr/share/mysql/dutch/errmsg.sys from install of MySQL-server-5.6.19-1.el6.x86_64 conflicts with file from
 ・
 ・
 何やらエラーでまくり。記載通り競合しているらしいので、調べたら、
  MySQL-shared-compat-5.6.19-1.el6.x86_64.rpm
 を先にインストールし、以前のバージョン依存性を壊すことなく、ライブラリをVerUPができるらしい。
 # rpm -ivh MySQL-shared-compat-5.6.19-1.el6.x86_64.rpm
 Preparing...                ########################################### [100%]
    1:MySQL-shared-compat    ########################################### [100%]

 # rpm -e mysql-libs-5.1.66-2.el6_3.x86_64

 # rpm -ihv MySQL-server-5.6.19-1.el6.x86_64.rpm
 Preparing...                ########################################### [100%]
    1:MySQL-server           ########################################### [100%]
 2014-07-20 12:19:09 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
 2014-07-20 12:19:09 2447 [Note] InnoDB: Using atomics to ref count buffer pool pages
 <中略>
  A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER !
 You will find that password in '/root/.mysql_secret'.

 You must change that password on your first connect,
 no other statement but 'SET PASSWORD' will be accepted.
 See the manual for the semantics of the 'password expired' flag.

 Also, the account for the anonymous user has been removed.

 In addition, you can run:

   /usr/bin/mysql_secure_installation

 which will also give you the option of removing the test database.
 This is strongly recommended for production servers.

 See the manual for more instructions.

 Please report any problems at http://bugs.mysql.com/

 The latest information about MySQL is available on the web at

   http://www.mysql.com

 Support MySQL by buying support/licenses at http://shop.mysql.com

 New default config file was created as /usr/my.cnf and
 will be used by default by the server when you start it.
 You may edit this file to change server settings

 #
 成功。続いて残りのパッケージも入れる。今回は、clientとtestだけ入れてみる。
 # rpm -ivh MySQL-client-5.6.19-1.el6.x86_64.rpm MySQL-test-5.6.19-1.el6.x86_64.rpm
 Preparing...                ########################################### [100%]
    1:MySQL-client           ########################################### [ 50%]
    2:MySQL-test             ########################################### [100%]

 # rpm -qa | grep MySQL
 MySQL-server-5.6.19-1.el6.x86_64
 MySQL-test-5.6.19-1.el6.x86_64
 MySQL-shared-compat-5.6.19-1.el6.x86_64
 MySQL-client-5.6.19-1.el6.x86_64
 インストールは問題なし。で、インストールの時に出てきた初期設定シェル(mysql_secure_installation)
 を実行する。このシェルは以下の設定を実施してくれるもの。

 ・rootパスワードの変更
 ・rootのリモートホストからのログイン禁止(localhostのみ)
 ・匿名ユーザーの削除
 ・testデータベースの削除
 # /etc/init.d/mysql start
 Starting MySQL. SUCCESS!

 # /usr/bin/mysql_secure_installation

 <中略> 

 Thanks for using MySQL!

 Cleaning up...
 #
 rootのパスワードは、インストールしてから変更していなければ、/root/.mysql_secret
 に記載されている。それ以外は全てyで回答。で最後に稼働確認。
 # mysqladmin -u root -p ping
 Enter password:
 mysqld is alive

 # mysql -u root -p
 Enter password:
 Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 19
 Server version: 5.6.19 MySQL Community Server (GPL)

 Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

 Oracle is a registered trademark of Oracle Corporation and/or its
 affiliates. Other names may be trademarks of their respective
 owners.

 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 mysql> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | mysql              |
 | performance_schema |
 +--------------------+
 3 rows in set (0.00 sec)

 mysql> exit;
 Bye
 #
 # ps ax|grep [m]ysqld
  3513 pts/0    S      0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/wp1.hayachi617.jp.pid
  3618 pts/0    Sl     0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/wp1.hayachi617.jp.err --pid-file=/var/lib/mysql/wp1.hayachi617.jp.pid
 #
 無事接続もできるし、testデータもないですね。ログを見てみると、
 #cat /var/lib/mysql/wp1.hayachi617.jp.err
 140720 13:26:28 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
 2014-07-20 13:26:28 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
 <略>
 というWarningが出ていた。引数もなんなので、/etc/my.cnfに記載する。
 [mysqld]
 explicit_defaults_for_timestamp=true
 このオプションは、5.6からできたオプション。timestamp型のデフォルトの属性を
 明示的に指定をするかどうか?の指定をするboolean。デフォルトはfalse(0)。5.5
 以前と合わせるのであれば、falseにしておく。がデフォルト属性が突如変更になる
 可能性もあり、本来は明示的に指定したほうがよさそう。
 
 explicit_defaults_for_timestamp=trueのとき時
 mysql>  show global variables like 'explicit_defaults_for_timestamp';
 +---------------------------------+-------+
 | Variable_name                   | Value |
 +---------------------------------+-------+
 | explicit_defaults_for_timestamp | ON    |
 +---------------------------------+-------+
 1 row in set (0.01 sec)

 mysql>
 mysql> create database test;
 Query OK, 1 row affected (0.00 sec)

 mysql> create table test (update_time timestamp) ENGINE=InnoDB;
 Query OK, 0 rows affected (0.06 sec)

 mysql> show create table test\G
 *************************** 1. row ***************************
        Table: test
 Create Table: CREATE TABLE `test` (
   `update_time` timestamp NULL DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 1 row in set (0.00 sec)
 特に属性はついていないようですね。次に、、

 explicit_defaults_for_timestamp=falseのとき時
 mysql> show global variables like 'explicit_defaults_for_timestamp';
 +---------------------------------+-------+
 | Variable_name                   | Value |
 +---------------------------------+-------+
 | explicit_defaults_for_timestamp | OFF   |
 +---------------------------------+-------+
 1 row in set (0.01 sec)

 mysql>
 mysql> create database test;
 Query OK, 1 row affected (0.00 sec)

 mysql> create table test (update_time timestamp) ENGINE=InnoDB;
 Query OK, 0 rows affected (0.06 sec)

 mysql> show create table test\G
 *************************** 1. row ***************************
        Table: test
 Create Table: CREATE TABLE `test` (
   `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
 1 row in set (0.00 sec)
 いろいろ属性が付いてますね。必要であれば、これを明示的に記載した
 ほうがよさそうですね。

 最後に自動起動するようにしておく。
 # chkconfig mysql on
 # chkconfig|grep mysql
 mysql           0:off   1:off   2:on    3:on    4:on    5:on    6:off
3.その他の設定
 その他にもありそうな設定を/etc/my.cnfに入れてみる。
 [mysqld]
 explicit_defaults_for_timestamp=true (*1)
 character-set-server=utf8            (*2)
 datadir=/var/lib/mysql               (*3)

 [mysql]
 default-character-set=utf8           (*4)

(*1) さっきの件
(*2) MySQLサーバー側のデフォルト文字コードの設定。設定後にDBの情報をのぞいてみると、、
 mysql> show variables like 'char%';
 +--------------------------+----------------------------+
 | Variable_name            | Value                      |
 +--------------------------+----------------------------+
 | character_set_client     | utf8                       |
 | character_set_connection | utf8                       |
 | character_set_database   | utf8                       |
 | character_set_filesystem | binary                     |
 | character_set_results    | utf8                       |
 | character_set_server     | utf8                       |
 | character_set_system     | utf8                       |
 | character_sets_dir       | /usr/share/mysql/charsets/ |
 +--------------------------+----------------------------+
 8 rows in set (0.00 sec)
無事変更されていることを確認。
(*3) データファイルの配置場所の指定
(*4) MySQLクライアント側のデフォルト文字コードの設定

2014年7月13日日曜日

BIND 9.10 をソースから入れてみる

以前パッケージを使ってBINDを入れてみたが、今回セキュリティも考慮しつつ、ソースから構築してみる。
セキュリティを考慮すると、迅速に対応できるソースで扱えるとよい。と思いやってみた。

■環境
 ・CentOS 6.4(x64) on VirtualBox
 ・Bind 9.10

1.ソースの入手

  このサイトから最新のソースを入手し、展開する。
 # mkdir /tmp/bind;cd /tmp/bind
 # wget http://www.isc.org/downloads/file/bind-9-10-0b1-2/?version=tar.gz -O bind-9.10.0-P2.tar.gz
 # tar xvfz bind-9.10.0-P2.tar.gz
 # cd bind-9.10.0-P2
2.ビルド&インストールをする

 opensslのライブラリを使うため、なるべく最新のモジュールを使う。その後にビルドする。
 # ./configure --prefix=/usr --exec_prefix=/usr --localstatedir=/var --sysconfdir=/etc --enable-threads --enable-chroot

 "--enable-threads"はマルチスレッドでビルドをするオプション。
 # make
 # make install
 モジュールは、/usr/local/binと/usr/local/sbinに配置される。/usr/sbinを参照する
 仕組みもある可能性があるらしいので、リンクを貼っておくとよいらしい。
 # ln -s /usr/local/sbin/named /usr/sbin/named
 # ln -s /usr/local/sbin/named-checkconf /usr/sbin/named-checkconf
 # ln -s /usr/local/sbin/named-checkzone /usr/sbin/named-checkzone
 # ln -s /usr/local/sbin/named-checkzone /usr/sbin/named-compilezone
 configureにて、以下の設定を入れるのもありか。
 # ./configure --prefix=/usr --exec_prefix=/usr --localstatedir=/var --sysconfdir=/etc --enable-threads --enable-chroot

3.設定をする

 次にbindの設定をする。設定ファイルはnamed.conf。以下のステートメントについて説明を記載

 aclステートメント

 ネットワークの定義をする。optionsの中で、この定義を使う。
acl hayachi617net {
    192.168.0.0/24;
    127.0.0.1;
    !192.168.1.0/24;
};
 上記は、192.168.0.0/24と127.0.0.1は許可し、192.168.1.0/24は許可しない、という設定になる
またaclのデフォルトでは以下が定義されている。
any全てのアドレス
none全てのアドレスを否定
localhostDNSホストに実装された全てのネットワーク・インタフェイスに割り当てられたIPアドレス(IPv4, IPv6)
localnetsDNSホストに実装された全てのネットワーク・インタフェイスに割り当てられたネットワーク(IPv4, IPv6)
 BIND 9ではGeoIPをSupportしているらしい。面白い。でも今のところ使うことはなさそうだけど。。
includeステートメント
 外部ファイルを取り込む。
inculde "filename";

controlsステートメント
 リモートやローカルのbindを制御するツールrndcを受け付ける設定。
controls {
    inet 192.168.0.2 port 953 allow { 192.168.0/24; } keys { "rndckey"; };
};
 上記の設定は、IPは192.168.0.2、PORTは53でリスンし、192.168.0/24からのみアクセス
 を受け付け、使用する共通鍵名は"rndckey"ということを示している。この行を複数設定
 することも可能。

 rndckeyは以下のコマンドで作成してみる
# rndc-confgen -a -b 512 -k rndctest
 が待てども待てどもレスポンスがない。以前何かの時に乱数発生の処理でうまくいかないことがあった。ということで、
# rndc-confgen -a -b 512 -k rndctest -r /dev/urandom
としてみたら、さくっと返ってきた。
loggingステートメント
 loggingステートメントの文法は以下の通り。
logging {
        [ channel channel_name {
                ( file path_name | syslog syslog_facility | stderr | null );
                [ severity ( critical | error | warning | notice | info | debug | dynamic ); ]
                [ print-category ( yes | no ); ]
                [ print-severity ( yes | no ); ]
                [ print-time ( yes | no ); ]
        }; ]

        [ category category_name {
                channel_name; [ channel_name; ....]
        }; ]
};
 Channelフェーズでは、出力方法、フォーマットのオプション、重大度レベルを設定し、
 Categoryフェーズにて、どの種類のログをどのChannelに出力するか?を指定する。
 loggingステートメントが指定されていない場合は、デフォルトで以下の設定が適用される
logging {
    category default { default_syslog; default_debug; };
    category unmatched { null; };
};
 Channelフェーズの各設定値は以下の通り。
( file path_name | syslog syslog_facility | stderr | null );
fileファイルに出力する。引数には出力先を指定する。またversionsオプションを指定するとログの世代数と、1ファイルあたりのサイズを指定できる。
channel an_example_channel {
    file "example.log" versions 3 size 20m;
};
上記は、ログファイルを20MBで切り替え、3世代保持をするという設定になる。
syslogsyslogに直接出力をする設定。引数にfacilitiyを指定できる。
stderr標準エラー出力に出力する。これはデーモン起動ではなく、直接 起動時に使用する。主にデバッグ時に使用する
nullログは全て捨てる
 それ以外のChannelのオプションは以下の通り。
severity重大度レベルを指定する
print-categoryカテゴリ情報を出力するかどうか?指定する
print-severitySeverity情報を出力するかどうか?指定する
print-time時刻を出力するかどうか?指定する
 また以下の4つのChannelがデフォルトで定義されている
channel default_syslog {
    // send to syslog’s daemon facility
    syslog daemon;
    // only send priority info and higher
    severity info;
};

channel default_debug {
    // write to named.run in the working directory
    // Note: stderr is used instead of "named.run" if
    // the server is started with the ’-f’ option.
    file "named.run";
    // log at the server’s current debug level
    severity dynamic;
};
channel default_stderr {
    // writes to stderr
    stderr;
    // only send priority info and higher
    severity info;
};
channel null {
    // toss anything sent to this channel
    null;
};
 categoryフェーズで選択できるログの種類のうち、いくつかを以下に記載。
defaultデフォルトのログ
general全てのログ
securityリクエストの承認と否認のログ
update動的更新のログ

 optionsステートメント
 optionsステートメントの文法はたくさんありすぎるので、とりあえず使いそうなもの
 を中心に記録しておく。
versionバージョン情報。セキュリティを考慮し"UNKNOWN"やブランクにするなどを検討
version version_string;
hostnameDNSサーバのホスト名問い合わせ時のレスポンス値。省略された場合は、OSホスト名が返される。 負荷分散などでホスト名がバラならなときに使ったりする。
directorynamed.confの中で相対パスが指定されいた場合の、起点になるディレクトリのパス情報。 基本はフルパスで記載する。/var/namedが一般的らしい。
directory path_name;
pid-filenamedのpidファイルの場所。デフォルトは/var/run/named.pid
pid-file filename;
listen-on portDNSサービスをリスンするIPおよびポートの指定。特に複数 のネットワークインタフェイスが実装されたホストや、IPエリアスでネットワークインタ フェイスに複数のIPアドレスが割り当てられているホストで、DNSサービスを特定のアドレス に限定したい場合に設定する。省略した場合、namedはホストに割り当てられたすべてのアドレス をリッスンする。
listen-on [ port ip_port ] { address_match_list; };
recursion再帰的クエリーに関する設定。yesの場合、自分がマスターでないゾーンについて リクエストを受けた場合、該当ゾーンのSOAである他のDNSサーバーに問い合わせて回答する。noの場合は、 自分がSOAのゾーンについてのみ回答する。あるいはキャッシュにあれば回答する(らしい)。キャッシュになく 自身のゾーンでない場合は、次に問い合わせすべきネームサーバーを返す。
内部LANのDNSサーバーの場合は、内部サーバーからのリクエストのみ再帰的クエリーを許可する場合は、 allow-recursionをセットで使う。
allow-recursion再帰的クエリーを許可するネットワークの指定。
allow-recursion { localnets; };
forwardforwardersとセットで使う。firstを指定した場合は、まず最初にforwardersのリストの 宛先にクエリを投げ、解決しない場合は自身で探す。onlyはforwardersのリストに転送するのみ。
forward ( only | first );
forwarders問い合わせを転送する先のネットワークを指定。デフォルトは空で、 クエリの転送はされない。またこの指定は、ゾーンの設定にて上書き可能。
forwarders { ip_addr; [ ip_addr; ... ] };

 viewsステートメント

 イントラ向けとインターネット向けに返送するゾーンを分ける際に使う。viewsステートメントの文法は以下の通り。
view view_name
    [class] {
    match-clients { address_match_list };
    match-destinations { address_match_list };
    match-recursive-only yes_or_no ;
    [ view_option; ...]
    [ zone_statement; ...]
};
match-clientsソースIPの条件を記載。指定がなければany
match-destinations宛先IPの条件を記載。指定がなければany
match-recursive-only上記条件に合致するクライアントからのリクエストを再帰的クエリーのみ処理するオプション
view_optionoptionステートメントのものが記載できる
zone_statementzoneステートメントのものが記載できる

 zoneステートメント

 zoneステートメントの文法はたくさんありすぎるので、とりあえずサンプルをベース記載しておく。
 ・キャッシュサーバーの設定。再帰的クエリーを許可する場合に設定。
zone "." {
    type hint;               (*1)
    file "named.ca";         (*2)
    allow-update { none; };  (*3)
};
(*1)キャッシュサーバーとしての設定
(*2)named.caはルートヒントの情報が入ったファイル。named.ca は
ftp://ftp.rs.internic.net/domain/named.root
から入手できる。
(*3) namedが起動した際にルートサーバーから自動更新できるが、セキュリティ上無効化したほうがよいらしい。
※実際に設定すると、「option 'allow-update' is not allowed in 'hint' zone '.'」というエラーが出てしまう。  あまり詳細な情報が見つからなかったが、無効化したら、起動できた。バージョン差異なのか。。とりあえず、進める。
 ・hayachi.jpドメインに対する正引き用の設定
zone "hayachi.jp" IN {
        type master;
        file "zones_master_forward/hayachi.jp.zone";
};
 マスターゾーンサーバーとしての設定になる。hayachi.jp.zoneの中身は以下の通り
   hayachi.jp.zone
$ORIGIN hayach.jp.                    (*1)
$TTL 3600       ; 1 hour              (*2)
@   IN SOA  ns1.hayachi.jp. postmaster.hayachi.jp. (    (*3)
        2009082401 ; serial                             (*4)
        3600       ; refresh (1 hour)                   (*5)
        1200       ; retry (20 min.)                    (*6)
        1209600    ; expire (2 weeks)                   (*7)
        900        ; minimum (15 min.)                  (*8)
        )
@       IN  NS      ns1.hayachi.jp.                     (*9)
@       IN  NS      ns2.hayachi.jp. 
@       IN  MX      10  mail.hayachi.jp.                (*10)
@       IN  TXT     "v=spf1 mx ~all"    ; SPF record    (*11)

ns1     IN  A       124.34.146.121                      (*12)
ns2     IN  A       124.34.146.122
mail    IN  A       124.34.146.123
srv1    IN  A       124.34.146.124
www     IN  CNAME   srv1                                (*13)
(*1)$ORINGディレクティブ。SOAレコード、Aレコード、PTRレコード等の定義で最後に「.」が つかない場合に、付加される文字列を定義。また「@」で置き換えすることができる。 一つのゾーンファイルの中で複数回使用できる。
(*2)該当ゾーンの各レコードの寿命(秒単位)。$ORIGINでゾーンの定義をした直後に必ず$TTLを 指定する必要がある。DHCPなどでDynamicDNS環境にする場合は5分などにすることもあるらしい。
(*3)SOAレコードの記載。「@」は$ORIGINディレクティブで設定されたゾーン名を表している。$ORIGINが ない場合は、named.confで設定されたゾーン名が採用される。
この行の書式は
@ IN SOA <MNAME> <RNAME> (
となる。
MNAMEにはこのゾーンのプライマリのDNSサーバーをFQDNで指定(IPはダメ)。末尾に「.」が必須 であり、Aレコードで定義されている必要がある(CNAMEはダメ)。
RNAMEは、このゾーンの管理者のメールアドレスで、「@」を「.」にに置き換えたもの。末尾に「.」 が必須(ないと、$ORIGINの定義が付加される)
(*4)SERIALは1から始まる連番。運用面でYYYYMMDDnn(nnは連番)で見立てて設定することを推奨しているらしい。 ただし、DynamicDNSの環境では、この体系は無視されて1ずつ追加される。
(*5)REFRESHは、スレーブネームサーバーがSERIALが増えたかどうかをチェックするインターバル秒。
(*6)RETRYは、ポーリングが失敗した時の再試行までの時間(秒)。原則はREFRESHの整数分の1の値。
(*7)EXIREは、マスターサーバーがダウンした場合、ここで指定された時間の間はゾーン情報が有効なものとして扱うが、 過ぎると、無効として廃棄する。RFC1912は、2~4週間(1209600~2419200)を推奨しているらしい。
(*8)各リソースレコード(A, MX, TXT etc.)のデフォルトのTTL(秒)
(*9)NSレコード。ドメインのDNSサーバーを指定。
(*10)MXレコード。ドメインのメールサーバーを指定。
(*11)TXTレコード。この例はSPFレコード。以下SPFレコードのルール(簡易)。
v=spf1 [+送出MTAリスト] [送出MTAリスト以外から送出された場合の判定all]

[+送出MTAリスト]
  MXを指定           "+mx"
  IPアドレスを指定   "+ip4:x.x.x.x"
  ネットワークを指定 "+ip4:x.x.x.x/x"
  ※複数のMTAを指定する際には、半角スペースでつなぐ。

[送出MTAリスト以外から送出された場合の判定all]
  創出MTAリスト以外から送られた場合の判定
   Fail     "-all"  
   SoftFail "~all"
   Neutral  "?all"
  詳細は、ここを参照。
(*12)Aレコード
(*13)CNAMEレコード
 ・192.168.0.0/24アドレスの逆引き用の設定
zone "0.168.192.in-addr.arpa" {
        type master;
        file "zones_master_rev/rev_192.168.0.0_24.zone";
};
   rev_192.168.0.0_24.zone
$ORIGIN 0.168.192.in-addr.arpa.
$TTL 3600       ; 1 hour
@ IN SOA  ns1.hayachi.jp. postmaster.hayachi.jp. (
        2009082401 ; serial
        3600       ; refresh (1 hour)
        1200       ; retry (20 min.)
        1209600    ; expire (2 weeks)
        900        ; minimum (15 min.)
        )
        IN  NS      dns1.hayachi.jp.                 (*1)
        IN  NS      dns2.hayachi.jp.                 (*1)
50      IN  PTR     dns1.hayachi.jp.                 (*2)
51      IN  PTR     dns2.hayachi.jp.

(*1)逆引きを管理するDNSサーバー
(*2)PTRレコード。この例の場合、192.168.0.5はdns1.hayachi.jpであることを示す
 ・192.168.0.0/16アドレスの逆引き用の設定
zone "168.192.in-addr.arpa" { (*1)
        type master;
        file "zones_master_rev/rev_192.168.0.0_16.zone";
};
   rev_192.168.0.0_16.zone
$ORIGIN 168.192.in-addr.arpa.
$TTL 3600       ; 1 hour
@ IN SOA  ns1.hayachi.jp. postmaster.hayachi.jp. (
        2009082401 ; serial
        3600       ; refresh (1 hour)
        1200       ; retry (20 min.)
        1209600    ; expire (2 weeks)
        900        ; minimum (15 min.)
        )
        IN  NS      ns1.hayachi.jp.
        IN  NS      ns2.hayachi.jp.
50.0    IN  PTR     ns1.hayachi.jp.                 (*1)
50.1    IN  PTR     ns2.hayachi.jp.

(*1)末尾8ビット分を記載する(逆順に)
 ・192.168.0.0/28アドレスの逆引き用の設定
    管理は4ビット単位になっているのでちょっと工夫が必要になるらしい。例えば、
  192.168.0.0/24を4つに分けて管理をする場合を考える。
zone "0.168.192.in-addr.arpa" { (*1)
        type master;
        file "zones_master_rev/rev_192.168.0.zone";
};
   rev_192.168.0.zone
$ORIGIN 168.192.in-addr.arpa.
$TTL 3600       ; 1 hour
@ IN SOA  ns1.hayachi.jp. postmaster.hayachi.jp. (
        2009082401 ; serial
        3600       ; refresh (1 hour)
        1200       ; retry (20 min.)
        1209600    ; expire (2 weeks)
        900        ; minimum (15 min.)
        )
        IN  NS      ns1.hayachi.jp.
        IN  NS      ns2.hayachi.jp.
;
; 192.168.0.0/26用
;
0-26  IN NS     ns1.hayachi1.jp.
      IN NS     ns2.hayachi1.jp.
1     IN CNAME  1.0-26.0.168.192.in-addr.arpa.
2     IN CNAME  2.0-26.0.168.192.in-addr.arpa.
3     IN CNAME  3.0-26.0.168.192.in-addr.arpa.    (*1)
...
63    IN CNAME  63.0-26.0.168.192.in-addr.arpa.
;
; 192.168.0.64/26用
;
64-26 IN NS     ns1.hayachi2.jp.
      IN NS     ns2.hayachi2.jp.
65    IN CNAME  65.64-26.0.168.192.in-addr.arpa.
66    IN CNAME  66.64-26.0.168.192.in-addr.arpa.
67    IN CNAME  67.64-26.0.168.192.in-addr.arpa.
...
127   IN CNAME  127.64-26.0.168.192.in-addr.arpa.
;
; 192.168.0.128/26用
;
128-26 IN NS     ns1.hayachi3.jp.
       IN NS     ns2.hayachi3.jp.
129    IN CNAME  129.128-26.0.168.192.in-addr.arpa.
130    IN CNAME  130.128-26.0.168.192.in-addr.arpa.
131    IN CNAME  131.128-26.0.168.192.in-addr.arpa.
...
191    IN CNAME  191.128-26.0.168.192.in-addr.arpa.
;
; 192.168.0.192/26用
;
192-26 IN NS     ns1.hayachi4.jp.
       IN NS     ns2.hayachi4.jp.
193    IN CNAME  193.192-26.0.168.192.in-addr.arpa.
194    IN CNAME  194.192-26.0.168.192.in-addr.arpa.
195    IN CNAME  195.192-26.0.168.192.in-addr.arpa.
...
255    IN CNAME  255.192-26.0.168.192.in-addr.arpa.
   rev_192.168.0.0-64.zone
$ORIGIN 0-64.0.168.192.in-addr.arpa.
$TTL 3600       ; 1 hour
@ IN SOA  ns1.hayachi1.jp. postmaster.hayachi1.jp. (
        2009082401 ; serial
        3600       ; refresh (1 hour)
        1200       ; retry (20 min.)
        1209600    ; expire (2 weeks)
        900        ; minimum (15 min.)
        )
        IN  NS      ns1.hayachi1.jp.
        IN  NS      ns2.hayachi1.jp.

3      IN  PTR     ns1.hayachi1.jp.      (*2)
4      IN  PTR     ns2.hayachi1.jp.
5      IN  PTR     svr1.hayachi1.jp.
 例えば、192.168.0.3の逆引きをすると、「rev_192.168.0.zone」の中にある(*1)がヒットする。
  該当レコードは3.0-26.0.168.192.in-addr.arpaのCNAMEレコードとなっているので、
  0-26.0.168.192.in-addr.arpaに問い合わせが行われる。そこで、rev_192.168.0.0-64.zoneの
 中の(*2)がヒットし、ns1.hayachi1.jpが返ってくる。ということらしい。
 上記を踏まえた、named.conの設定例を以下にUPしてみた。
   named.conf
acl "net-client" {
       192.168.0.0/24;
};

controls {
    inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { "rndc-key"; };
};
include "/etc/rndc.key";

logging {

    channel queries-log {
        file "/var/named/queries.log" versions 4 size 10m;
        severity info;
        print-category yes;
        print-severity yes;
        print-time yes;
    };

    channel "default syslog" {
        syslog daemon;
        severity info;
    };

    channel "default debug" {
        file "named.run";
        severity dynamic;
    };

    channel "null" {
        null;
    };

    category edns-disabled { null; };
    category lame-servers { null; };
    category resolver { null; };
    category queries { queries-log; };
    category security { "default syslog"; };
    category general { "default syslog"; };
    category default { "default syslog"; };
};

options { 
    version "unknown";
    hostname "hayachi617.jp";
    directory "/var/named/"; 
    statistics-file "/var/named/data/named stats.txt"; 
    pid-file "/var/run/named/named.pid";
      
    listen-on port 53 {
        127.0.0.1;
        192.168.0.50;
    };

    allow-query { localnets; net-client; };
    recursion yes;
    allow-recursion { localnets; net-client; };
    forward only;
    forwarders { 192.168.0.1; };
};

view internal {
    match-clients { localnets; net-client; };  
    match-recursive-only no;
    include "zones/myzones.zones";
};

   zones/myzones.zones
zone "." IN {
    type hint;
    file "named.ca";
};
zone "hayachi617.jp" IN {
        type master;
        file "zones_master_forward/hayachi617.jp.zone";
};
zone "0.168.192.in-addr.arpa" {
        type master;
        file "zones_master_rev/rev_192.168.0.zone";
};
   zones_master_forward/hayachi617.jp.zone
$ORIGIN hayach617.jp.
$TTL 3600       ; 1 hour
@ IN SOA  dns1.hayachi617.jp. postmaster.hayachi617.jp. (
        2009082401 ; serial
        3600       ; refresh (1 hour)
        1200       ; retry (20 min.)
        1209600    ; expire (2 weeks)
        900        ; minimum (15 min.)
        )
@       IN  NS      dns1.hayachi617.jp.

dns1    IN  A       192.168.0.50
srv1    IN  A       192.168.0.51
www     IN  CNAME   srv1
   zones_master_rev/rev_192.168.0.zone
$ORIGIN 0.168.192.in-addr.arpa.
$TTL 3600       ; 1 hour
@ IN SOA  dns1.hayachi617.jp. postmaster.hayachi617.jp. (
        2009082401 ; serial
        3600       ; refresh (1 hour)
        1200       ; retry (20 min.)
        1209600    ; expire (2 weeks)
        900        ; minimum (15 min.)
        )
        IN  NS      dns1.hayachi617.jp.
50      IN  PTR     dns1.hayachi617.jp.
51      IN  PTR     svr1.hayachi617.jp.
 上記を設定して、namedサービスを起動してみたが、動かない。。
 # named-checkconf -z /etc/named.conf
 zone hayachi617.jp/IN: loaded serial 2009082401
 zone 0.168.192.in-addr.arpa/IN: loaded serial 2009082401

 # echo $?
 1

 # /usr/sbin/named-checkzone hayachi617.jp /var/named/zones_master_forward/hayachi617.jp.zone
 zone hayachi617.jp/IN: loaded serial 2009082401
 OK

 # /usr/sbin/named-checkzone 0.168.192.in-addr.arpa /var/named/zones_master_rev/rev_192.168.0.zone
 zone 0.168.192.in-addr.arpa/IN: loaded serial 2009082401
 OK
 となる。named-checkzoneはOKだけど、named-checkconfがエラーになる。でも
 エラーメッセージも出ず、何がエラーなのかわからない。で、straceで見てみたら、、
 # strace named-checkconf -z /etc/named.conf
 <中略> 
 open("named.ca", O_RDONLY)              = -1 ENOENT (No such file or directory)
 <中略> 
 とでた。あっ。。
 # wget ftp://ftp.rs.internic.net/domain/named.root -o /var/named/named.ca
 # mv named.root /var/named/named.ca
 # named-checkconf -z /etc/named.conf
 zone hayachi617.jp/IN: loaded serial 2009082401
 zone 0.168.192.in-addr.arpa/IN: loaded serial 2009082401

 # echo $?
 0
 うーん、、凡ミス。

2014年6月18日水曜日

tips:nfsの調査!

NFS server(Windows2008R2)  +  NFS Client(CentOS6.4)にてデバッグをおこなったので、その時の備忘録。

 調査1.NFS Client側で統計情報取得

 # nfsstat -c

 Client rpc stats:
 calls      retrans    authrefrsh
 259        0          265

 Client nfs v3:
 null         getattr      setattr      lookup       access       readlink
 0         0% 118      46% 5         1% 5         1% 101      39% 0         0%
 read         write        create       mkdir        symlink      mknod
 0         0% 0         0% 4         1% 2         0% 0         0% 0         0%
 remove       rmdir        rename       link         readdir      readdirplus
 0         0% 0         0% 0         0% 0         0% 0         0% 4         1%
 fsstat       fsinfo       pathconf     commit
 0         0% 10        3% 5         1% 0         0%

 アクセス種別に応じた回数や比率が出力される。

 調査2.NFS Client側でtcpdump

 # tcpdump host [nfs server ip]

調査3.NFS Clientのデバッグ

 # rpcdebug -m nfs -s vfs
 # tail -f /var/log/messages

 (NFS Client)# touch test
 Jun 17 16:07:34 localhost kernel: NFS: permission(0:14/981489865), mask=0x1, res=0
 Jun 17 16:07:34 localhost kernel: NFS: nfs_update_inode(0:14/981489865 ct=2 info=0x7e7f)
 Jun 17 16:07:34 localhost kernel: NFS: permission(0:14/981489865), mask=0x1, res=0
 Jun 17 16:07:34 localhost kernel: NFS: permission(0:14/981489865), mask=0x3, res=0
 Jun 17 16:07:34 localhost kernel: NFS: create(0:14/981489865), test ※touch test(create)
 Jun 17 16:07:34 localhost kernel: NFS: nfs_update_inode(0:14/981489865 ct=2 info=0x1feff)
 Jun 17 16:07:34 localhost kernel: NFS: nfs_fhget(0:14/1409289744 ct=1)
 Jun 17 16:07:34 localhost kernel: NFS: permission(0:14/1409289744), mask=0x0, res=0
 Jun 17 16:07:34 localhost kernel: NFS: nfs_update_inode(0:14/1409289744 ct=1 info=0x1feff)
 Jun 17 16:07:34 localhost kernel: NFS: nfs_update_inode(0:14/1409289744 ct=1 info=0x7e7f)
 Jun 17 16:07:34 localhost kernel: NFS: dentry_delete(/test, 8)

 (NFS Client)# touch test

 Jun 17 16:08:38 localhost kernel: NFS: nfs_update_inode(0:14/981489865 ct=2 info=0x7e7f)
 Jun 17 16:08:38 localhost kernel: NFS: permission(0:14/981489865), mask=0x1, res=0
 Jun 17 16:08:38 localhost kernel: NFS: nfs_update_inode(0:14/981489865 ct=2 info=0x7e7f)
 Jun 17 16:08:38 localhost kernel: NFS: permission(0:14/981489865), mask=0x1, res=0
 Jun 17 16:08:38 localhost kernel: NFS: nfs_update_inode(0:14/981489865 ct=2 info=0x7e7f) 
 Jun 17 16:08:38 localhost kernel: NFS: nfs_update_inode(0:14/1409289744 ct=1 info=0x7e7f) ※touch test(modify)
 Jun 17 16:08:38 localhost kernel: NFS: nfs_update_inode(0:14/1409289744 ct=1 info=0x7e7f)
 Jun 17 16:08:38 localhost kernel: NFS: permission(0:14/1409289744), mask=0x22, res=0
 Jun 17 16:08:38 localhost kernel: NFS: nfs_update_inode(0:14/1409289744 ct=1 info=0x1feff)
 Jun 17 16:08:38 localhost kernel: NFS: nfs_update_inode(0:14/1409289744 ct=1 info=0x7e7f)
 Jun 17 16:08:38 localhost kernel: NFS: dentry_delete(/test, 8)

 (NFS Client)# rm test

 Jun 17 16:11:10 localhost kernel: NFS: nfs_update_inode(0:14/981489865 ct=2 info=0x7e7f)
 Jun 17 16:11:10 localhost kernel: NFS: permission(0:14/981489865), mask=0x1, res=0
 Jun 17 16:11:10 localhost kernel: NFS: nfs_update_inode(0:14/981489865 ct=2 info=0x7e7f)
 Jun 17 16:11:10 localhost kernel: NFS: permission(0:14/981489865), mask=0x1, res=0
 Jun 17 16:11:10 localhost kernel: NFS: nfs_update_inode(0:14/981489865 ct=2 info=0x7e7f)
 Jun 17 16:11:10 localhost kernel: NFS: permission(0:14/981489865), mask=0x3, res=0
 Jun 17 16:11:10 localhost kernel: NFS: unlink(0:14/981489865, test)
 Jun 17 16:11:10 localhost kernel: NFS: safe_remove(/test) ※rm test
 Jun 17 16:11:10 localhost kernel: NFS: nfs_update_inode(0:14/981489865 ct=2 info=0x1feff)
 Jun 17 16:11:10 localhost kernel: NFS: dentry_delete(/test, 18)

 上記のようにログが残る。ちなみに

 Jun 17 16:08:38 localhost kernel: NFS: nfs_update_inode(0:14/1409289744 ct=1 info=0x7e7f) 

ここに記載されている1409289744 は、inode番号なので、

 # find -inum 1409289744 

  ./test

 と対象のファイル名を調べることができる。

 調査4.NFS Serverのネットワークパケット取得(NetworkMonitor)


Tips:Windowsのネットワークあたりのトピックス

Windowsネットワーク周りの備忘録

・ネットワークパケットを取得する

 Microsoft標準だと、NetworkMonitor3.4などがある。GUIでもCUI (nmcap.exe)でも取得可能。
 コマンドラインは以下のような感じ。

 >nmcap /network * /capture /StartWhen /Time 00:00 6/1/2014 /StopWhen /Time 18:00 6/1/2014 /file .\test1.cap:100M /CaptureProcesses

 
 詳しくはnmcap /helpや/examleで見れる。開始(/StartWhen)・終了(/StopWhen)の時間が指定できたり、
 取得しているOS上のプロセスとの紐づけ(/CaptureProcesses)ができるので、ちょっと便利そう。

 wiresharkを使って取得することもできる。GUIでもCUI でも。コマンドラインは以下のような感じ。


 >tshark -b filesize:5000 -b files:1000 -w C:\temp\test


 今のところパケット取得自体であれば、MS純正との差異は思いつかない。プロセスとの紐付けなどができる点

 では、NetworkMonitorなのかな?

・WindowsのTCPポートの上限数の変更

 Windows2003までは、ポートはデフォルトだと、1025~5000となっている。Windows2008以降では49152~65535が
 既定の動的割り当てポートの範囲となっている。

 >netsh int <ipv4|ipv6> show dynamicport <tcp|udp>


 これで現在のポート範囲を表示することができる。変更もコマンドラインできる。

 >netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=数値 num=範囲

・Windows2008 R2の複数IP割当時のPrimaryIP(OutBoundの時のデフォルトのソースIP)

 Windows2008(R2なし)までは、複数IPがあった場合でも、割り当て欄の一番上のIPがPrimaryIPとなった。


 Windows2008 R2では1枚のNICに複数IPをアサインした場合、IPの中で一番小さいIPアドレスがPrimaryIPとなる。

 そのためFirewallのなど通信時にソースIP制限をかけている環境では、あとつけでIPを追加する場合、IP次第では
 ソースIPが変わってしまうため注意が必要(仕様らしいが、メリットがあるのかな?改悪な気がする。)

・TCP Ack Frequency

  
 TCP遅延ACKの頻度を指定する。

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Interface GUID}*

  値の名前:TcpAckFrequency
  値:(DWORD) デフォルト2。変更する際は1。
  ※デフォルトでは、セグメントを2個受信したらACKを返す。1にするとセグメント毎にACKを返す(つまり
    TCP遅延ACKを無効化)。

・TimeWaitの時間変更
 セッションをたくさん張るようなサーバーの場合、TCPセッションがたくさん残ってしまい、ポートを消費してしまう
 ことがあるので、その時のチューニングの1つとして、TimeWaitを短くする。レジストリを変更する。

  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  値の名前:TcpTimedWaitDelay
  値:DWORDで秒単位で記載(Windows2008のデフォルトは120秒)。
 
  参考)http://technet.microsoft.com/en-us/library/cc938217.aspx

 本来Time Waitは、通信相手に正常に終了のパケットが届いたと思われる十分な時間が経過するまでの間、同じ
 プロトコル、発信元 IP アドレス、ポート、宛先 IP アドレス、ポートが接続に使用されないようにするための時間。
 あるいは再利用のための待ち時間。
 RFC 793 では、ソケット ペアの再使用禁止時間の長さを 2 MSL (セグメントの最大有効期間の 2 倍) または 
 4 分と規定している。時間を短くする場合は、このあたりは認識しておかないと。


 ※ちなみにPort数(49152~65535)÷TcpTimedWaitDelayが1秒あたりの最大セッション数になりますね。

・IPv6の無効化

 ネットワークのアダプタでIPv6を無効化するだけ。

・SNP(Scalable Networking Pack)の無効化

 ネットワーク性能が出ないことがある時に、無効化してみる。設定の確認は

 >netsh int tcp show global




 赤枠のところがenabledに。これを無効化するには以下を実施


 >netsh int tcp set global chimney=disabled

 >netsh int tcp set global rss=disabled
 >netsh int tcp set global netdma=disabled

 再度確認してみる。

 >netsh int tcp show global
 


 ・共有フォルダのアクセスが遅い、できない場合はLanManagerの認証レベルを変更してみるといいらしい。設定は、


 「ローカルセキュリティポリシー」-「ローカルポリシー」-「セキュリティオプション」-「ネットワークセキュリティ:LAN Manager認証レベル」の値を、「NTLM応答のみ送信する」に変更。


・ネットワークスロットルを無効にする


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Multimedia\SystemProfile\

NetworkThrottlingIndex
この値をFFFFFFFFにする

・オフロードの無効化


オフロードは、ネットワーク処理の一部をCPUではなく、NICなどに任せ(オフロード)、効率を上げる仕組み。ただしこれがうまく動作しないケースもあるみたいで、ネットワークが遅い時は、オフロード機能の無効化を試す。


NICアダプタ単位で設定を変えるには、NICアダプタの構成情報から変更する








上記のOffloadとなっている項目が対象。


またHyper-V環境上の仮想OSでも、かなり性能劣化を及ぼすことがあるみたいで、オフロードの無効化が有効になるかもしれない。



・共有フォルダのアクセスでキャッシュの無効化

共有フォルダのプロトコルSMB(ServerMessageBlock)の仕様で、キャッシュに関する仕様が問題になることがある(主にサーバー環境で)。



・自動チューニング

Windows7,windows2008からの機能で、ネットワークの自動チューニング機能がある。ネットワークの性能を改善したい場合、この設定を変更することも検討する。


>netsh interface tcp set global autotuninglevel=xxx


xxの取りうる値は以下の通り。

normal:デフォルト
disabled:自動チューニング無効
highlyrestricted:デフォルトより大きく(チョッと?)
restricted:デフォルトより拡大(一部で制限あり)
experimental:restrictedの制限対応

disabled: uses a fixed value for the tcp receive window. Limits it to 64KB (limited at 65535).

highlyrestricted: allows the receive window to grow beyond its default value, very conservatively
restricted: somewhat restricted growth of the tcp receive window beyond its default value
normal: default value, allows the receive window to grow to accommodate most conditions
experimental: allows the receive window to grow to accommodate extreme scenarios (not recommended as it can degrade performance in common scenarios; only intended for research purposes. It enables RWIN values of over 16 MB)

・受信ウィンドウサイズの変更


RWIN(Recieve WINdow)の変更 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters」にある「TcpWindowSize」の値を修正することで、設定を変更できた。

・MTUの変更


>netsh interface ipv4 set interface "インターフェース名" mtu=xxxx store=persistent

MTUを変更して、有効にかどうかを確認するには


>ping [ホスト] -f -l [サイズ]


で返ってくるかどうか?で確認する。


2014年6月13日金曜日

Tips:FTPクライアントでのファイルの移動と、WindowsのIIS FTPの仮想ディレクトリ

Windows標準のFTPサーバの環境で、
 ・ディレクトリ間のデータの移動ができるのか?
 ・ドライブをまたがって移動ができるか?
ってのを調べて見る機会があたので、メモ。

結論からすると、ケースによるが、移動はできた。ポイントは以下の通り。

 ・移動というより、RNFRとRFTOコマンドで実装されているみたい。

 ・FTPクライアントでリモート側(つまりFTPサーバー)のディレクトリがツリーで表示される
  ようなものでないと、実際には使いづらい。下位のディレクトリにしか移動ができない。
  FFFTPはできなかった(最新版では試してないが)。WinSCPだとツリー表示ができた。  


 ・サーバー上で、FTPの仮想ディレクトリを使って、物理ドライブをまたがるような構成を組ん
  だ場合、ドライブをまたがる移動はできない。











  という構成を組んでいる時、FTPクライアントでDirAからDirBへのファイルの移動はできるが、
  DirAからDirCへの移動はできなかった(エラーになった)。

 ・ファイルの移動とは異なるトピックスになるが、

  上記のような仮想ディレクトリを組んでいる場合、FTPクライアントツールでは、DirA,DirB,DirC
  が表示されなかった。ただコマンドベースでアクセスする分にはアクセスができる
  (例:cd \DirBとか)。
  これはセキュリティ上の仕様だそうだ。でもこれだとつかいづらいので、、対策としては

  C:\wwwroot
     |
     ├--- DirA
     |
├--- DirB
├--- DirC
 
  という仮想ディレクトリ名と同名のディレクトリを作成すると、FTPクライアント上でも表示された。
  ディレクトリにアクセスをすると、実態のディレクトリではなく 仮想ディレクトリのほうにアクセス
  できるようになる。例えば上記のようなディレクトリを作成した場合、

  FTP > cd \DirA

  とすると、C:\wwwroot\DirAではなく、C:\tempに移動する。
  何とも不思議な仕様だ。だったら仮想ディレクトリのプロパティに、見せる・見せないという機能
  を持たせればよいのに、、

ちょっと変わった仕様なので書いてみた。


2014年6月7日土曜日

Tips:ネットワークあたりのトピックス


MSS(MaximumSegmentSize:最大セグメントサイズ)
MTU(MaximumTransmissionUnit)
MSSはTCP/IPにおいて1セグメントで送信できる最大サイズ。IPヘッダ(20バイト)、TCPヘッダ(20バイト)は含まない。
MTUは1回の転送(1フレーム)で転送できる最大サイズ。



PPPoEの場合は、ヘッダーが追加されるので、、


となる。ちなみにRWIN ( Receive Window Size ) は、ACKを待たずに送信できるサイズ。受信側のバッファサイズとなる

Nagleアルゴリズム
IPヘッダーやTCPヘッダーのオーバーヘッドを軽減することが目的。よくある例は、telnetのように1バイトずつ送信するような場合、実際にはこの1バイトにに対してIPヘッダー20バイト、TCPヘッダー20バイトが付き、計41バイト送付することになり、伝送効率が非常に悪くなる(「小さなパケット問題」)。

Nagleアルゴリズムでは、MSS以下の複数の送信メッセージを一つに束ね、まとめて送信する。特に、送信パケットで送信側が ACK を受け取っていないのがある場合、送信するに値するまで送信側はバッファリングを行い、そして、一度にまとめて送信することで、効率を上げる。送信をする条件としては

  • 未送信データが最大セグメントサイズ以上になる
  • 過去の送信パケットで ACK が未受信の物がなくなる(*)
  • タイムアウトになる

がある。これに関する各OSの設定は、以下の通り。

■Windows

 Nagleアルゴリズムを無効化するオプション
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\Parameters
  値の名前:TcpNoDelay
  値:(DWORD)0が有効、1が無効
 
■Linux

 socketオプションでTCP_NODELAYを指定し、マシンA側でNagleアルゴリズムをオフにする。

TCP遅延ACK
小さなデータを受信した際に、毎回ACKを返すのは効率が悪いので、ちょっとだけ待ち(最大500ms)、その後のデータの応答とACKをまとめて返すことで効率を上げる仕組み。ただしMSS以上のデータを受信した際には、2回目の受信でACKを返さなければならない。

がある。これに関する各OSの設定は、以下の通り。

■Windows

 TCP遅延ACKの頻度を指定する
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Interface GUID}*
  値の名前:TcpAckFrequency
  値:(DWORD) デフォルト2。変更する際は1。
  ※デフォルトでは、セグメントを2個受信したらACKを返す。1にするとセグメント毎にACKを返す(つまり
    TCP遅延ACKを無効化)。

 ACKのタイムアウト値の設定
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Interface GUID}*
  値の名前:TcpDelAckTicks
  値:(DWORD)2(200ms)がデフォルト。1-6(100-600ms)を指定できる。0,1は200msになるらしい。

■Linux

 socketオプションでTCP_QUICKACKを指定することで、遅延ACKを無効化できるみたい(でも永続的ではないよう
 なので、使用の際には注意が必要みたい)。

 もう1つ遅延ACKの送信のタイムアウトの設定は以下の設定でできるみたい。
 Redhat系:echo 1 > /proc/sys/net/ipv4/tcp_delack_min ※ミリ秒単位で指定