更新:20:14 2019/10/15 Firefox 69 ; 最後のタブを閉じてもFxを終了しない browser.tabs.closeWindowWithLastTab=false ; 検索結果を新しいタブで開く browser.search.openintab=true ; ブックマークを新しいタブを開く browser.tabs.loadBookmarksInTabs;false=true ▼Windows7 でユーザープロファイルディレクトリを移動する(ジャンクションを使う) 行儀の悪いアプリ向けに対策するならば別ドライブに作成した上でジャンクションを張る。 ユーザー名がgriffon、ユーザープロファイルをD:\Users以下に作りたい場合。 1. Administrator を有効化しログオン。 2. ディレクトリ D:\Users を作成。 3. レジストリエディターで HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList にある "ProfilesDirectory" の値を、「%SystemDrive%\Users」から「D:\Users」に変更する。 4. 新規ユーザー(この場合griffon)を作成する。 5. OSを再起動(おそらくログオフでも大丈夫だけど、念のため) 6. griffonでログオンする。この時点で D:\Users\griffon\ が作成される。 基本はここまで。 ジャンクションを張るなら続きを実施。 7. griffon をログオフし Administrator で再ログオン、コマンドプロンプトでジャンクションを作成する(下記のコマンドを実行)。 mklink /J C:\Users\griffon D:\Users\griffon 8. レジストリエディターで HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList にある "ProfilesDirectory" の値を、「D:\Users」から「%SystemDrive%\Users」に変更する。(つまり元に戻す) 9. 再起動する。 これによって一見、C:\Users\ にプロファイルがあるようだが物理的には D:\Users\ 以下にある状態となる。 複数のアカウントを作る場合は同じ事の繰り返しだが、面倒ならば "ProfilesDirectory" の値はそのままでいいかもしれない。 (ジャンクションを張るのはプロファイルディレクトリを C:\Users と決め打ちしてる行儀の悪いアプリ向け) どちらの場合も初期アカウントは C: にプロファイルを置くことになるが、どうせ Administrator で設定後は無効化するので問題ない。 共用 PC なら「パブリック」もなんとかしたいところ。 portsupgrade http://iris.homeunix.net/yayoi/freebsd/inst/portupgrade.asp ▼MySQL のバックアップ/リストア % mysqldump -A -u root -p パスワード --opt | gzip > mysql.db.gz % gzip -dc mysql.db.gz | mysql -u root -p パスワード ▼mew 5.x、6.x で O → C-uO にキーバインドが変更されたのを元に戻す方法 ===[ patch ]======================================================== --- mew-sort.el.orig Mon Jun 8 10:45:29 2009 +++ mew-sort.el Mon Jun 8 11:23:06 2009 @@ -354,7 +354,4 @@ local cache messages are packed." (interactive "P") - (if (not force) - (message (mew-substitute-for-summary - "Pack breaks search index, so pack was obsoleted. Type '\\[universal-argument]\\[mew-summary-pack]' to force pack.")) (mew-summary-only (mew-summary-local-only @@ -367,5 +364,5 @@ (message "No message")) ((or (not mew-ask-pack) (y-or-n-p (format "Pack %s? " folder))) - (mew-summary-pack-body folder))))))))))) + (mew-summary-pack-body folder)))))))))) (defun mew-summary-pack-body (folder) ==================================================================== ▼mew 5.2 + GnuPG version 2 で gpg を使う mew 6.3 では ln -s gpg2 gpg とする以外は問題なし。 鍵は既に作成済みとする。 ちなみに他の端末からインポートするならば、GnuPG2 の設定を全て整えた後に % gpg2 --import public.key % gpg2 --import private.key でインポートすると良い。 # mew-pinentry を使うので必ず GnuPG2 の設定が終わってからにすること。 確認は % gpg2 -K で秘密鍵が登録されているかをチェック。 1. GnuPG ver2 及びそれらに必要なファイル群のビルド 以下の順にビルドする。 libgpg-error-1.7.tar.gz pth-2.0.7.tar.gz libgcrypt-1.4.4.tar.gz libksba-1.0.6.tar.gz libassuan-1.0.5.tar.gz gnupg-2.0.11.tar.gz ビルドする際は ・gcc 3.4 以上をインストールしておく。 ・※Solaris のみ sh 系なら LIBS=-lrt ; export LIBS csh 系なら setenv LIBS -lrt をしておく。 オプションは特に必要なし。 configure → make → make install インストールできたら ln -s gpg2 gpg しておく。 # こうしないと mew で GnuPG が使えない。 2. mew 5.2 のビルド ビルドする前にパッチを当てる必要有り。 GnuPG ver2 ではパスフレーズの入力プロンプトが GnuPG ver1 と異なっている ため、C-c C-s などをすると "PGP signing..." で止まってしまう。 そのため、下記パッチを適用する必要がある。 http://www.mew.org/pipermail/mew-dist/2007-March/027281.html 既に mew-5.2 以上が入ってる場合は % cd SOURCE_DIR/mew-5.2/bin/ % make distclean % (patch 当てる) % ./configure % make # chmod 555 mew-pinentry ; cp mew-pinentry /usr/local/bin/ で mew-pinentry だけ更新すると良い。 # mew-6.2 も似たような感じでパッチを当てること。 パッチは Solaris 用とそれ以外用で少し違うので注意。 # パッチのファイル名参照。 ---[ SOURCE_DIR/mew-5.2/bin/mew-pinentry.in.patch ]--------------- --- mew-pinentry.in.orig 2007-01-04 15:49:17.000000000 +0900 +++ mew-pinentry.in 2009-06-12 17:09:20.000000000 +0900 @@ -8,5 +8,5 @@ # Revised: Jul 25, 2006 -PROMPT="Passphrase:" +PROMPT="Enter passphrase:" TTY=`tty` @@ -22,5 +22,12 @@ ;; "SETPROMPT") - PROMPT=$arg + case "$arg" in + Passphrase*) + # neglect + ;; + *) + PROMPT=$arg + ;; + esac ;; "GETPIN") ------------------------------------------------------------------ ※Solaris 用 ---[ SOURCE_DIR/mew-5.2/bin/mew-pinentry.in.patch-for-solaris ]--- --- mew-pinentry.in.orig 2009-06-09 16:17:25.918291000 +0900 +++ mew-pinentry.in 2009-06-09 16:30:38.298286000 +0900 @@ -1,3 +1,3 @@ -#!/bin/sh +#!/usr/xpg4/bin/sh # # mew-pinentry:: a simple pinentry @@ -8,5 +8,5 @@ # Revised: Jul 25, 2006 -PROMPT="Passphrase:" +PROMPT="Enter passphrase:" TTY=`tty` @@ -22,8 +22,15 @@ ;; "SETPROMPT") - PROMPT=$arg + case "$arg" in + Passphrase*) + # neglect + ;; + *) + PROMPT=$arg + ;; + esac ;; "GETPIN") - echo @ECHO_N@ "$PROMPT @ECHO_C@" > $TTY + echo "$PROMPT" | awk '{printf $0" "}' > $TTY stty -echo < $TTY read passwd < $TTY ------------------------------------------------------------------ % cd SOURCE_DIR/mew-5.2/bin/ % patch -p1 < mew-pinentry.in.patch 3. 設定 ~/.gnupg/gpg-agent.conf を以下の内容で作成する。 ---[ ~/.gnupg/gpg-agent.conf ]--- pinentry-program /usr/local/bin/mew-pinentry --------------------------------- ~/.emacs もしくは ~/.mew.el に次の1行を書き足す。 ---[ ~/.emacs or ~/.mew.el ]----- (setq mew-prog-pgp "gpg") --------------------------------- ~/.gnupg/gpgsm.conf に次の1行を書き足す。 ---[ ~/.gnupg/gpgsm.conf ]----- disable-crl-checks ------------------------------- ~/.gnupg/gpg.conf でおすすめの設定。 ---[ ~/.gnupg/gpg.conf ]------- keyserver hkp://pgp.nic.ad.jp hkp://keys.gnupg.net hkp://subkeys.pgp.net ### Proxy を使うときはコメントインする #keyserver-options http-proxy=http://proxy.host:port/ ------------------------------- 4. テストメールを送る 宛先は公開鍵を公開しているメールアドレスに対して送信する。 C-c C-s で署名を行う。 署名は自分自身の鍵で署名を行うのでパスフレーズが必要。 C-c C-e で本文を暗号化する。 本文暗号化は To アドレスの公開鍵で暗号化されるのでパスフレーズは問われ ない。 ★注意 ・"S/MIME sign No value" と出る場合は root CA の fingerprint が ~/.gnupg/trustlist.txt に登録されていないので、 http://www.mew.org/feature/smime.html.ja の「ルート CA を信用させる」のルールに従って trustlist.txt に登録する。 ▼Subversion のインストール with SOCKS dante インストール → neon インストール → Subversion インストール - dante-1.1.19 % ./configure % make # make install インストール後、ln -s libsocks.so libsocks5.so しておく。 - neon-0.28.4 % ./configure --enable-shared --with-socks=/usr/local --with-ssl --with-libs=/usr/local/ssl ▼Documents and Settings のコピー xcopy "H:\Documents and Settings" "G:\Documents and Settings" /D /S /E /V /C /I /F /G /H /R /K /O /X /Y ▼slide の Linux 対応パッチ ---[ Makefile ]------------------------------------ linux: FORCE $(MAKE) CFLAGS="$(CFLAGS) -DNO___PROGNAME -DNO_SNPRINTF -DUSE_SHADOW" \ CC=gcc \ LFLAGS=-lcrypt slide --------------------------------------------------- ▼Postfix の SSL 化 Postfix は既に導入されているものとする。 % make tidy % make makefiles CCARGS="-DUSE_TLS -I/usr/local/ssl/include" AUXLIBS="-L/usr/local/ssl/lib -lssl -lcrypto" ※SASL 付きならこうする↓ % make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -DUSE_TLS -I/usr/local/ssl/include -I/usr/local/include/sasl" AUXLIBS="-L/usr/local/lib -lsasl2 -L/usr/local/ssl/lib -lssl -lcrypto" % make % make upgrade インストール出来たら証明書ファイルを用意して /etc/postfix/ 以下に置いておく。 必要な証明書は ・署名済み証明書 ・証明書プライベートキーファイル となる。 ……が、Lets' Encrypt で発行されたプライベートキーファイルと証明書でも利用可能。 作成は apache の証明書作成の項目を参照。 main.cf に以下の設定を入れる。 ---[ /etc/postfix/main.cf ]------------------------ smtpd_tls_cert_file = $config_directory/server.crt smtpd_tls_key_file = $config_directory/server.key smtpd_tls_received_header = yes smtpd_tls_loglevel = 0 smtpd_tls_security_level = may --------------------------------------------------- 設定が終わったら postfix reload する。 telnet localhost 25 で EHLO localhost を発行したとき、"250-STARTTLS" が出力されるかを確認。 あとはクライアントから実際にメールを送信し、TLS 使用時と未使用時でパケットキャプチャの結果が異なる (暗号化されているか否か) ことを確認すれば more better。 ---[ No TLS ]---------------- No. Time Source Destination Protocol Info 97 12.071746 192.168.1.10 192.168.1.5 SMTP Response: 220 mail.griffonworks.net ESMTP Postfix 99 12.098032 192.168.1.5 192.168.1.10 SMTP Command: EHLO [192.168.1.5] 101 12.098482 192.168.1.10 192.168.1.5 SMTP Response: 250-mail.griffonworks.net 103 12.110204 192.168.1.5 192.168.1.10 SMTP Command: AUTH PLAIN ************************** 107 12.119038 192.168.1.10 192.168.1.5 SMTP Response: 235 2.0.0 Authentication successful 108 12.120048 192.168.1.5 192.168.1.10 SMTP Command: RSET 109 12.120392 192.168.1.10 192.168.1.5 SMTP Response: 250 2.0.0 Ok 110 12.122054 192.168.1.5 192.168.1.10 SMTP Command: MAIL FROM: 111 12.122484 192.168.1.10 192.168.1.5 SMTP Response: 250 2.1.0 Ok 112 12.124233 192.168.1.5 192.168.1.10 SMTP Command: RCPT TO: 113 12.176873 192.168.1.10 192.168.1.5 SMTP Response: 250 2.1.5 Ok 114 12.181880 192.168.1.5 192.168.1.10 SMTP Command: DATA 115 12.182263 192.168.1.10 192.168.1.5 SMTP Response: 354 End data with . 116 12.185247 192.168.1.5 192.168.1.10 SMTP Message Body 118 12.276049 192.168.1.5 192.168.1.10 SMTP EOM: . 119 12.293406 192.168.1.10 192.168.1.5 SMTP Response: 250 2.0.0 Ok: queued as 473141E701 121 12.317704 192.168.1.5 192.168.1.10 SMTP Command: QUIT 122 12.317964 192.168.1.10 192.168.1.5 SMTP Response: 221 2.0.0 Bye ----------------------------- ※暗号化されていないので AUTH の文字列が丸見え。 ---[ TLS ]------------------- No. Time Source Destination Protocol Info 85 16.431098 192.168.1.10 192.168.1.5 SMTP Response: 220 mail.griffonworks.net ESMTP Postfix 86 16.431799 192.168.1.5 192.168.1.10 SMTP Command: EHLO [192.168.1.5] 88 16.432285 192.168.1.10 192.168.1.5 SMTP Response: 250-mail.griffonworks.net 89 16.436001 192.168.1.5 192.168.1.10 SMTP Message Body 91 16.436326 192.168.1.10 192.168.1.5 SMTP Response: 220 2.0.0 Ready to start TLS 92 16.492331 192.168.1.5 192.168.1.10 SMTP Message Body 93 16.495783 192.168.1.10 192.168.1.5 SMTP Response: \026\003(以下省略) 94 16.495836 192.168.1.10 192.168.1.5 SMTP Response: \243\3659L/(以下省略) 97 16.656981 192.168.1.10 192.168.1.5 SMTP Response: \024\003\(以下省略) 98 16.657843 192.168.1.5 192.168.1.10 SMTP Message Body 99 16.658418 192.168.1.10 192.168.1.5 SMTP Response: \027\003(以下省略) 100 16.663364 192.168.1.5 192.168.1.10 SMTP Message Body 104 16.674267 192.168.1.5 192.168.1.10 SMTP Message Body 106 16.711364 192.168.1.5 192.168.1.10 SMTP Message Body 111 16.814976 192.168.1.5 192.168.1.10 SMTP Message Body 115 16.923927 192.168.1.10 192.168.1.5 SMTP Response: \027\003(以下省略) 116 16.951901 192.168.1.5 192.168.1.10 SMTP Message Body ----------------------------- ※暗号化されているので、STARTSSL した後の情報が何も見えない。 STARTSSL は HELO コマンドを発行した後に発行されるので、AUTH などの文字列も見えなくなる。 ▼SASL 認証いろいろ ◆PLAIN / LOGIN を使用する場合 ◆CRAM-MD5 を使用する場合 ※PAM認証を使うなら利用出来ない。 ※saslauthd は不要。 1. sasl2 の設定 /usr/lib/sasl2/smtpd.conf に pwcheck_method: auxprop と記述。 2. パスワード DB の作成 saslpasswd2 コマンドでパスワードデータベースを作成。 # saslpasswd2 -u DOMAIN_NAME USERNAME DOMAIN_NAME はメールアドレスのドメイン名を着けておけば ok。 初めて使用するときは /etc/sasldb2.db が出来るので、 # chmod 640 /etc/sasldb2.db # chown root:postfix /etc/sasldb2.db としておく。 sasldb2.db は # makemap -u hash /etc/sasldb2.db で中身を見ることが出来る。 # パスワードまで平文で DB 化されているので注意。 3. Mew の設定 SMTP Auth の設定を以下のように。 ("smtp-auth-list" . ("CRAM-MD5")) ("smtp-user" . "griffon@griffonworks.net") @ の前は saslpasswd2 で指定した USERNAME。 @ の後ろは saslpasswd2 で指定した DOMAIN_NAME。 ▼FreeBSD のバイナリアップグレード (6.1→6.2) ◆事前準備編 1. /etc/fstab を手元に保存しておく。 2. カーネルコンフィギュレーションファイル及び /usr/src/ 用 supfile のバックアップを取っておく。 3. /usr/local/etc/rc.d/ のスクリプトが実行されないようにしておく。 具体的には、同ディレクトリを適当な名前に変更すればよい。 ◆バックアップ編 出来ればシステム領域だけでもバックアップを取っておくこと。 ◆アップグレード編 1. アップグレードする OS の CD/FD で起動する 2. Upgrade を選択 3. アップグレードする覚悟があるかどうかを聞いてくるので [YES] 4. ディストリビューション選択で base, kernels, man, src(sys) を選択。 kernels は Generic を選択。 5. マウントポイントの設定。 取っておいた fstab の内容を元にマウントポイントを指定する。 指定は指定したいパーティションの上で M を押すとマウントポイント入力欄が出るので、 そこで Mountpoint 名を入力する。 終了したら Q で抜ける。 6. 現在の /etc を何処に保存するかを聞いてくるので、適当なディレクトリを指定する。 7. メディアを指定する。 選択したらいきなりアップグレード開始。 もう後戻りは出来ない。 8. 再起動を促されるので再起動する。 9. /etc/ の再設定を行う。 アップグレードが完了した後の /etc/ 配下はアップグレードする前の状態になっている。 新しい /etc/ は /etc/upgrade/ 配下に存在するため、手動で diff を取って /etc/ のアップグレードを行う。 % diff -urP /etc /etc/upgrade 10. 場合によってはソースディレクトリ配下を CVSup する。 supfile のリストアとタグ名の変更を忘れずに。 11. カーネルコンフィギュレーションファイルの更新。 バックアップしておいたカーネルコンフィギュレーションファイルと新しいカーネルコンフィギュレーションファイルの diff を取ってマージする。 12. 再起動 13. 正常性をチェックして終了。 ▼番外編:Solaris (SPARC) で OpenVPN 残念ながら Solaris8 では接続途中で止まります。 Solaris10 なら接続可能。 http://www.whiteboard.ne.jp/~admin2/index.php?OpenVPN%20%A4%CE%A4%BF%A4%E1%A4%CE%20Solaris%20%CD%D1%20TAP%20%A5%C9%A5%E9%A5%A4%A5%D0 ここから tuntap.tar.gz と tap.c を落としてくる。 % wget http://www.whiteboard.ne.jp/~admin2/tuntap/source/tuntap/tuntap.tar.gz % wget http://www.whiteboard.ne.jp/~admin2/tuntap/source/openvpn/tun.c % gzip -dc tuntap.tar.gz | tar xfv - ./tuntap/ ./tuntap/Makefile.in ./tuntap/configure ./tuntap/configure.in ./tuntap/if_tun.h ./tuntap/install-sh ./tuntap/tap.conf ./tuntap/tun.c ./tuntap/tun.conf % cd tuntap % ./configure checking for gcc... gcc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking for a BSD-compatible install... ./install-sh -c checking for isainfo... yes configure: creating ./config.status config.status: creating Makefile % make gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DTUN_VER=\"1.1\ 03/02/2007\" -O2 -Wall -D_KERNEL -I. -m64 -c tun.c -o tun.o -DTUNTAP_TUN gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DTUN_VER=\"1.1\ 03/02/2007\" -O2 -Wall -D_KERNEL -I. -m64 -c tun.c -o tap.o -DTUNTAP_TAP ld -r -o tun tun.o ld: warning: sparc:v9 architecture of input file `tun.o' is incompatible with sparc output make: *** [modules] Segmentation Fault (core dumped) どうやら ld がダメらしい。 "warning: sparc:v9 architecture of input file" でぐぐってみると英語サイトで ------------------------------------------------------------------------ > I am having problems with binutils. I want to build binutils so it will > generate 32-bit or 64-bit objects/executables on Solaris 9. I am using > gcc-3.4.3 which is configured to use Sun as/ld by default. That could be the problem. You should use a gcc 3.4.3 configured to use the GNU tools (see the GCC manual). > Can GNU-binutils be built to generate 32-bit or 64-bit objects/executables > using the same binaries on Solaris? Of course. I've personally never run into a single glitch with that feature. ------------------------------------------------------------------------ というのが見つかったので、とりあえず /usr/local/bin/ld の他に ld が有るかを見てみた。 % find /usr -name "ld" /usr/lib/ld ←ディレクトリ /usr/ccs/bin/ld /usr/ccs/bin/sparcv9/ld /usr/ucb/ld /usr/local/bin/ld /usr/local/sparc-sun-solaris2.8/bin/ld とりあえずかたっぱしから ld を実行する。 % /usr/ccs/bin/ld -r -o tun tun.o しょっぱなからエラー出ずで成功。 /usr/ccs/bin/ld が使えそうなので、Makefile の LD = ld を LD = /usr/ccs/bin/ld に変更して make。 % make gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DTUN_VER=\"1.1\ 03/02/2007\" -O2 -Wall -D_KERNEL -I. -m64 -c tun.c -o tun.o -DTUNTAP_TUN gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DTUN_VER=\"1.1\ 03/02/2007\" -O2 -Wall -D_KERNEL -I. -m64 -c tun.c -o tap.o -DTUNTAP_TAP /usr/ccs/bin/ld -r -o tun tun.o /usr/ccs/bin/ld -r -o tap tap.o 正常にビルドできたのでインストール。 # make install /usr/ccs/bin/ld -r -o tun tun.o /usr/ccs/bin/ld -r -o tap tap.o ./install-sh -c -m 644 -o root -g root if_tun.h /usr/include/net ./install-sh -c -m 644 -o root -g root tun /usr/kernel/drv/sparcv9 ./install-sh -c -m 644 -o root -g root tap /usr/kernel/drv/sparcv9 ./install-sh -c -m 644 -o root -g root tun.conf /usr/kernel/drv ./install-sh -c -m 644 -o root -g root tap.conf /usr/kernel/drv /usr/sbin/rem_drv tun >/dev/null 2>&1 /usr/sbin/rem_drv tap >/dev/null 2>&1 /usr/sbin/add_drv tun /usr/sbin/add_drv tap あとは OpenVPN のビルド。 tuntap 用 tap.c の適用を忘れないこと。 % gzip -dc openvpn-2.0.9.tar.gz | tar xfv - % cd openvpn-2.0.9 % cp tun.c tun.c.org % cp ../tun.c ./tun.c % ./configure --disable-lzo --with-ssl-lib=/usr/local/ssl/lib \ --with-ssl-headers=/usr/local/ssl/include % make # make install ▼再帰要求の拒否設定 = BIND 8 の場合 named.conf の options {}; 内に次の行を追加。 recursion no; fetch-glue no; allow-recursion { 127.0.0.1; /* ↓自ネットワーク */ 192.168.1.0/24; }; = BIND 9 の場合 named.conf の options {}; 内に次の行を追加。 recursion no; //↓view で内外を分離してない場合は必要。 // view で分離している場合は外側の view に対して recursion no; だけで良い。 allow-recursion { 127.0.0.1; /* ↓自ネットワーク */ 192.168.1.0/24; }; 出来るだけ外部のネットワークから確認。 out-network% nslookup Default Server: localhost Address: 127.0.0.1 > set norecurse <---- 再帰問い合わせをしないようにする > set all Default Server: localhost Address: 127.0.0.1 Set options: nodebug defname search norecurse <---- 確認 nod2 novc noignoretc port=53 querytype=A class=IN timeout=5 retry=2 root=f.root-servers.net. domain=griffonworks.net srchlist=griffonworks.net > server 211.18.200.178 <---- nameserver を変更 Default Server: mail.ren.info Address: 211.18.200.178 Aliases: 178.200.18.211.in-addr.arpa > www.ren.info. Server: mail.ren.info Address: 211.18.200.178 Aliases: 178.200.18.211.in-addr.arpa Name: ns001.ren.info <----+-- 名前解決出来ることを確認 Address: 211.18.200.178 <----+ Aliases: www.ren.info <----+ > www.google.co.jp. Server: mail.ren.info Address: 211.18.200.178 Aliases: 178.200.18.211.in-addr.arpa Name: www.google.co.jp 172.23.96.79 netmask 0xffffffff Opened by PID 714 # netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 172.23.96.79 UGS 0 0 tun0 # cat /etc/resolv.conf domain griffonworks.or.jp nameserver 210.196.3.183 確認が終わったら外の世界との疎通確認をする。 ping などを打てばよいだろう。 疎通確認が出来たら CTRL+C で終了。 ---[ /var/log/ppp.log ]----------------------------- Sep 14 17:26:32 lancer ppp[774]: Phase: Caught signal 2, abort connection(s) Sep 14 17:26:32 lancer ppp[774]: Phase: deflink: open -> lcp Sep 14 17:26:32 lancer ppp[774]: Phase: bundle: Terminate Sep 14 17:26:32 lancer ppp[774]: Phase: deflink: Disconnected! Sep 14 17:26:32 lancer ppp[774]: Phase: deflink: lcp -> logout Sep 14 17:26:32 lancer ppp[774]: Phase: deflink: Disconnected! Sep 14 17:26:32 lancer ppp[774]: Phase: deflink: logout -> hangup Sep 14 17:26:32 lancer ppp[774]: Phase: deflink: Connect time: 46 secs: 728 octets in, 727 octets out Sep 14 17:26:32 lancer ppp[774]: Phase: deflink: 13 packets in, 13 packets out Sep 14 17:26:32 lancer ppp[774]: Phase: total 31 bytes/sec, peak 112 bytes/sec on Wed Sep 14 17:25:52 2005 Sep 14 17:26:32 lancer ppp[774]: Phase: deflink: hangup -> closed Sep 14 17:26:32 lancer ppp[774]: Phase: bundle: Dead Sep 14 17:26:32 lancer ppp[774]: Phase: PPP Terminated (normal). ---------------------------------------------------- これで Bluetooth 経由でのダイヤルアップは終了。 ネットワークの設定や Default Route、resolv.conf の確認。 # netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 10.71.3.1 UGS 0 0 fxp0 # cat /etc/resolv.conf domain griffonworks.or.jp nameserver 192.168.1.253 # ifconfig tun0 tun0: flags=8010 mtu 1500 ▼ネットワーク経由の dump/restore % dump -0ua -f [HOSTNAME]:[FILENAME] [PARTITION] PARTITION: dump を取りたいパーティション (例:/usr) HOSTNAME : dump を保存するホスト名 FILENAME : dump を保存するファイル名 (touch で 0バイトのファイルを作成しておくこと) dump 保存先には、ホームディレクトリに .rhosts を作成しておく。 書式:IPアドレス[TAB]+ 例) 10.71.3.180 + また、inetd.conf の shell を有効にしておく。 ssh を使う場合は以下のように。 % dump -0au -f - [PARTITION] | gzip | ssh [YourAccount]@[HOSTNAME] dd of=[OUTPUT_FILE] 例) dump -0au -f /usr | gzip | ssh griffon@leviathan.griffonworks.net dd of=./var.dump.gz ssh を使う場合は shell を有効にする必要は無い。 リストア (今回はリスト表示) は ssh 経由だと以下のようにする。 例) # ssh [YourAccount]@[HOSTNAME] dd if=[OUTPUT_FILE] | gzip -dc - | restore -t -f - ※ -t:ファイルリスト表示。 リストア実行をする場合は -r にする。 ※ Fixit では gzip -dc が "No such file or directory" になるので、代用で zcat とする。 実際には以下のように実行する。 # pwd / # ssh griffon@leviathan dd if=/home/griffon/root.dump.gz | gzip -dc - | restore -r -v -f - # cd /var # pwd /var # ssh griffon@leviathan dd if=/home/griffon/var.dump.gz | gzip -dc - | restore -r -v -f - # cd /usr # pwd /usr # ssh griffon@leviathan dd if=/home/griffon/usr.dump.gz | gzip -dc - | restore -r -v -f - ◆Fixit を使ってネットワークリストアを行ってみる 空の HDD にリストアを行う場合、Fixit ディスクを使ってリストアを行うことになる。 仮にバックアップをファイルとして別 PC に保存してあり、ssh か rsh が使用できるならばネットワークリストアが可能となる 1. CD ブートする。 ブートイメージは FreeBSD のインストールイメージ Disc-1。 2. スライスを切る。 Custom → Partition でスライスを設定し、Q で抜ける。 ※ここで W で書き込みを行うと、ラベルの書き込みで "Unable to find device node for /dev/ad0s1b in /dev! The creation of filesystems will be aborted." などと言われる。 ブートセクタは適当に。 非対話式でスライスを切るならば % fdisk -BI -v /dev/ad0 -B: ディスクのセクタ 0 に含まれるブートコードを再初期化する。 -I: 単一の FreeBSD スライスがディスク全体となるように、セクタ 0 の内容を初期化する。 -v: 詳細情報表示。 3. ラベルを書く。 Label でラベリングを行い、W で書き込む。 正常ならば newfs が行われる。 newfs が行われてラベル設定に戻ったら Q で抜ける。 非対話式で行うならば % fdisk -B ad0s1 % bsdlabel -e -B ad0s1 -w: 標準的なラベルを書き込む。(obsolete) -B: ブートストラップコードを書き込む。 -e: ラベルを編集する。 ・bsdlabel ad0s1 だけすると現在の割り当てが出る。数値の単位はセクタ。 ・size には K/M/G が使用可能。 また、* を指定することで残容量を勝手に割り当ててくれるので、「最後のパーティションに全部」をするときに使うと良い。 ・offset は先頭以外は * を設定すれば勝手に計算してくれる。 ・fstype は unused にしておけば newfs で勝手に 4.2BSD にしてくれる。 ・[fsize bsize bps/cpg] は空白にしておく。 ・c: はディスク全体をサスので触らないこと。 4. Fixit → CDROM/DVD を選択する。 5. 現在のディスク状況を確認する。 ラベリングが終わったら自動的に /mnt にマウントされているので、df か mount で確認しておく。 6. ifconfig でネットワーク設定を行う Fixit# ifconfig [IF_NAME] inet [IP_ADDRESS] netmask [SUBNETMASK] 設定したら ping が飛ぶかを確認。 7. known_hosts 格納ディレクトリの作成。 Fixit# mkdir -p /root/.ssh 8. リストア対象のディレクトリに移動。 Fixit# cd /mnt 移動を忘れるととんでもない所に展開されるので注意!! 9. known_hosts の作成 Fixit# ssh [USERNAME]@[HOSTNAME] を実行して念のため /root/.ssh/known_hosts を更新しておく。 10. リストア開始。 Fixit# ssh [USERNAME]@[HOSTNAME] dd if=[DUMP_FILE] | zcat | restore -rv -f - でリストアを行う。 / (/mnt) のリストアが終わったら更に下層のディレクトリもリストアする。 Fixit# cd /mnt/var Fixit# ssh (以下略) 11. Fixit を抜けて再起動、HDD から起動する。 ▼Postfix でネットワーク Reject postconf -m の結果に cidr が出力されていれば使用可能。 # Postfix 2.x.x であれば普通に使えたはず。 使い方は aaa.bbb.ccc.ddd/netmask REJECT (Comment) というテキストファイルを用意し、Client Reject するのであれば、main.cf に check_client_access cidr:/etc/postfix/spam_network.cidr, と書く。 CIDR テーブルは postmap の必要はないが、postfix reload が必要。 テスト方法: % postmap -q "STRINGS" cidr:/etc/postfix/spam_network.cidr STRING は例えば記述したネットワークアドレスの範囲に入っている IP アドレスを指定してみる。 一致すれば一致した行を出力し、一致しなければ何も出力されない。 ▼phpMyAdmin * PHP5 ./configure --with-zlib --enable-ftp --enable-mbstring --enable-mbregex --enable-sockets --with-apxs=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql --with-mcrypt --with-gd m4 bison libxml2 ftp://xmlsoft.org/libxml2/ もインストールしておく。 * libmcrypt 基本:./configure --disable-nls --disable-posix-threads Solarisで?:./configure --disable-nls --disable-posix-threads --enable-dynamic-loading --disable-static 設定: $cfg['blowfish_secret'] に適当なパスフレーズを設定する。 $cfg['Servers'][$i]['auth_type'] を 'cookie' にする。 これで cookie ベースの認証が ok。 ▼nessus 関連 Q. nessus-fetch の Proxy 設定は? A. etc/nessus/nessus-fetch.rc に以下 2行を追加。 proxy=proxy.example.com proxy_port=8080 ▼仮想ディスクを使う 今回は 100MB と 50MB のディスクイメージを作成してマウントする。 複数のディスクイメージをマウントすることも可能。 まずはイメージの作成と仮想ディスクの割り当て。 ~/ # dd if=/dev/zero of=disk1.img bs=1k count=100000 ~/ # dd if=/dev/zero of=disk2.img bs=1k count=50000 ~/ # mdconfig -a -t vnode -f disk1.img md0 ~/ # mdconfig -a -t vnode -f disk2.img md1 ~/ # mdconfig -l md0 md1 ~/ # mdconfig -l -u md0 md0 vnode 98M /usr/home/griffon/disk1.img ~/ # mdconfig -l -u md1 md1 vnode 49M /usr/home/griffon/disk2.img 次に fdisk でスライスを切る。 ~/ # fdisk md0 ******* Working on device /dev/md0 ******* parameters extracted from in-core disklabel are: cylinders=12 heads=255 sectors/track=63 (16065 blks/cyl) parameters to be used for BIOS calculations are: cylinders=12 heads=255 sectors/track=63 (16065 blks/cyl) fdisk: invalid fdisk partition table found Media sector size is 512 Warning: BIOS sector numbering starts with sector 1 Information from DOS bootblock is: The data for partition 1 is: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 63, size 192717 (94 Meg), flag 80 (active) beg: cyl 0/ head 1/ sector 1; end: cyl 11/ head 254/ sector 63 The data for partition 2 is: The data for partition 3 is: The data for partition 4 is: ~/ # fdisk -BI -v md0 ******* Working on device /dev/md0 ******* fdisk: invalid fdisk partition table found fdisk: Geom not found ~/ # ls -lFa /dev/md0* crw-r----- 1 root operator 0, 91 Feb 28 13:27 /dev/md0 crw-r----- 1 root operator 0, 93 Feb 28 13:14 /dev/md0s1 bsdlabel でパーティションの作成。 ~/ # bsdlabel md0s1 disklabel: /dev/md0: no valid label found ~/ # bsdlabel -w md0s1 ~/ # bsdlabel md0s1 # /dev/md0s1: 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 192701 16 unused 0 0 c: 192717 0 unused 0 0 # "raw" part, don't edit ~/ # ls -lFa /dev/md0* crw-r----- 1 root operator 0, 91 Feb 28 13:27 /dev/md0 crw-r----- 1 root operator 0, 93 Feb 28 13:28 /dev/md0s1 crw-r----- 1 root operator 0, 95 Feb 28 13:14 /dev/md0s1a crw-r----- 1 root operator 0, 96 Feb 28 13:14 /dev/md0s1c 間違って例えば「md0s1 ではなく md0 に disklabel -w をしてしまった」などで /dev/md0* がえらいことになったら、以下の順に dd でディスク情報を消去する。 ~/ # ls -lFa /dev/md0* crw-r----- 1 root operator 0, 91 Feb 28 13:33 /dev/md0 crw-r----- 1 root operator 0, 98 Feb 28 13:14 /dev/md0a crw-r----- 1 root operator 0, 99 Feb 28 13:14 /dev/md0c crw-r----- 1 root operator 0, 102 Feb 28 13:14 /dev/md0cs1 crw-r----- 1 root operator 0, 103 Feb 28 13:14 /dev/md0cs1a crw-r----- 1 root operator 0, 104 Feb 28 13:14 /dev/md0cs1c crw-r----- 1 root operator 0, 97 Feb 28 13:14 /dev/md0s1 crw-r----- 1 root operator 0, 100 Feb 28 13:14 /dev/md0s1a crw-r----- 1 root operator 0, 101 Feb 28 13:14 /dev/md0s1c ~/ # dd if=/dev/zero of=/dev/md0s1 bs=512 count=32 ~/ # dd if=/dev/zero of=/dev/md0 bs=512 count=32 あとは fdisk からやり直し。 デフォルトパラメータを書き込んだらパーティションの分割を行う。 ~/ # disklabel -e md0 # /dev/md0s1: 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 192701 16 unused 0 0 c: 192717 0 unused 0 0 # "raw" part, don't edit 設定は vi によりテキストファイルを記述して行う方法。 以下のようにしてみた。 # /dev/md0s1: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 192717 0 unused 0 0 # "raw" part, don't edit d: 50M * unused 0 0 e: 30M * unused 0 0 f: * * unused 0 0 * は fdisk で勝手に計算させる識別子。 詳しくは bsdlabel(8) の「保存されたファイルの書式」を参照。 変更が終わったら保存する。 確認。 ~/ # disklabel md0s1 # /dev/md0s1: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 192717 0 unused 0 0 # "raw" part, don't edit d: 102400 16 unused 0 0 e: 61440 102416 unused 0 0 f: 28861 163856 unused 0 0 仮想ディスクの初期化。 ~/ # newfs /dev/md0s1d /dev/md0s1d: 50.0MB (102400 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 12.52MB, 801 blks, 1664 inodes. super-block backups (for fsck -b #) at: 160, 25792, 51424, 77056 ~/ # newfs /dev/md0s1e /dev/md0s1e: 30.0MB (61440 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 7.52MB, 481 blks, 1024 inodes. super-block backups (for fsck -b #) at: 160, 15552, 30944, 46336 ~/ # newfs /dev/md0s1f /dev/md0s1f: 14.1MB (28860 sectors) block size 16384, fragment size 2048 using 4 cylinder groups of 3.53MB, 226 blks, 512 inodes. super-block backups (for fsck -b #) at: 160, 7392, 14624, 21856 もう一度確認。 ~/ # disklabel md0s1 # /dev/md0s1: 8 partitions: # size offset fstype [fsize bsize bps/cpg] c: 192717 0 unused 0 0 # "raw" part, don't edit d: 102400 16 4.2BSD 2048 16384 6408 e: 61440 102416 4.2BSD 2048 16384 3848 f: 28861 163856 4.2BSD 2048 16384 1808 fstype が 4.2BSD になっている。 ~/ # mkdir -p /mnt/disk1 /mnt/disk2 ~/ # mount /dev/md0 /mnt/disk1 ~/ # mount /dev/md1 /mnt/disk2 ~/ # df Filesystem 1024-blocks Used Avail Capacity Mounted on /dev/md0 96654 4 88918 0% /mnt/disk1 /dev/md1 48190 4 44332 0% /mnt/disk2 ディスクのマウント。 ~/ # mkdir -p /mnt/disk0/d /mnt/disk0/e /mnt/disk0/f ~/ # mount /dev/md0s1d /mnt/disk0/d ~/ # mount /dev/md0s1e /mnt/disk0/e ~/ # mount /dev/md0s1f /mnt/disk0/f ~/ # df Filesystem 1024-blocks Used Avail Capacity Mounted on /dev/md0s1d 49326 4 45376 0% /mnt/disk0/d /dev/md0s1e 29486 4 27124 0% /mnt/disk0/e /dev/md0s1f 13708 4 12608 0% /mnt/disk0/f ▼ネットワークブートの FreeBSD 設定 PXE boot するには tftp と NFS が使えることが条件。 動作的には 1. PXE ROM が DHCP を探す 2. DHCP で指定されたサーバーから、DHCP の filename で指定されたファイルを tftp で取得 3. NFS client 機能により DHCP の root-path で指定された NFS マウントポイント をマウントする となる。 ・カーネル再構築 options MD_ROOT options NFSCLIENT options NFSSERVER options NFS_ROOT device md が有効になっていない場合は有効にして再構築する。 NFS_ROOT がモジュール化されていないので kldload が使えない。 また、これらを有効にしてないとオプション依存でビルドできない。 ・DHCP の用意 ---[ dhcpd.conf ]--------------- default-lease-time 1800; max-lease-time 7200; ddns-update-style none; authoritative; log-facility local7; allow bootp; allow booting; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.210 192.168.1.219; option domain-name "griffonworks.or.jp"; option domain-name-servers 192.168.1.10; option routers 192.168.1.253; option broadcast-address 192.168.1.255; option subnet-mask 255.255.255.0; option netbios-name-servers 192.168.1.10; option netbios-node-type 8; group { # 以下3行はおまじない。 option vendor-class-identifier "PXEClient"; option vendor-encapsulated-options 01:04:00:00:00:00; if exists dhcp-parameter-request-list { append dhcp-parameter-request-list 150; } # inetd.conf の tftpd のオプションで指定したディレクトリの下にファイルを置く。 filename "pxeboot"; # host ブロックには端末固有の設定を書く。 host vmware { # IP アドレスと MAC アドレスを書かないと PXE boot しません。 hardware ethernet 00:0C:29:94:BE:94; # PXE ブートした端末で利用する NFS マウントポイント。 # host ブロックで個別に設定してやらないと、同じマウントポイントを使 # ってしまうので注意。 option root-path "192.168.1.10:/nfsroot"; } } } -------------------------------- ・tftpd の設定 /etc/inetd.conf の以下の行を有効化。 ---[ /etc/inetd.conf ]------------------------- tftp dgram udp wait root /usr/libexec/tftpd tftpd -s /tftpboot ----------------------------------------------- 有効化したら inetd を kill -HUP しておく。 /tftpboot/ を作成するか、適当なディレクトリにリンクを張る。 今回は /pub2/tftpboot/ に pxeboot を置き、/ からそれにリンクを張った。 ~/ # mkdir -p /pub2/tftpboot/ ~/ # ln -s /pub2/tftpboot /tftpboot pxeboot は稼動している FreeBSD 機の /boot/ に有るファイルをコピーする。 ~/ # cp /boot/pxeboot /tftpboot PXE は tftp で取得した pxeboot でカーネルをロードするが、pxeboot そのもの は tftpd で指定されたディレクトリにある pxeboot を使う。 設定が終わったらコマンドラインでテストをしてみる。 ~/ # tftp localhost tftp> get pxeboot Received 158309 bytes in 0.1 seconds ここでファイルを取得できない場合は、hosts.allow にアクセス制限を追加して Allow にする。 - /etc/hosts.allow tftpd : ALL 取得できたらカレントディレクトリにファイルが出来るはずなので確認する。 ~/ # ls -l pxeboot -rw-r--r-- 1 root wheel 157696 1 26 14:09 pxeboot ・テスト起動 PXE boot 出来る PC を用意する。 今回は IBM ThinkPad X22 を使用した。 念のためディスクを取り外して電源を入れると勝手に PXE boot する。 DHCP から情報を受け取って TFTP... と出たら OK。 can't 〜 kernel とか出るが(゚ε゚)キニシナイ!! 電源はそのままぶつっと切ってしまってかまわない。 流石ディスクレスだ。 即時電源断でもなんともないぜ! ・NFS 設定 詳しくは exports(5) 参照。 ---[ /etc/exports ]-------------------------------------- # マウントポイント /nfsroot を NFS として解放する。 # -maproot=root NFS クライアントで root ユーザーが書き込みを行おうとす # る際に使用される uid:gid を設定。 # -network アクセス許可を行うネットワーク。-mask と同時に使用する。 /nfsroot -maproot=root -network 192.168.1.0 -mask 255.255.255.0 --------------------------------------------------------- -maproot は NFS_ROOT オプション付きでカーネルを構築していないと利用不可。 そうでない場合は PXE boot での NFS マウント時にタイムアウトする。 ---[ /etc/rc.conf ]-------- rpcbind_enable="YES" nfs_server_enable="YES" mountd_enable="YES" --------------------------- "rpcbind: cannot create socket for udp6" のエラーが気になるなら - /etc/netconfig udp6 tpi_clts v inet6 udp - - tcp6 tpi_cots_ord v inet6 tcp - - 上の udp6、tcp6 をコメントアウト。 デーモン起動。 ~/ # /etc/rc.d/rpcbind start ~/ # /etc/rc.d/nfsd start ~/ # /etc/rc.d/mountd start ~/ # ps ax | grep rpcbind 1055 ?? Ss 0:00.02 /usr/sbin/rpcbind ~/ # ps ax | grep nfsd 1094 ?? Ss 0:00.03 nfsd: master (nfsd) 1095 ?? S 0:00.00 nfsd: server (nfsd) 1096 ?? S 0:00.00 nfsd: server (nfsd) 1097 ?? S 0:00.00 nfsd: server (nfsd) 1098 ?? S 0:00.00 nfsd: server (nfsd) ~/ # ps ax | grep mountd 1069 ?? Is 0:00.01 /usr/sbin/mountd -r exports ファイルを変更したときは mountd を kill -HUP。 ~/ # kill -HUP `cat /var/run/mountd.pid` kill -HUP した後は /var/log/messages でエラーが出ないかを確認。 書式間違いなどあればエラーが出る。 ・マウントするイメージファイルの作成  「▼仮想ディスクを使う」を参照。 ・NFS サーバーでマウントポイントを提供する NFS サーバーで N.b.FreeBSD (Network Boot FreeBSD) が使用する / ポイントを 提供する設定を行う。 実際にマウントするファイルは後述する mdconfig で構築された vnode 疑似ディ スクデバイス (以下 rootfs.img)。 showmount で確認する。 ~/ # showmount -e localhost Exports list on localhost: /nfsroot 192.168.23.0 疑似ディスクをマウントする。 ~/ # mount /dev/md0s1d /nfsroot rootfs.img は N.b.FreeBSD クライアントからアクセスされるので、NFS の設定で 指定した場所にマウントすること。 ・ディレクトリ作成 とりあえず必要なファイルは全てコピーしておく。 可能であれば / # tar cfv - DIRNAME | ( cd /netboot ; tar xfp - ) でコピーを行う方が良いかもしれない。 dump と restore を使ってコピーをするのも可。 ・デバイスの作成 ~/ # cd /netboot /netboot # mkdir dev ; cd dev /netboot/dev # cp /dev/MAKEDEV* . /netboot/dev # ./MAKEDEV all ttyv? が root しかアクセスできないようになっているのでパーミッションを変更する。 /netboot/dev # chmod 666 ttyv? ・/ に kernel を置く chflags は扱わずそのままコピーするだけで OK。 ただし、初めのうちは GENERIC カーネルを使うようにすること。 まず GENERIC カーネルで正常に起動できる事を確認した後、カスタムカーネルを使うと障害切り分けがし易い。 ~/ # cd /netboot /netboot # cp /kernel.GENERIC ./kernel ・設定ファイルの変更など - /boot/loader.rc とりあえず何も無しで。 - /etc/fstab # Device Mountpoint FStype Options Dump Pass# 192.168.1.10:/netboot / nfs rw 0 0 ・起動してみる ・rc.diskless2 の変更 既存の rc.diskless2 は個人的には望むべき動作をしない。 そこで少し改修することにした。 改修点は以下の通り。 ・/usr をマウントするために mount -a をしている部分は削除。 → 192.168.1.10:/netboot に /usr もあるため。 ・/tmp を強制的に MFS にする。 ・/dev を強制的に MFS にする。 ただし、既存の /dev 情報を使用するので、必ず /dev 配下の構築は済ませておくこと。 ▼2つの ISP でマルチホームをやってみる 用意するもの ・ルーター 2台 ・鯖 1台 (NIC は 1枚でかまわない) ・ISP の契約 2カ所 現在の ADSL/光では 1回線につき同時に 2セッションを張ることが出来る。 そこで、これを利用してマルチホームとして使用する。 具体的には ipfw の fwd を使用する。 ネットワーク構成 ISP-A 用ルーター IP address: 192.168.1.254 ISP-B 用ルーター IP address: 192.168.1.253 鯖 IP address : 192.168.1.10 IP address(alias): 192.168.1.12 Default Gateway : 192.168.1.254 1. カーネルの再構築 ipfirewall の機能を使用するので、これのオプションをつけて再構築を行う。 具体的には以下の行を追加。 # IPFIREWALL support options IPFIREWALL #firewall options IPFIREWALL_VERBOSE #enable logging to syslogd(8) options IPFIREWALL_FORWARD #enable transparent proxy support options IPFIREWALL_DEFAULT_TO_ACCEPT #allow everything by default ※今回は ipfw でフィルタリングを行うわけではないので IPFIREWALL_DEFAULT_TO_ACCEPT としておく。 変更し終わったら再構築してインスコして再起動。 2. NIC に対して IP アドレスを alias で追加する マルチホーム用に IP アドレスが 2つ必要になるが、今回は arp との兼ね合いもあるので alias で IP アドレスを追加する。 変更前: vr0: flags=8843 mtu 1500 inet 192.168.1.10 netmask 0xffffff00 broadcast 192.168.1.255 ether 00:90:cc:02:03:ec media: Ethernet autoselect (100baseTX ) status: active % ifconfig vr0 inet 192.168.1.12 netmask 255.255.255.255 ※同一ネットワーク上に alias を作成するため、netmask は /32 にする事。 変更後: vr0: flags=8843 mtu 1500 inet 192.168.1.10 netmask 0xffffff00 broadcast 192.168.1.255 追加→ inet 192.168.1.12 netmask 0xffffffff broadcast 192.168.1.12 ether 00:90:cc:02:03:ec media: Ethernet autoselect (100baseTX ) status: active 3. ポートフォワーディングの設定@ルーター 1台目のルーターからは 192.168.1.10 にポートフォワードし、2台目からのルーターは 192.168.1.12 にポートフォワードする。 今回は Port-80/TCP を各々の IP アドレスに向けておく。 4. ipfw の設定 設定を間違うと鯖から見切られるので、root の cron に */5 * * * * /sbin/ipfw -f flush などと書いておけば幸せになれるかもしれない。 # flush する時間は設定作業を見越して設定しておく。 こうすることで、鯖から見切られても一定時間で flush してくれるので鯖にアクセス可能となる。 設定がうまくいったら cron の設定を消しておこう。 実際の設定 (/etc/firewall.conf) ------------------------------------------- #!/bin/sh ## ルール初期化 ipfw -f flush ## localhost 用ダミー # これを入れておかないと localhost にアクセスしたときに fwd で指定した NextHop を経由して繋がらなくなる。 /sbin/ipfw add 100 allow ip from 127.0.0.1 to 127.0.0.1 ## ISP-B から入ってきたパケットの戻り経路 /sbin/ipfw add 1000 fwd 192.168.1.253 tcp from 192.168.1.12 to not 192.168.1.0/24 out ------------------------------------------- これで ・ISP-A から入ってきたパケットは Default Gateway の 192.168.1.254 に行く ・ISP-B から入ってきたパケットは 戻りパケットの発信元が 192.168.1.12 のため、fwd で指定した 192.168.1.253 に出てゆく。 マルチホームを構築するときに注意する点としては、 「通信は Src と Dst しか決まっておらず、戻り道は Dst のルーティングに依存する。」 という事。 つまり、外から入ってきたパケット (Src) は鯖 (Dst) に到達する物の、帰り道は鯖 (Dst) のルーティング (ここでは DefaultGateway) に依存する。 ここで fwd ルールを作っておかないと、入り口と出口の ISP が別になって戻り先ホストで不整合が発生する。 これを勘違いしていて「Dst に入ってきたパケットは必ず Src に戻るはず!」と思っているとえらいめに遭うので注意。 【番外編】 ipfw のルールマッチである「上方優先」に気を付けること。 ipfw はルールの上 (数字の小さい順) にルールチェックを行い、ルールがマッチした時点でルールチェックを終了する。 間違って一番上に allow any to any などと書いてしまった場合はそこでルールチェックが終了してしまい続きのルールチェックが行われないので、ルールの記述順序には気を付けること。 ・鯖から出ていくパケットの行き先決定方法 鯖から外の Port-80/TCP に向けて出ていくパケット (例えばパターンファイルを wget で取得するときなど) を ISP-B 経由にするには、以下のルールを適用する。 ## ISP-B に出ていくパケット用 # 自分自身から 192.168.1.0/24 のネットワーク以外への Port-80/TCP への外向けアクセスは 192.168.1.253 へ Forward する /sbin/ipfw add 1010 fwd 192.168.1.253 log tcp from me to not 192.168.1.0/24 80 out not の使い方で注意する点は、「not は IP アドレスのみに適用される」という事。 ここでは「not IP_ADDRESS PORT out」となっているが、これは「192.168.1.0/24 のネットワーク以外の、Port-80 への外向け通信」ということであり、決して「192.168.1.0/24 Port-80 の外向け通信以外」ではない。 ・特定のホスト/ネットワークに対しては適用を除外する方法 「鯖から出ていくパケットの行き先決定方法」に関係するが、特定のホストもしくはネットワークに対しては Default Gateway を利用したい場合がある。 その場合は「鯖から出ていくパケットの行き先決定方法」で記述したルールの場所よりも上に以下のように記述する。 ## ルール除外 # 自分自身から出ていくパケットの内、IP_ADDRESS に出ていくパケットはルールにマッチする (マッチした時点で終了) /sbin/ipfw add 520 allow log ip from me to IP_ADDRESS out IP_ADDRESS はネットワークでもかまわないし、ポートを指定することも可能。 ▼atacontrol で RAID 〜 総合 FreeBSD 4.6-RELEASE から ata(4) と atacontrol(8) で RAID 構成可能に。 http://www.freebsd.org/ja/releases/4.6R/relnotes-i386.html#AEN137 FreeBSD 4.8-RELEASE からパッチ適用で addspare が使えるように。 http://www.ish.org/FreeBSD/ata-raid.html FreeBSD 5.x-RELEASE では spare が普通に使える。 5.xR FreeBSD 5.x-RELEASE 4.xR FreeBSD 4.x-RELEASE (4.8R にドライバパッチを当てていない物含む) 4.8R+P FreeBSD 4.8-RELEASE に ATA ドライバパッチを当てた物 ata(4) と atacontrol(8) を使って RAID を構築することが出来るようになったので、今回は RAID-1 を構築してみる。 ata(4) ドライバは、Promise などの「本物」の ATA RAID 機能が無い極普通の IDE ポートでも RAID を構築できるが、その場合は少しばかり制限が付く。 ・システム起動のサポートは RAID-0、もしくは「本物」の ATA RAID コントローラーに接続されたアレイからのみ。 ・[4.xR のみ] atacontrol delete (RAID 構成の解除) を実行したとき、RAID 構成を示すマジックナンバーが削除されないので、HDD を使い回そうとしたときに ar の片割れとして認識されるので単体では使用不可能。 dd で完全削除したら使えるかもしれない。 ・[4.xR のみ] ディスクを交換しても、交換対象が spare にならない。 今回は GIGABYTE GA-BX2000+ にオンボードの Promise ATA66 コントローラー "Ultra66" (否 RAID コントローラー "FastTrack66") を使って RAID-1 を組んでみる。 ハードウェアと名称の対比は以下の通り。 ------------------+----------------------- マザーボード上の | シルク印刷 | 名称 ------------------+----------------------- IDE-1 | チャンネル (channel) 0 IDE-2 | チャンネル (channel) 1 ATA66-1 | チャンネル (channel) 2 ATA66-2 | チャンネル (channel) 3 ------------------+----------------------- チャンネル番号は atacontrol list で確認できる。 ついでにどこのチャンネルにどのデバイスが繋がっていて、デバイス名までわかる。 ------------------+----------------------- マザーボード上の | シルク印刷と場所 | デバイス名 ------------------+----------------------- ATA66-1 の Master | ad4 ATA66-1 の Slave | ad5 ATA66-2 の Master | ad6 ATA66-2 の Slave | ad7 ------------------+----------------------- デバイス名は atacontrol list で確認できる。 用語: チャンネル (channel) マザーボード上、もしくは RAID カード上に存在する IDE コネクタのこと。 アレイ 複数のディスクを集めたもの。 RAID 化した HDD の集まりをまとめてこう呼ぶ。 ホットスワップ システム稼働中 (電源投入中) においてもデバイスの挿抜を行うこと。 コールドスワップ システムを止めて (電源を切って) デバイスの挿抜を行うこと。 実際に atacontrol を使っての RAID 構築をする前に気をつけなければならないことがある。 それは「FreeBSD の 5系と 4系では atacontrol の仕様が違う」という点だ。 FreeBSD 5系では atacontrol はかなり便利になっているようだが、FreeBSD 4系、特に 4.7R までの物には非常に癖がある。 # 4.8R 以降は ATA ドライバパッチを適用すれば 5系とほぼ同様に扱える。 まず、FreeBSD 5系では ・ホットスワップによる交換が可能 ・コールドスワップに限り同一チャンネル上でのアレイ構築が可能 だが、4.xR の癖とは以下の通り。 1つめは「ホットスワップそのものが行えない」。 これは 4.xR の atacontrol に問題があり、4.xR では交換した HDD をアレイに組み込むには、一度アレイを解除してチャンネルの detach → attach を行う必要がある。 アレイを解除することはシステムからアクセスするべきデバイスが無くなることと同一なので、そのデバイスにアクセスが発生した瞬間に panic でシステムが落ちることになる。 このため、ホットスワップを行うことは出来ない。 2つめは「同一チャンネル上で RAID を構築できない」。 これも 4.xR の atacontrol に問題があり、4.xR では交換した HDD をアレイに組み込む方法は先の通り。 ここで問題になるのが detach/attach したときの挙動なのだが、同一チャンネル上に 2台の HDD が有る場合、アレイの再構築をしようとして最終段階の attach をすると "両方のドライブ" が SPARE となってアレイを組むことが出来なくなる。 なお、両方の HDD が同一チャンネル上に繋がっていることによりいっぺんに attach される事が問題なので、チャンネルを別ければ RAID を組むことは出来る。 ※これが 4.8R+P になると、上記 2つの問題は解消できる。 しかし、4.xR でホットスワップが絶対に出来ないというわけでもなく、「Promise などの本物のハードウェア RAID カードもしくはそれに準ずるオンボードインターフェイス」が存在すれば 4.xR でもホットスワップだけは可能となる。 # が、同一チャンネル上で RAID を構築できないのは atacontrol の仕様なので変わらない。 アレイの再構築をする時に delete でアレイを解除しなければならないのは、交換した HDD に「アレイ用 HDD」という情報 (magic number) が書き込まれないという問題のためである。 delete → create → detach → attach すると強制的に書き込まれるのだが、普通に接続して attach しただけでは magic number は書き込まれない。 しかし、ハードウェア RAID 機能を使用するとこの問題が無くなるのでアレイを delete する必要が無く、そのためホットスワップが可能となる。 なお、4.8R+P では addspare(5.xR)/spare(4.8R+P) サブコマンドが使用できるので、「Promise などの本物のハードウェア RAID カードもしくはそれに準ずるオンボードインターフェイス」でなくともホットスワップは可能。 1. HDD の接続 HDD の接続は、HDD 障害発生時の HDD 交換方法により接続の仕方が変わってくる。 >> ホットスワップによる交換を行いたい場合 1チャンネルあたり 1デバイス (1 HDD) しか接続してはならない。 つまり、少なくとも 2チャンネルが必要となる。 このため、昔の IDE ポートが 2つ (プライマリ・セカンダリ) しかないマザーボードでは事実上 RAID 構築は出来ない。 最近ならば SATA インターフェイスや RAID インターフェイス (Promise FastTrack 系)、もしくは高速 IDE インターフェイス (Promise Ultra 系など) が標準で搭載されているので、このチャンネルを使用すること。 ただし、addspare(5.xR)/spare(4.8R+P) サブコマンドが利用できない環境、かつ RAID インターフェイスでは無い場合はホットスワップは仕様上行えないので注意。 >> コールドスワップによる交換を行う場合 同一チャンネル上で RAID を構築することが出来る。 昔の IDE ポートが 2つ (プライマリ・セカンダリ) しかないマザーボードでも利用可能。 ただし、ただし、addspare(5.xR)/spare(4.8R+P) サブコマンドが利用できない環境の場合は同一チャンネル上のアレイ構築は行えない。 ※チャンネル使用数の違いの "わけ" ディスク交換の際は、detach サブコマンドによってチャンネルを切り離してからデバイスを交換するが、同一チャンネル上に RAID を構築していると、detach した瞬間にそのパーティション (デバイス・アレイ) は「存在しない物」となる。 このため、同一チャンネル上で RAID を構成しているパターンでホットスワップによる交換を行おうとして detach を行うと、アレイがシステムから見えなくなる。 そのアレイに何らかのアクセスが発生した瞬間に panic で落ちてしまうので、同一チャンネル上で RAID を構成するとホットスワップによる交換は出来ない。 これはホットスワップによる交換の時に問題になるだけで、コールドスワップならば問題とはならない。 ここで「detach ってなにやってんの?」と思われるだろう。 ホットスワップを行う際は、まずはシステムからデバイスを切り離さなければならないわけだが、この作業が detach となる。 わかりやすく説明すると、Windows の「ハードウェアの取り外しアイコン」を使ってデバイスを停止させる行為にあたる。 この detach サブコマンドを使って、チャンネルを論理的に切り離してからデバイス (HDD) を物理的に切り離して交換を行うこととなる。 なお、「デバイス (HDD) 単位で detach 出来ないの?」とは思われるだろうが、残念ながらチャンネル単位での detach しかできない。 コールドスワップの場合はこの「ハードウェア (チャンネル) の取り外し (detach)」が不要なので、単一チャンネル上に RAID を構築しても問題はない。 2. アレイ作成 2-1. 4.xR の場合 シングルユーザーモードで起動 (boot -s)。 ok プロンプトが出たら boot -s と入力してリターン。 プライマリ・マスターとセカンダリ・マスターをペアに RAID-1 を作成。 # atacontrol create RAID1 ad4 ad6 ← ペアにするデバイス名を指定する ※デバイス指定の順番は、ディスクアクセスを考えなければぶっちゃけどっちが先でも良い。 チャンネルを切り離す。 この時、切り離すチャンネルは空の HDD が繋がっているチャンネルを切り離すこと。 ※今回は ch-2=ad4、ch-3=ad6 で、空の HDD は ch-3=ad6。 # atacontrol detach 3 ← チャンネル番号を指定する ad6: removed from configuration ad6: deleted from ar0 disk1 ar0: WARNING - mirror lost チャンネルを接続。 # atacontrol attach 3 ← チャンネル番号を指定する ad6: inserted into ar0 disk1 as spare ← magic number が書き込まれる Master: ad6 Slave: no device present すると ar0 には ad4 のデータが見えるようになる。 心配な人は # mount -r -t ufs /dev/ar0s1e /pub2 などとしてマウントして中を見てみる。 中身が見えたら /etc/fstab を書き換える。 デバイス名のみを書き換えるだけでよい。 旧) /dev/ad4s1e /pub1 ufs rw 2 2 新) /dev/ar0s1e /pub1 ufs rw 2 2 で再起動。 # reboot 再起動はマルチユーザーモードで ok。 起動したら同期を取る。 # atacontrol rebuild 0 & ← アレイ番号を指定 必ず & を付けてバックグラウンドで走らせること。 今回の場合、コピー元は atacontrol attach 3 コマンドで ad6 に対して SPARE 認定がされているので、コピー元はアレイペアの ad4 となる。 コピーは常に「アレイペアの片割れ→SPARE認定されたアレイペア」に対して行われることに注意。 順番間違えたらたぶん悲惨な結末に。 動作確認。 # atacontrol status 0 ← アレイ番号を指定 ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 8% completed 2-2. 4.8R+P/5.xR の場合 3. ディスク交換 spare は 5.xR の場合は addspare に読み替えること。 3-1. ホットスワップ 3-1-1. 4.xR の場合 無理。 3-1-2. RAID板/4.8R+P/5.xR の場合 壊れた HDD は ch-2 = ad4 とする。 ホットスワップなのでマルチユーザーモードでも可能。 壊れた HDD のチャンネルを切り離す。 # atacontrol detach 2 ← チャンネル番号を指定する 壊れた HDD を新品の HDD と交換する。 交換したら論理的に接続する。 # atacontrol attach ad4 ← デバイス名を指定する スペア認定する。 # atacontrol spare ar0 ad4 ← アレイ名、デバイス名の順で指定する 同期。 # atacontrol rebuild 0 ← アレイ番号を指定する 3-2. コールドスワップ 3-2-1. 4.xR の場合 壊れた HDD は ch-2 = ad4 とする。 まずはシングルユーザーモードで起動。 ※ok プロンプトで boot -s アレイ構成を解除する。 # atacontrol delete 0 ← アレイ番号を指定する ここで鯖の電源を切るか CTRL+ALT+DEL してから電源を切る (かなり無茶だがこの方法しかない)。 電源が落ちたら壊れた HDD を摘出し、新品の HDD を物理的に接続して電源 ON。 再度シングルユーザーモードで起動。 起動したら念のためアレイ構成を解除。 # atacontrol delete 0 ← アレイ番号を指定する アレイを組む。 # atacontrol create RAID1 ad4 ad6 ← ペアにするデバイス名を指定する 新品の HDD (ch-2 = ad4) を detach してからもう一度 atach する。 # atacontrol detach 2 ← デバイス名を指定する # atacontrol attach 2 ← デバイス名を指定する これで magic number が ad4 に書き込まれる。 # atacontrol rebuild 0 & ← アレイ番号を指定 必ず & を付けてバックグラウンドで走らせること。 動作確認。 # atacontrol status 0 ← アレイ番号を指定 ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 8% completed 3-2-2. 4.8R+P/5.xR の場合 ▼DynamicDNS for BIND8 パスワード付き DynamicDNS を運用するのはいいが、制限無しだと nsupdate で勝手に更新されてしまう。 そこで、鍵を用意してその鍵と一致したときにのみ書き換えが出来るような仕組みにしてみる。 一番簡単な方法としては、TSIG で認証する方法になる。 ------------------------------------------------------------- % dnskeygen -H 512 -h -n griffonworks.net. ←最後のドットを忘れないこと ** Adding dot to the name to make it fully qualified domain name** Generating 512 bit HMAC-MD5 Key for griffonworks.net. Generated 512 bit Key for griffonworks.net. id=0 alg=157 flags=513 % cat Kgriffonworks.net.+157+00000.key griffonworks.net. IN KEY 513 3 157 MlaQIMHPx9ZYNfm0MTnBV+qzalFdu3o2OjWDgZMjD8Y9K+gWZjmy3pSC38PdkxXBDgG86Y3sy0wiUsD+1fIptg== % cat Kgriffonworks.net.+157+00000.private Private-key-format: v1.2 Algorithm: 157 (HMAC) Key: MlaQIMHPx9ZYNfm0MTnBV+qzalFdu3o2OjWDgZMjD8Y9K+gWZjmy3pSC38PdkxXBDgG86Y3sy0wiUsD+1fIptg== ------------------------------------------------------------- key の部分が実際に使用する鍵となる文字列。 これは毎回生成するたびに変わります。 これらのファイルは nsupdate で使用するので保存しておく事。 さらに chmod 0400 で他のユーザーに見られないようにしておく事。 生成したら named.conf を変更します。 ------------------------------------------------------------- zone "gwits.net" { type master; file "gwits_net.zone"; allow-update { ;; ↓ここに key で指定した名前を記述する key gwits.net; }; }; key "gwits.net" { algorithm hmac-md5; ;; ↓ここに Kgriffonworks.net.+157+00000.private の key: より後ろを記述する secret "MlaQIMHPx9ZYNfm0MTnBV+qzalFdu3o2OjWDgZMjD8Y9K+gWZjmy3pSC38PdkxXBDgG86Y3sy0wiUsD+1fIptg=="; }; ------------------------------------------------------------- この named.conf は、他のユーザーに見られないように chmod 0400 しておく事をおすすめします。 DNS のリロードが終わったら nsupdate をしてみます。 -k オプションで生成したファイルを指定します。 といっても % nsupdate -d -k /etc/namedb:griffonworks.net. と指定するだけで他の操作は何も変わらない。 指定は -k オプションを使用し、コロンで区切られる。 コロンより前の部分は暗号化ファイルを置いているディレクトリを指定する。 コロンより後の部分は暗号化ファイルを作成したときに指定したドメイン名を指定する。 ▼emacs インストール@CVS tcsh シェルで行うことを前提に話をします。 % setenv CVS_RSH ssh % cd /usr/src/software % cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/emacs co emacs これで /usr/src/software/emacs/ が作成されるので、 % cd emacs % ./configure % make bootstrap % su # make install おわり。 ▼mew インストール $ make $ make info $ make jinfo $ su # make install # make install-info # make install-jinfo # vi /usr/local/share/info/dir Mew Mail Reader * mew: (mew) * mew.jis: (mew.jis) これで C-h i で日本語マニュアルになる。 ▼HTTP Proxy 経由で SSH ってみる ・説明中で使用する名前とか・・・ target.foo.bar:Proxy を経由して接続する先のホスト名 proxy.foo.bar :Proxy のアドレス myhost.foo.bar :自分が使ってるPC 1. まずはテスト 使うべき HTTP Proxy が CONNECT メソッドを理解するかを確認。 % telnet proxy.foo.bar 8080 ←使うべき HTTP Proxy のアドレス Trying proxy.foo.bar... Connected to myhost.foo.bar. Escape character is '^]'. CONNECT target.foo.bar:22 HTTP/1.0 ←接続先サーバー名とポート番号をCONNECTメソッドで接続 HTTP/1.0 200 Connection established SSH-1.99-OpenSSH_3.7.1p2 ←帰ってきたー quit ←切断 Protocol mismatch. Connection closed by foreign host. 接続先サーバーのポートは適当なものを使いましょう。 SMTP ならほぼ OK じゃね? SSH で繋ごうとしてるなら 22番でも OK だが。 2. 接続ツールをゲットだぜ! HTTP Proxy と SSH クライアントとの間で、標準入力を使用してデータをやりとりさせなければならないので、connect というツールを使ってコレを実現させる。 http://www.imasy.or.jp/~gotoh/connect.c ※コンパイル方法はソースの上の方を参照 ※ミラー:http://www.griffonworks.net/freebsd/source/connect.c コンパイルが終わったら適当なディレクトリにでも置いておこう。 3. SSH の設定 ホームディレクトリにある .ssh ディレクトリの中に config ファイルを作成する。 ---[ ~/.ssh/connect ]--- ProxyCommand /usr/local/bin/connect -H proxy.foo.bar:8080 %h %p ------------------------ 会社のネットワークでよく SSH を使用する場合は、~/.ssh/connect を ~/.ssh/useproxy とでも名前を変更しておこう。 余談: connect は HTTP Proxy と connect の間で標準入力のやりとりを行う。 # connect コマンドは Proxy への CONNECT メソッドを使った接続と標準入力でのデータ通信をトンネル (?) するツール。 % connect -H proxy.foo.bar:8080 target.foo.bar 22 とすると、HTTP Proxy "proxy.foo.bar:8080" を使用して "target.foo.bar:22" に接続する。 後は標準入力でコマンドを打てるようになる。 4. SSH を実行してみる % ssh target.foo.bar griffon@target.foo.bar's password: こうなれば OK。 もし会社などで ssh を常用し、時々外の世界につなげたいときは、~/.ssh/config を別の名前 (useproxy とか) にしておき、以下のようにすると良い。 % ssh -F ~/.ssh/useproxy target.foo.bar ▼リバース Proxy の構築 on ルーター鯖 LAN 上からルーター鯖経由でグローバル IP アドレスを持った (ように見えるが実際はポートフォワーディングされている) LAN 上の Web 鯖にアクセスしようとすると、グローバル IP アドレスを持っているルーター鯖の tun0 で止まる。 これを LAN 内に戻すには以下の手法が存在する。 1. BIND9 の view 機能を使う LAN内にBIND9鯖を建て、リクエスト元に応じて答える IP アドレスを変更する機能らしい。 2. ルーター鯖に apache 入れて mod_rewrite 特定のリクエストされた URL 文字列を LAN 内の鯖にリダイレクト。 3. BIND8 x2 そもそもやり方がわからん。(´д`; で、BIND9 入れるのはイヤなので apache 入れて mod_rewrite でリバース Proxy する事に。 1. apache のコンパイル ./configure --enable-module=so --enable-module=rewrite --enable-module=proxy してから make → make install 2. httpd.conf の設定 Web 部分は通常の httpd.conf の設定そのまま。 # 適当に設定しておきます。 追加するのは mod_rewrite の部分で、以下のようにする。 236c236 < Port 8080 --- > Port 80 258c258 < ServerAdmin griffon@ortoros.griffonworks.or.jp --- > ServerAdmin webmaster@griffonworks.net 276c276 < #ServerName www.example.com --- > ServerName r-proxy.griffonworks.net 283c283 < DocumentRoot "/usr/local/apache/htdocs" --- > DocumentRoot "/www/docroot" 308c308 < --- > 458c458,459 < ErrorLog /usr/local/apache/logs/error_log --- > #ErrorLog /usr/local/apache/logs/error_log > ErrorLog /dev/null 483c484,485 < CustomLog /usr/local/apache/logs/access_log common --- > #CustomLog /usr/local/apache/logs/access_log common > CustomLog /dev/null common 573c575 < ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" --- > ScriptAlias /cgi-bin/ "/www/cgi-bin/" 579c581 < --- > 944a947,964 > > > RewriteEngine on > #RewriteLog /usr/local/apache/logs/rewrite.log > #RewriteLogLevel 9 > RewriteCond %{HTTP_HOST} ^(griffon.gwits.net|www.griffonworks.net) > RewriteRule ^/(.*) http://www.griffonworks.or.jp/~griffon/$1 [P] > RewriteCond %{HTTP_HOST} ^fxlqa.gwits.net > RewriteRule ^/(.*) http://www.griffonworks.or.jp/~fxlqa/$1 [P] > RewriteCond %{HTTP_HOST} ^(www.gwits.net|gwits.net) > RewriteRule ^/(.*) http://www.griffonworks.or.jp/~gwits/$1 [P] > RewriteCond %{HTTP_HOST} ^griffonworks.gwits.net > RewriteRule ^/(.*) http://www.griffonworks.or.jp/$1 [P] > RewriteCond %{HTTP_HOST} ^(www.griffonworks.gwits.net|weblabo.griffonworks.net) > RewriteRule ^/(.*) http://www.griffonworks.or.jp/$1 [P] > RewriteCond %{HTTP_HOST} ^www2.griffonworks.gwits.net > RewriteRule ^/(.*) http://www2.griffonworks.or.jp/$1 [P] > ログは正常動作の確認が取れたら /dev/null にでも落としておきましょう。 でないとログが肥大化してえらいめにあいます。 あとは普通に weblabo.griffonworks.net にアクセスすると、オルトロスの apache でリバース Proxy されて LAN 内のリヴァにアクセスできます。 # 今まではオルトロスで止まってました。 ちなみに [P] を指定すると、ユーザーから見た URL (ブラウザの URL 欄) は変わりませんが、[R] にするとリダイレクトになるのでユーザーから見た URL (ブラウザの URL 欄) が変わります。 ▼SpamAssasin のインスコ (by ports) 今回は横着をして ports でのインストール。 注意する点は以下を参照。 ・コンパイルするマシンが Firewall や Proxy の後ろにいる場合は、環境変数 HTTP_PROXY や FTP_PASSIVE_MODE をセットすること。 → fetch(3) の環境変数を参照。 例) setenv FTP_PASSIVE_MODE on setenv HTTP_PROXY http://proxy.hogehoge.com:8080/ ・Specp.pm は古い方を先に読んでしまうので、あらかじめこれを削除するなりリネームするなりしておくこと。 現在使用しているバージョン番号は % perl -MFile::Spec -e 'print $File::Spec::VERSION' で確認できる。 例)File::Spec が ver-0.6 の場合 # cd /usr/libdata/perl/5.00503/File/ # mv Spec.pm Spec.pm_0.6 # mv Spec Spec_0.6 ・コンパイルのどこかで失敗したら、できるだけ make distclean を行った方がよいかもしれない。 ▼番外編:Windows 2000 の個人ユーザープロファイルのディレクトリを変更する ユーザープロファイルのコピー機能を使って、ユーザープロファイルディレクトリを変更するユーザーのユーザープロファイルをコピーする。 "Local Settings" の注意も同じように。 次にレジストリを変更する。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList が各ユーザーのプロファイルリストになる。 SID キーの中にある ProfileImagePath が各ユーザー毎のユーザープロファイルディレクトリになる。 どの SID がどのユーザーのものかは ProfileImagePath のユーザー名っぽい部分で判断すること。 ▼番外編:Windows 2000 の全てのユーザープロファイルディレクトリを変更する 1. 既存ユーザーのプロファイルを変更先ディレクトリにコピーする 「マイコンピュータ」右クリック→「プロパティ」→「ユーザープロファイル」でコピーするユーザーを選択し、「コピー先」をクリック。 「プロファイルのコピー先」にコピー先のディレクトリを入力する、もしくは「参照」を使ってコピー先を選択する。 この時、コピーされるのは %USERPROFILE% ディレクトリの中身だけなので、1個上のディレクトリを指定する。 また、"Local Settings" ディレクトリがコピーされないので手動でコピーすること。 この時コピーできないと言われるファイルはそのまま放置してコピーする。 ----------------------------------------------------------- 例) USERPROFILE=C:\Documents and Settings\Administrator の場合 C:\>D: D:\>mkdir "Documents and Settings" D:\>cd "Documents and Settings" D:\Documents and Settings>mkdir Administrator この状態でコピー先を D:\Documents and Settings\Administrator にする。 ----------------------------------------------------------- 各ユーザーのプロファイルをコピーし終えたら、手動で "All Users" と "Default User" もコピーする。 2. プロファイルディレクトリの変更 レジストリエディタを起動し、 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\ProfilesDirectory を変更する。 初期値は %SystemDrive%\Documents and Settings となっているはずなので、これを以下の例のように変更する。 例) D:\Documents and Settings 3. 再起動 神に祈りを捧げてから再起動。 うまくいかなかったらあきらめて再インストールしましょう。 ▼番外編:NTSyslog (http://www.vector.co.jp/soft/winnt/net/se283016.html) の使い方 1. NTSyslog の設定 1.1. インストール README.txt にそって Windows にインストールします。 1.2. 設定 NTSyslogCtrl.exe で設定を行います。 サービスが上手く動いていたら青信号になっているはずです。 [Syslog Daemons] ボタンを押して syslog サーバーを指定します。 バックアップ Syslog Daemon (syslog サーバー) がない場合は指定しなくてもかまいません。 「転送するイベントログの選択」は「イベントログ」ボタンを押して設定します。 Facility は全て local0 に設定しておきます。 他の、どのログを転送するか及び Severity に関しては自由に設定します。 これを Application、Security、System 全てのイベントログ選択で行っておきます。 設定後の NTSyslog の再起動は不要のようです。 2. syslogd の設定 2.1. 起動オプションの変更 -s オプションが付いていたらこれを外す。 -s セキュアモードで操作します。 リモートマシンからのログメッセージをログしません。 2度指定すると、ネットワークソケットを全くオープンせず、 またリモートマシンへのログ動作も無効にします。 お勧めオプション: syslogd_flags="-4 -n -a *:*" オプションの説明は syslogd(8) を見てください。 簡単な説明としては、 IPv4 のみで通信し、IPアドレスの逆引きを行わず、全てのクライアントとポートからの syslog データを受け付ける。 コマンドラインで実行する場合は *:* の部分をだぶるクオーテーションで囲いましょう。 % syslogd -4 -n -a "*:*" syslog クライアントを特定する場合は以下のように。 -a xxx.xxx.xxx.xxx:* ポート番号は限定せず、ワイルドカードで全てを受け付けるようにすればいいでしょう。 2.2. syslog.conf の設定 今回は messages などと同じログに吐かせるのもイヤなので、local0 を使います。 ログファイル名の前のスペースはタブに置き換えてください。 設定は普通に local0.* FILENAME とすると messages などにもログが出てしまうので、少しばかり細工をします。 messages には *.notice などと書かれていますが、コレだと NTSyslog のログまでもが messages に出てしまうので、以下のようにします。 kern.debug;!local0.*;*.notice;lpr.info;mail.crit;news.err /var/log/messages !local0.* で messages には local0.* のログを出力しないようにします。 ただし、行頭に ! を持ってくるとログに出ないので、行頭には kern.debug のように ! が付かない設定を持ってきます。 local0.* を追加する行は messages の周辺でいいでしょう。 以下は私が使用している設定です。 *.err;kern.debug;auth.notice;mail.crit /dev/console kern.debug;!local0.*;*.notice;lpr.info;mail.crit;news.err /var/log/messages security.* /var/log/security mail.info /var/log/maillog lpr.info /var/log/lpd-errs cron.* /var/log/cron local0.* /var/log/ntsyslog *.err;!local0.* root *.notice;news.err;!local0.* root *.alert;!local0.* root *.emerg;!local0.* * 2.3. ログ出力の確認 messages に出力されていないか及び ntsyslog に出力されているかを確認しておきます。 ▼ユーザー認証付き Squid の構築 1. Squid のインストール 基本的には既存の squid に ncsa_auth を追加する。 squid のインストールまでは通常通り。 インストール済みなら 2. へ。 % ./configure \ --enable-icmp \ --enable-snmp \ --enable-default-err-language=Japanese \ --enable-underscores \ --enable-useragent-log \ --enable-referer-log \ --enable-delay-pools \ --enable-cachemgr-hostname \ --disable-http-violations \ --enable-auth-logging \ --enable-auth=basic \ --enable-basic-auth-helpers=NCSA % make # make install 2. ncsa_auth のインストール squid のソースディレクトリの下にあるディレクトリが対象。 % cd /usr/local/src/squid-2.4.STABLE7/auth_modules/NCSA/ % make # make install 3. apache 付属の htpasswd でパスワードファイルを作成する htpasswd の -c オプションはパスワードファイルを新規作成する場合に必要。 もし追加もしくはパスワード変更の場合は -c オプション無しでファイル名のみ指定。 % cd /usr/local/squid/etc/ % htpasswd -c passwd USERNAME 4. squid.conf を一部書き換える ・"authenticate_program" を追加 ncsa_auth と passwd (htpasswd で作成したパスワードファイル) は個人環境によるので書き換えること。 authenticate_program /pub1/usr/local/squid/bin/ncsa_auth /pub1/usr/local/squid/etc/passwd ・"acl" 追加 passwd に書かれた全ユーザーが対象の場合は REQUIRED を。 特定のユーザーが対象ならそのユーザーIDを指定。 acl proxy_user_auth proxy_auth REQUIRED ・"http_access" 追加 全てのアクセスでユーザー認証を行う場合は、http_access のなるだけ前の方に設置。 もし「特定の端末からは認証無し、それ以外は認証有り」というふうにするなら、先に特定の IP アドレスを allow するように設定する。 - 全部ユーザー認証付き http_access allow proxy_user_auth - 特定の端末は認証無し、それ以外は認証有り http_access allow client http_access allow proxy_user_auth 5. squid 再起動 # squid -k reconfigure あとはブラウザで Proxy 経由でアクセスしようとしたとき、ユーザー認証を聞いてくるかどうかをチェック。 ▼ディスククラッシュ時の復旧手順 % dd if=/dev/ad2 of=broken.img bs=512 count=78140160 conv=sync,noerror if : 入力デバイス of : 出力デバイス(今回はファイル) bs : 入出力ブロックサイズ。これを大きくすると読み書き速度が上がるが、 エラーをゼロパディング (エラーセクタをヌル埋め) する必要がある ので、ディスククラッシュ時は 512 にしておく。 count: 全セクタ数を指定する。計算式は(セクタxシリンダxヘッド)となる。 例) ad2: 38154MB [77520/16/63] at ata1-master UDMA66 → 77520x16x63 = 78140160 conv : noerror はエラーがあっても処理を止めないようにするオプション。 これに sync が加わっていると、エラーとなった部分はヌルに置き換 えられる。 # 置き換えられるサイズは bs で指定されたサイズ sync が指定されていないとヌル埋めではなく削除となるので注意。 ディスクイメージを他のディスクに書き込む場合は、 % dd if=broken.img of=/dev/rad2 bs=65536 などとする。 SuperBlock が壊れている場合は、バックアップ SuperBlock を使用する。 % fsck -b [BackupSuperBlockNumber] /dev/ディスクデバイス 例) % fsck -b 32 -n /dev/ad0s3a CONTINUE? 以外の問いに全て N と答える。 全てを修正する場合は逆に -y とする。 残骸は /mnt/lost+found にあるはず。 こうすると、BackupSuperBlockNumber の代替スーパーブロックを使うことが出来ます。 代替スーパーブロックの位置情報は newfs -N [ディスクデバイス] で確認できます。 % newfs -N /dev/ad0a ネタもと:http://fromto.cc/hosokawa/diary/2002/20021107-home1/index.html ミラー :http://griffon.gwits.net/freebsd/mirror/FreeBSD_Crush_memo.mht ▼FreeBSD をアップグレードしたら Perl CGI などでのパスワードが変になった /etc/auth.conf の crypt_default を md5 にする。 http://www.jp.freebsd.org/QandA/HTML/1945.html +------------------- |crypt_default = md5 | ▼ネットワーク経由での HDD 上への tar 展開方法 rsh もしくは ssh を使えるようにしておくこと。 # sh # tar cf - BACKUP_DIR | rsh HOSTNAME "cd TARGET_DIR && tar xfvp -" # tcsh # ssh TARGET_MACHINE gzip -dc TARGZ_FILE | tar xfvp - ※tar.gz ではなく tar の場合は、gzip -dc の代わりに cat を使う。 スティッキービットも立ったままです。 ▼mod_gzip と mod_ssl のインストール mod_gzip を apache のソースディレクトリ内にコピーしておき、mod_ssl も展開しておく。 % mkdir apache % [mod_ssl と apache ソースの展開] % cd apache_1.3.22 % make clean % cd ../mod_ssl-2.8.5-1.3.22 % ./configure --add-module=../apache_1.3.22/mod_gzip.c --with-apache=../apache_1.3.22 --with-ssl=/usr/local/ssl Configuring mod_ssl/2.8.5 for Apache/1.3.22 + Apache location: ../apache_1.3.22 (Version 1.3.22) + Auxiliary patch tool: ./etc/patch/patch (local) + Applying packages to Apache source tree: o Extended API (EAPI) o Distribution Documents o SSL Module Source o SSL Support o SSL Configuration Additions o SSL Module Documentation o Addons Done: source extension and patches successfully applied. Now proceed with the following commands (Bourne-Shell syntax): $ cd ../apache_1.3.22 $ SSL_BASE=/path/to/openssl ./configure ... --enable-module=ssl $ make $ make certificate $ make install % cd ../apache_1.3.22 % make ※ make certificate は行わない。 % make install あとは apache startssl やって mod_gzip と mod_ssl が有効になっているかを確認。 % telnet localhost 80 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. HEAD / HTTP/1.0 HTTP/1.1 200 OK Date: Fri, 22 Mar 2002 04:23:51 GMT Server: Apache/1.3.22 (Unix) mod_gzip/1.3.19.1a mod_ssl/2.8.5 OpenSSL/0.9.6b Last-Modified: Wed, 31 Oct 2001 16:29:07 GMT ETag: "20f14-1105-3be026d3" Accept-Ranges: bytes Content-Length: 4357 Connection: close Content-Type: text/html Server: に mod_gzip、mod_ssl/、OpenSSL が含まれていれば OK。 make certificate は証明書作成用なので、作成していない場合は make install する前に実行するか、下の方にある「▼Apache + mod_ssl 使用時のサーバー証明書作成方法」を自前で実行。 ▼shutdown -p で電源断 ATX 電源対応 PC だと、shutdown -p で電源断が行える。その設定は以下の通り。 1. /boot/kernel.conf に次の行を追加 enable apm   ※kernel.conf が無い場合は新規作成 2. /etc/rc.conf に次の行を追加 apm_enable="YES" 3. カーネルの以下の設定を有効にする device apm0 at nexus? disable flags 0x20 # Advanced Power Management これでカーネルを再構築して再起動すると、shutdown -p で電源が切れるようになる。 ▼日本語対応 tcsh のコンパイル config_f.h の編集 #undef KANJI #undef DSPMBYTE の undef を define にする。 NLS カタログを使うなら、一緒に #undef NLS_CATALOG を define にしておく。 % diff config_f.h config_f.h.org 68c68 < #define NLS_CATALOGS --- > #undef NLS_CATALOGS 120c120 < #define KANJI --- > #undef KANJI 127c127 < #define DSPMBYTE --- > #undef DSPMBYTE あとは configure → (以下略 NLS カタログは /usr/share/nls/ の直下に入っているようだ。 setenv LANG ja_JP.EUC だと、/usr/share/nls/ja_JP.EUC/tcsh.cat がカタログになる。 ▼mailbox 容量制限設定 通常は mailbox_size_limit と message_size_limit で設定。 特定の個人を特別に設定したい場合は、http://www.kagekaze.org/postfix/ にあるパッチを当てて対応する。 mailbox_size_limit の値は Postfix が一度に受信できる最大サイズ (message_size_limit) より大きくしておかないとならない (単位はともに byte)。 ちなみに今設定されている値は # postconf message_size_limit # postconf mailbox_size_limit で取得できる。 これで mailbox があふれたら、 -------------------------------------------------------------------------------- : cannot access mailbox /var/mail/griffon for user griffon. error writing message: File too large -------------------------------------------------------------------------------- とエラーメッセージが送信者に返ってくる。 ※このメッセージ、もしかしたら messae_size_limit に引っかかったときのものかも・・・。 特定の個人のみの設定という場合は、Postfix stuff (http://www.kagekaze.org/postfix/) にあるパッチを当てれば実現できる。 # ちなみにこのパッチは 20010228-pl8用だが、pl02 でも OK のようだ。 とりあえず、Postfix を展開する場所を /usr/src/ とすると、 # cd /usr/src/postfix-20010228-pl02 # wget http://www.kagekaze.org/postfix/R20010228-inbox-size-limit.patch # patch -p < http://www.kagekaze.org/postfix/R20010228-inbox-size-limit.patch でパッチが当たるので、あとは make → make install すれば OK。 念のため postfix reload したあとに postconf で設定が存在するかを確認する。 # postconf -d mailbox_size_map mailbox_size_map = と出てくれば OK。 あとは main.cf に --------------------------------------------------------- mailbox_size_map = hash:/etc/postfix/mailbox_size_map --------------------------------------------------------- と書いておく。 さらに /etc/postfix/mailbox_size_map に ---------------- griffon 10 ---------------- と書いておけば、mailbox がここで設定した容量以上になると送信者宛に ----------------------------------------------------- : Recipient's mailbox is full. ----------------------------------------------------- のエラーメールが飛ぶ。 なお、この容量設定は単位が KB なので注意すること。 ▼static 配送 Postfix での static 配送 (直接配送) は、/etc/postfix/transport で指定する。 -------------- /etc/postfix/transport # mail domain name smtp:[host name or IP] leviathan.griffonworks.or.jp smtp:[leviathan.griffonworks.or.jp] -------------- /etc/postfix/main.cf transport_maps = hash:/etc/postfix/transport -------------- あとは # postmap /etc/postfix/transport # postfix reload するだけ。 postmap は transport を書き換えるたびに実行すること。 確認は -------------- % mail griffon@leviathan.griffonworks.or.jp Subject: TEST test mail from ortoros. :) . EOT -------------- で送信されるかどうかを確認しておく。 配送されたときの /var/log/maillog -------------- Dec 19 13:29:26 ortoros postfix/qmgr[17535]: BAAA52C52F: from=,size=338, nrcpt=1 (queue active) Dec 19 13:29:27 ortoros postfix/smtp[17542]: BAAA52C52F: to=, relay=leviathan.griffonworks.or.jp[192.168.1.10], delay=1, status=sent (250 Ok: queued as E32205FDA) -------------- もしイントラ内配送であれば、受け側は local 配送の設定をしておくこと。 さもないと loop back エラーになって正常配送されなくなる。 -------------- Dec 19 13:24:59 leviathan postfix/qmgr[62923]: 64B055FDC: from=, size=805, nrcpt=1 (queue active) Dec 19 13:25:00 leviathan postfix/smtp[62942]: 64B055FDC: to=, relay=leviathan.griffonworks.or.jp[192.168.1.10], delay=0,status=bounced (mail for [leviathan.griffonworks.or.jp] loops back to myself) -------------- ↑こうなります。 さて、設定の方はっと・・・。 -------------- /etc/postfix/transport # mail domain name local: leviathan.griffonworks.or.jp local: -------------- /etc/postfix/main.cf transport_maps = hash:/etc/postfix/transport -------------- んでもって # postmap /etc/postfix/transport # postfix reload をしておく。 postmap は transport を書き換えるたびに実行すること。 ▼spam 対策 Postfix は /etc/postfix/main.cf の smtpd_client_restrictions オプションを使って設定する。 以下設定項目。 smtpd_client_restrictions = permit_mynetworks,check_client_access hash:/etc/postfix/reject_access_map, permit これを main.cf の適当な場所に記述しておき、/etc/postfix/reject_access_map ファイルを新規作成して以下のように記述しておく。 foo.bar.co.jp REJECT xxxx@foo.bar.com REJECR メールサーバーなどでドメインが複数ある場合は、共通の部分を指定しておくとそれが reject される。 たとえば、mail-1.foobar.com と mail-2.foo.bar.com があった場合、foo.bar.com REJECT としておくとどちらの鯖も reject できる。 同様に、IP アドレスでも指定できたりするので、その場合は aaa.bbb.ccc と共通部分を指定する。 メールアドレスでの reject も可能らしいが試していない。 これが終わったらハッシュデータベースを作成して Postfix を再起動しておく。 # postmap /etc/postfix/reject_access_map # postfix reload /etc/postfix/reject_access_map.db が出来ていれば OK。 なお、/var/log/postfix のログで host address reject されているかわいそうなヤツ (藁) のチェックは以下のコマンド列で可能。 % grep -i "Client host rejected: Access denied;" /var/log/postfix (おまけ) 不正リレーしようとする大バカ野郎のチェックは以下のコマンド列で可能。 % grep -i "Recipient address rejected: Relay access denied;" /var/log/postfix ▼CD-ROM を自動マウントする - amd (Auto Mount Daemon) ◆NFS サポートの確認 まずは NFS が有効になっているかどうか確認する。 GENELIC カーネルをそのまま使っている場合は有効になっているので次のステップへ進めばよいが、再構築して NFS を有効にしていない場合は以下の部分を有効にしてコンパイルし直して再起動しておく。 nfsd を起動する必要はない。 ---[ /usr/src/sys/i386/conf/mykernel ]---------------------------------------- options NFS #Network Filesystem options NFS_ROOT #NFS usable as root device, NFS required ------------------------------------------------------------------------------ ◆/etc/amd.map の編集 /etc/amd.map を編集する。 ---[ /etc/amd.map ]----------------------------------------------------------- # $FreeBSD: src/etc/amd.map,v 1.8 1999/09/13 17:09:07 peter Exp $ # /defaults type:=host;fs:=/amd/${key} * opts:=rw,grpid,resvport,nosuid,nodev #/defaults type:=host;fs:=${autodir}/${rhost}/host;rhost:=${key} #* opts:=rw,grpid,resvport,vers=2,proto=udp,nosuid,nodev ### cdrom type:=program;\ mount:="/sbin/mount mount -t cd9660 /dev/acd0c ${fs}";\ unmount:="/sbin/umount umount ${fs}" ------------------------------------------------------------------------------ マウントポイント (fs:=/amd/〜) や CD-ROM のデバイス名 (/dev/acd0c) は各自の環境によって合わせること。 ATAPI の CD-ROM ドライブなら変更しないで使えるだろう。 ◆ディレクトリの作成 amd のマウントポイントを作成しておく。 ここで作成するディレクトリ名は、/etc/amd.map の fs:= で指定したディレクトリ名になる。 # mkdir /amd # chmod 777 /amd ◆自動起動の設定 各デーモンをシステム起動時に自動起動させるようにしておく。 ---[ /etc/rc.conf ]----------------------------------------------------------- portmap_enable="YES" # portmap サポート amd_enable="YES" # amd サポート amd_flags="-a /amd -l syslog -c 300 /mnt /etc/amd.map" # amd オプション ------------------------------------------------------------------------------ オプションに指定しているディレクトリ名は各自の環境に合わせて設定すること。 詳しくは man amd 参照。 全てが完了したら再起動する。 再起動後、CD-ROM ドライブに CD-ROM を突っ込んでおもむろに % ls /mnt/cdrom/ とでもしてみる。 これで CD-ROM の中身が見られれば万々歳だが、もしも見られない場合は /var/log/messages を確認して原因を探る。 これで自動マウントが出来るようになったが、そのデバイスはタイムアウトするまでアンマウントできない。 アンマウントのタイムアウトを発生させるには amq を実行する。 % amq -u /mnt/cdrom ただし、amq -u はアンマウントするのではなく、タイムアウトしたときと同じ事を発生させるので、即時アンマウントできるわけではありません。 ▼USB を使う カーネルの再構築時、# USB support 以下の使用する USB デバイスを有効にしておく。 ただし ukbd を有効にすると死ぬそうなのでコメントアウトしておく。 USB マウスのみを使用する場合は以下の通り。 < /usr/src/sys/i386/conf/kernel > device uhci # UHCI PCI->USB interface device ohci # OHCI PCI->USB interface device usb # USB Bus (required) device ugen # Generic device uhid # "Human Interface Devices" device ums # Mouse あとは BIOS で Legacy USB を有効にし、/etc/rc.conf に以下の設定を記述して終了。 < /etc/rc.conf > ### PS/2 マウスデバイス有効化設定はコメントアウト #moused_port="/dev/psm0" #moused_type="auto" #moused_enable="YES" usbd_enable="YES" ▼CAPS キーを CTRL キーに変更する (X-Window) - http://www.turbolinux.co.jp/knowledge/public/7.html X-Window の場合は /usr/X11R6/lib/X11/xkb/keycodes/xfree86 を編集する。 /usr/X11R6/lib/X11/xkb/keycodes/xfree86 の xkb_keycodes "jp106" { 以下のキーコードを変更。 【変更前】 = 66; = 37; 【変更後】 = 37; = 66; あとは X を再起動すれば CTRL が A の横に来ている。 ▼CAPS キーを CTRL キーに変更する (コンソール) - http://www.tankmage.com/FreeBSD/tips/tips002.html 日本語キーボードは A の左に CAPS があるが、自分のように「CTRL でなきゃいや!」という人がいると思う。 そういう人のための救済措置。 % cd /usr/share/syscons/keymaps % sed "s/clock/lctrl/g" < jp.106.kbd > jp.106.kbd.new % mv jp.106.kbd jp.106.kbd.org % mv jp.106.kbd.new jp.106.kbd あとは /etc/rc.conf に keymap="jp.106" を追加しておく。 ▼osiris ◆インストール〜動作チェック ファイル整合性チェッカ。 こいつはただ単に指定されたチェック方式でデータベースを作るだけなので、比較チェッカの scale を使ってマスターデータベースと比較しなければならず、その比較も自分でスクリプトを書かなければならない。 とりあえずまずはインストールしませう。 % ./configure % make # make install お約束です。(ぉ インストールは /usr/local/osiris/ になる。 あとはこのディレクトリの中に DB 用ディレクトリとログ用ディレクトリを作成しておく。 # cd /usr/local/osiris # mkdir log # mkdir db conf/ にサンプルの設定ファイルが入っているが、これだと少なすぎるので以下の例を挙げておくので参考に。 -------------------------------------------------------- ### 基本設定 Database /usr/local/osiris/db/scan.osi # データベースファイル名 Verbose yes # 詳細出力 Prompt no # DB 上書き時の上書き可否を出さない ShowErrors yes # エラー表示出力有効 Recursive yes # ディレクトリ再帰チェック有効 FollowLinks no # リンクをたどらない # チェックするファイル属性のカテゴリ IncludeAll perm,mtime,ctime,inode,links,uid,gid,bytes,blocks Hash md5 # チェック時のハッシュアルゴリズムを md5 に ### チェック対象 Recursive no Exclude file( "proc" ) Exclude file( "tmp" ) Recursive yes # Exclude file( "resolv.conf" ) Recursive yes Recursive yes Recursive yes Recursive yes Recursive yes Recursive yes Recursive yes Recursive yes IncludeAll perm,inode,links,uid,gid,bytes,blocks -------------------------------------------------------- 現在のバージョンでは Exclude file でファイルを指定すると、なぜか全てのファイルがチェックできないので、/etc の Exclude は外してある (/ はチェックされない (;_;) )。 設定ファイルを作成したら osiris でチェックしてみよう。 # cd /usr/local/osiris # ./bin/osiris -f ./conf/osiris.conf これで /usr/local/osiris/db/scan.osi ができるので、以下のコマンドで何がチェックされたかを見てみる。 # ./bin/scale -p ./db/scan.osi | more 次に、ファイル整合性が正常にチェックされるかを確認するために、スキャンしたファイルのうちで適当な物を変更してもう一度スキャンしてみる。 ここではとりあえず resolv.conf に改行でも加えておくと良いだろう。 さてスキャン。 # ./bin/osiris -f ./conf/osiris.conf -o ./db/scan.next -o で出力する DB 名を指定している。 あとは比較。 # ./bin/scale -l ./db/scan.next -r ./db/scan.osi | more -r にはファイルの整合性が信頼できる時にスキャンした結果の DB ファイルを、-l には整合性が不明なときにスキャンした結果の DB ファイルを指定する。 これで整合性が不明な DB の信頼性をチェックし、ファイルの整合性が保たれているかをチェックする。 STDOUT (標準出力) に出力される結果にそれなりのことが書かれている (なにが変わっているか) のでそれを確認すること。 これでインストール後のチェックは完了。 ◆全自動化 次はこれを全自動化する。 全自動で行わせる動作は以下の通り。 1. osiris 設定ファイルに記述された設定でファイル整合性チェックを実行。 2. scale で前回スキャンした DB と今回スキャンした DB を比べる。 3. 今回スキャンした DB を現在日付 (YYYYMMDD) を付けてコピーする。 4. 比較時のログから records that differ:、new records:、missing records: の数を抜き出す。 5. 4. で抜き出した数のどれか1つが 1 以上であればメールサブジェクトを「XXX 〜 XXX」にするが、0であれば「OOO 〜 OOO」にする。 6. scale ログをログディレクトリに保存し、STDOUT にも出力する。 これを以下のような perl スクリプトで実現する。 ------------------------------------------------ #!/usr/local/bin/perl $now_dnt = `/bin/date "+%Y%m%d"`; chop $now_dnt; # 現在日付取得 $osi_dir = "/usr/local/osiris"; # お尻s のパス $osi_conf = "$osi_dir/conf/osiris.conf"; # 設定ファイルパス $osi_db = "$osi_dir/db/scan.osi.$now_dnt"; # データベースパス $osi_db_mst = "$osi_dir/db/scan.osi"; # マスターDBパス $osi_log = "$osi_dir/log/osiris_$now_dnt.log"; # ログファイルパス # チェック `$osi_dir/bin/osiris -o $osi_db -f $osi_conf > /dev/null 2>&1`; # DB の比較 - 不整合ファイルの洗い出し $result = `$osi_dir/bin/scale -l $osi_db -r $osi_db_mst`; # チェック後に現在の DB を比較用マスター DB に上書きすることで次回チェック時のマスターファイルを今回の DB とする `/bin/cp $osi_db $osi_db_mst > /dev/null 2>&1`; $result =~ /records that differ:(.*?)\n/i; $osi_result_differ = $1; $osi_result_differ =~ s/ //g; $result =~ /new records:(.*?)\n/i; $osi_result_newrec = $1; $osi_result_newrec =~ s/ //g; $result =~ /missing records:(.*?)\n/i; $osi_result_misrec = $1; $osi_result_misrec =~ s/ //g; # 書くステータスのどれか1つでも変更されている物があればサブジェクトを X にする if ($osi_result_differ > 0 || $osi_result_newrec > 0 || $osi_result_misrec > 0) { $subject = "XXX Osiris database missing! XXX"; } else { $subject = "OOO Osiris coordination check report OOO"; } $outdata = <<_TEXT_; From: root\@gwits.net To: croninfo\@gwits.net Subject: $subject $result _TEXT_ # 保存用ログを保存 open(LOG,">$osi_log"); print LOG $outdata; close(LOG); # 結果出力 print $outdata; ------------------------------------------------ これを適当なファイル名 (例:/usr/local/osiris/bin/osirisauto) で保存して実行属性を付けておく。 あとは実行するだけだが、1回目の実行では比較対象の scan.osi がないので 2回実行しておく。 あとは cron に root 権限でこのスクリプトを仕込んでおくと良いだろう。 ------------------------------------------------ # osiris coordination check 0 6 * * * root /usr/local/osiris/bin/osirisauto | /usr/sbin/sendmail -t ------------------------------------------------ 整合性が保たれていようが無かろうが問答無用でメッセージを吐き出すので、そのまま MTA にリダイレクトすれば毎回チェックログがメールで届く。 メールがうざいならば ------------------------------------------------ # osiris coordination check 0 6 * * * root /usr/local/osiris/bin/osirisauto > /dev/null 2>&1 ------------------------------------------------ としておくと良いが、すぐに気が付かないのでできればメールは飛ばしておいた方がよいだろう。 ▼APOP+POP SSL qpopper で APOP が使えるのでこれを使ってみる。 なお、「あうとるっくなんちゃら」とかいう行けてない超ダサイ、セキュリティホールばんばん開いていて世間様に迷惑かけまくっている全くやる気のないように見えて実は初心者ユーザーにはうけているがパワーユーザーからはシカトどころか逆に嫌悪感さえ抱かせる、しかも場所によっては「使用禁止」されているメーラーは APOP に対応してません。 # そのくせ POP with SSL に対応しちょるのが謎。 とりあえず configure だけで APOP になるのでさっさとインストールすることにする。 % ./configure --enable-apop --enable-log-login --enable-popuid --with-openssl=/usr/local/ssl APOP を有効にして (--enable-apop) ログインしたユーザーのログを取って (--enable-log-login) APOP データベースの所有者を pop に固定 (--enable-popuid) する。 ちなみに --enable-log-login は POP before SMTP ツール「watcher2 Rev-1.6」用の設定だから必要ないと言えばないかな。 # 気になるなら google で watcher2 で調べてみよう。もちろん日本語圏内検索だ。 あとはユーザー「pop」を作るが、デフォルトで作られているようだ。 作られてないなら以下の情報で作成しておく。 # vipw pop:*:68:6::0:0:Post Office Owner:/nonexistent:/sbin/nologin ユーザー ID は適当。 それと /etc/inetd.conf にも popper を有効にする記述をしておく。 [ /etc/inetd.conf ] #pop3 stream tcp nowait root /usr/local/libexec/popper popper pop3 stream tcp nowait root /usr/local/sbin/popper popper 元から有る行は役に立たないので、それをコピペして新しく定義する。 あとは popauth で APOP 用パスワードを定義する。 % /usr/local/sbin/popauth Changing only APOP password for griffon. New password: Retype new password: もしかしたら /usr/local/bin/ かもしれん。 とりあえずこれで APOP 用パスワードを定義でけたのであとは電信八号などのメーラーで APOP 対応に設定し、パスワードは上で入力したパスワードを指定して読んでみる。 これで APOP 対応化は終了。 [ SSL 化 ] SSL 化する場合はサーバー証明書の プライベートキー(.key)+署名済みファイル(.crt)の --- 内 を結合して 1つのファイルにしておく。 証明書は apacke などで使っているファイルをそのまま使っても良い。 設定ファイルは新規で自分で作る。 ---[ /usr/local/etc/qpopper/qpopper.conf ]--------- set clear-text-password = tls set tls-support = alternate-port set tls-server-cert-file = /usr/local/etc/qpopper/server.pem --------------------------------------------------- あとは inetd に pop3s の行を書く。 services には既に pop3s の行が書かれているのでそのまま。 ---[ /etc/inetd.conf ]----------------------------- pop3s stream tcp nowait root /usr/local/sbin/popper popper -f /usr/local/etc/qpopper/qpopper.conf --------------------------------------------------- inetd の kill -HUP とルーターの穴明けをお忘れずに。 ▼Apache + mod_ssl 使用時のサーバー証明書作成方法 ■注意事項 この方法で作成されたルート証明書またはその証明書で署名されたサーバー証明書は「オレオレ証明書 (自己署名証明書)」(http://d.hatena.ne.jp/keyword/%A5%AA%A5%EC%A5%AA%A5%EC%BE%DA%CC%C0%BD%F1) にあたります。 デメリットを理解した上でご利用下さい。 ■下準備 全てのファイルはとりあえず /usr/local/apache/conf/CA/ 直下に作ることにします。 # mkdir /usr/local/apache/conf/CA ■個人 CA 証明局の開局 一度作業すればあとは作業しなくてもいいので次のステップへ。 ちなみに証明局の証明書有効期限は CA.sh の先頭の方にある DAYS="-days 356" で決められているので、期限を延ばしたい人はこの数値を大きくしよう。 なお、CA 証明局の証明書有効期限が過ぎた場合は、再度 CA.sh -newca で cakey.pem と cacert.pem を新規作成するが、今まで使用していた証明書有効期限データベースなどはそのまま使えるはず。 1. 開局 まず CA.sh で個人 CA 認証局を開局する。 # CA.sh -newca CA certificate filename (or enter to create) (ここでリターン *1) Making CA certificate ... Using configuration from /usr/local/ssl/openssl.cnf Generating a 1024 bit RSA private key ................................................................................ ................................................................................ ...++++++ .........++++++ writing new private key to './demoCA/private/./cakey.pem' Enter PEM pass phrase:(パスフレーズ入力 *2) Verifying password - Enter PEM pass phrase:(もう一度パスフレーズ入力 *2) ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP (認証局のある国) State or Province Name (full name) [Some-State]:Osaka (認証局のある都道府県) Locality Name (eg, city) []:******** (認証局のある市町村) Organization Name (eg, company) [Internet Widgits Pty Ltd]:GRIFFON Works (認証局名) Organizational Unit Name (eg, section) []:Network Group (認証局グループ名) Common Name (eg, YOUR name) []:GRIFFON Works CA (一般名性) Email Address []:griffon@griffonworks.net (認証局の管理者メールアドレス) *1: 上位 CA の証明書を持っている場合はそのファイル名を入力するが、今回はファイルがないので空打ちする。 *2: ここで入力したパスフレーズは "証明書署名要求ファイル" に署名する際に必要。 これで個人 CA 認証局の準備は完了。 作られたファイルの説明 demoCA/ certs/ crl/ newcerts/ private/ cakey.pem 秘密鍵 (chmod 400) serial index.txt 証明書の有効期限などのデータベースファイル cacert.pem CA 証明書の元ファイル (公開するので chmod 444) cakey.pem は他人には絶対にばれてはダメなものなので、chmod 400 としておく。 cacert.pem は公開する必要があるので chmod 444 としておく。 2. DER フォーマットのファイルを作成する ブラウザに個人 CA 認証局の証明書を組み込むことが出来るように、CA 証明書ファイル (cacert.pem) を DER フォーマットに変換する。 # cd demoCA # openssl x509 -inform pem -outform der -in cacert.pem -out cacert.der これで変換は終了する。 出来たファイルをブラウザが参照できるような所に置いておく。 cacert.der CA 証明書ファイル (→ cacert.crt に名前を変更する) ただし、このままのファイル名だとブラウザが CA 証明書だということを認識してくれないので、拡張子を .crt に変更しておくことをおすすめする。 これは、apache の http.conf にあらかじめ以下の設定が書き込まれているためである。 AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl もし .der のままで使用したければ、mime.types に以下のように書き込んでおくと良い。 application/x-x509-ca-cert .der もしくは http.conf に (こちらは未検証) AddType application/x-x509-ca-cert .crt .der ←修正 AddType application/x-pkcs7-crl .crl としてもよい。 ■証明書署名要求ファイルの作成 ここでは Web サーバーで SSL を使用するときに必要な SSL 証明書に署名してもらうための「証明書署名要求」ファイルを作成する。 1. 自分専用の秘密鍵を作成 まず自分用のプライベート鍵を作成する。 ANYFILE には、暗号化用の種を作成するために適当なファイルを食わせる。 私は /etc/hosts.allow を使いました。(ぉ ちなみに証明書の更新の場合は、過去に作成した *.csr ファイルをそのまま次回更新時のファイルとして使用できる。 # そのため「■証明書の証明作業」より実施。 ※ファイル名はわかりやすいように "HOSTNAME.*" とする。 HOSTNAME は自ホストに読み替えること。 # cd /usr/local/apache/conf/CA/demoCA # mkdir HOSTNAME # cd HOSTNAME # openssl genrsa -rand /etc/hosts.allow -des3 2048 > ./HOSTNAME.key ※Firefox 38 で 1014bit 未満の鍵長がサポートされなくなったので注意! 181 semi-random bytes loaded Generating RSA private key, 2048 bit long modulus ........++++++ ..++++++ e is 65537 (0x10001) Enter PEM pass phrase: パスフレーズ(絶対忘れないこと) Verifying password - Enter PEM pass phrase: パスフレーズの再入力 ※パスフレーズ無しで作成するときは -des3 を削除。 これは「DES3 のパスフレーズを使用する」という意味なのでパスフレーズが不要な場合は付けなければ良い。 このファイルは絶対に誰にも取得されては困る「秘密鍵」となるもので、管理は厳重にしなければならない。 パーミッションは 400 にしておくのがベスト。 なお、秘密鍵にパスフレーズを設定している場合は apache を起動する際にパスフレーズを聞いてくるようになる。 起動中にパスフレーズ入力プロンプトが出るとそこで止まってしまうので、パスフレーズを削除する場合は以下のようにする。 # openssl rsa -in HOSTNAME.key -out npw_HOSTNAME.key # mv npw_HOSTNAME.key HOSTNAME.key ただし、これを行うと秘密鍵を何らかの方法で盗まれた場合、悪意有るユーザーの apache に無断で仕込まれる可能性がある。 # パスフレーズを設定した場合は、たとえ秘密鍵が盗まれてもパスフレーズを入力しない限りは apache が起動できない。 2. 秘密鍵から CSR (証明書署名要求) ファイルを作成 先に作った秘密鍵で、今度は CSR (証明書署名要求) ファイル (以下 CSR と呼称) を作成する。 ここで出来たファイルを CA 認証局に送付し署名してもらう。 この CA 局は自分で立ち上げたものでも可能なので、独自証明書を作成することも出来る。 # cd /usr/local/apache/conf/CA # openssl req -new -key ./demoCA/HOSTNAME/HOSTNAME.key -out ./demoCA/HOSTNAME/HOSTNAME.csr Using configuration from /usr/local/ssl/openssl.cnf Enter PEM pass phrase: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP (自分の住んでいる国) State or Province Name (full name) [Some-State]:Osaka (自分の住んでいる都道府県) Locality Name (eg, city) []:****** (自分の住んでいる市町村名) Organization Name (eg, company) [Internet Widgits Pty Ltd]:GRIFFON Works (会社名) Organizational Unit Name (eg, section) []:GWITS Network (会社内のグループ名) Common Name (eg, YOUR name) []:*.gwits.net (SSL鯖としたいFQDNアドレス) Email Address []:griffon@griffonworks.net (SSL鯖の管理者メールアドレス) Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: オプションなので入力の必要なし→リターン An optional company name []: オプションなので入力の必要なし→リターン これでできあがった CSR に CA 機関に署名してもらう。自己 CA 機関での署名も可能。 3. ファイル名のまとめ HOSTNAME.key 自分専用の秘密鍵。 絶対に誰にも渡してはいけないし見られてもだめ。 HOSTNAME.csr 証明書署名要求ファイル。 このファイルに CA 機関に署名してもらう。 ■証明書の証明作業 「■証明書署名要求ファイルの作成」で作成された証明諸要求ファイルに署名する作業をここで行う。 1. 署名 何らかの形で送られてきた CSR を demoCA 直下に配置しておく。 メールの本文に書き込まれていたりしたら、自分でファイルを新規作成してそのファイルにコピー&ペーストする。 CSR は内容破壊防止のため、あらかじめバックアップを取っておくことをおすすめする。 ※やっちゃいましたよえぇ。CSR が上書きで 0byte になりました。(死) ちなみにここでは証明有効期限を 182日 (半年) としてありますが、これは個人 CA 認証局の証明書の有効期限より少なくしておかなければならない。 # cd /usr/local/apache/conf/CA # openssl ca -policy policy_anything -days 182 -in ./demoCA/HOSTNAME/HOSTNAME.csr -out ./demoCA/HOSTNAME/HOSTNAME.crt (※ -out に出力するファイル名、-infile に読み込むファイル名を指定) Using configuration from /usr/local/ssl/openssl.cnf Enter PEM pass phrase: (個人 CA 証明局のパスワード) Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'JP' stateOrProvinceName :PRINTABLE:'Osaka' localityName :PRINTABLE:'*******' organizationName :PRINTABLE:'GRIFFON Works' organizationalUnitName:PRINTABLE:'GWITS Network' commonName :PRINTABLE:'www.gwits.net' emailAddress :IA5STRING:'griffon@griffonworks.net' Certificate is to be certified until Sep 28 05:44:48 2002 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated これで CSR に対して署名を行えた (ファイルは out_csr.pem) ので、これを送り元に送り返す。 有効期限は -days 182 としてあるので、半年は有効です。 ※有効期限が切れるともう一度証明してあげないとダメ ■Apache への組み込み 署名されて送り返されてきた署名済みファイルを Apache の指定ディレクトリに設置する。 ここで説明するときのカレントディレクトリは # pwd /usr/local/apache/conf とする。 署名済み証明書 # cp ./CA/demoCA/HOSTNAME/HOSTNAME.crt ./ssl.crt/server.crt # chmod 400 ./ssl.crt/server.crt CSR(証明書署名要求ファイル) # cp ./CA/demoCA/HOSTNAME/HOSTNAME.csr ./ssl.csr/server.csr # chmod 400 ./ssl.csr/server.csr サーバー秘密鍵 # cp ./CA/demoCA/HOSTNAME/HOSTNAME.key ./ssl.key/server.key # chmod 400 ./ssl.key/server.key あとは鯖を再起動して終了。 ■証明書の更新 1. [CA側] 古い証明書を revoke すると同時に、「証明書無効化証明書」(ややこしい) を出力する % openssl ca -gencrl -revoke [古い署名済み証明書(*.crt)] -out [証明書無効化証明書ファイル名] Using configuration from /usr/local/ssl/openssl.cnf Enter PEM pass phrase: [CA で使用しているパスフレーズを入力] Revoking Certificate 02. Data Base Updated 証明書無効化証明書は、クライアント認証を行っている場合 (クライアントに証明書を持たせ、その証明書とサーバーの証明書が一致しなければ NG とする、というような使い方) に必要。 これは、クライアントが保持している証明書が信用できない物となった場合、Web サーバーでその証明書を蹴るため。 このファイルは http.conf の SSLCARevocationFile で使用するが、クライアント認証を使用しなければ必要ない。 証明書無効化証明書が必要ない場合は、 % openssl ca -revoke [古い署名済み証明書] で無効化しても良い。 2. [ユーザー側] 証明書署名要求ファイルを作成しなおす 3. [CA側] ユーザー側が作成しなおした証明書署名要求ファイルに署名する 4. 署名されたファイルを Web サーバーにインスコ ■認証局証明書の更新 1. 秘密鍵を対象にした cacert.pem を作成する。 % openssl x509 -in newca.pem -days 365 -out cacert.pem -signkey demoCA/private/cakey.pem 2. 作成した cacert.pem を元にブラウザに取り込む証明書ファイル (cacert.der) を作成する。 % openssl x509 -inform pem -outform der -in cacert.pem -out cacert.der 3. mv cacert.der cacert.crt してブラウザでアクセスできるようなディレクトリに設置し、Web で告知する。 ◆[番外編] 全ての作業終了後にサーバー秘密鍵をノンパスワード型に変換してみる 通常は apache を起動するときに # /usr/local/apache/bin/apachecrt startssl Apache/1.3.20 mod_ssl/2.8.4 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide us with the pass phrases. Server www.gwits.net:443 (RSA) Enter pass phrase: (サーバー秘密鍵のパスフレーズを入力) Ok: Pass Phrase Dialog successful. bin/apachectl startssl: httpd started とパスフレーズを聴いてくるが、自動起動するときはこれが邪魔になる。 これを聞かないようにするには以下の方法で起動時のパスフレーズ入力をキャンセルすることが出来る。 # cd /usr/local/etc/apache/ssl.key # openssl rsa < server.key > server.key.out read RSA key Enter PEM pass phrase: (サーバー秘密鍵のパスフレーズを入力) writing RSA key # mv server.key server.key.enable_pass_phrase # mv server.key.out server.key しかし、このパスフレーズキャンセルを行うと、だれもがこのサーバー秘密鍵所有者になることができるのでかなりよろしくない。 (パスフレーズを生かしておくと、たとえ鍵を奪われても Apache は起動できないため安全) ■Tips - 証明書の内容を表示する # openssl x509 -in demoCA/cacert.pem -text | more ▼MRTG 動作までの順序 zlib を入れなさいと言われているが、FreeBSD はあらかじめ zlib が入っているのでその必要はない。 インストールは下記の順通りに行わないと「モジュール無いぞゴルァ(゚Д゚)」と怒られるかも。(w - libpng http://www.libpng.org/pub/png/libpng.html から落としてくる。 これを展開してインストールする。 % tar xfvz libpng-1.0.12.tar.gz % cd libpng-1.0.12 % cp scripts/makefile.linux ./makefile % vi makefile makefile を編集。 ------------------------------- ZLIBLIB=/usr/local/lib ZLIBINC=/usr/local/include ------------------------------- を有効にしておく。 あとは定例作業。 定例作業後は ldconfig でライブラリ情報を更新しておく。 % make % su # make install # ldconfig /usr/lib /usr/local/lib - gd http://www.boutell.com/gd/ ここでゲットしておく。 バージョンは 1.8.4 を使用すること。 展開した後は Makefile を修正する。 -------------------------- CFLAGS=-O -DHAVE_LIBPNG -------------------------- あとはこれを定例作業。 % make % su # make install # ldconfig /usr/lib /usr/local/lib - SNMP ucd-snmp を使用する。 http://ucd-snmp.ucdavis.edu/ ftp://ftp.win.ne.jp/pub/network/snmp/ucd-snmp/ 展開した後はいつも通り。 % ./configure ここで ---------------------------------- -Press return to continue- ---------------------------------- と言われるのでリターンキーを押す。するといろいろ聞かれるのでそれに答えてゆく。 ---------------------------------- System Contact Information (griffon@griffonworks.or.jp): ---------------------------------- ↑システム管理者のメールアドレスを記述する。 ---------------------------------- System Location (Unknown): ---------------------------------- ↑システムが存在する場所を聞いているが、ここはリターンで抜ける。 ---------------------------------- Location to write logfile (/var/log/snmpd.log): ---------------------------------- ↑snmpd のログファイル置き場とログファイル名。そのままでいい場合はリターン、駄目な場合は適当に書き直す。 ---------------------------------- Location to write persistent information (/var/ucd-snmp): ---------------------------------- ↑snmp の情報ファイルの置き場所。そのままでいい場合はリターン、駄目な場合は適当なディレクトリ名に書き直す。 % make % make test % su # make install 設定は /usr/local/share/snmp/snmpd.conf を編集。 ファイルは ソース展開ディレクトリ内にある EXAMPLE.conf を /usr/local/share/snmp/snmpd.conf としてコピー。 その後パーミッションを 600 にする。 % cp EXAMPLE.conf /usr/local/share/snmp/snmpd.conf % chmod 600 /usr/local/share/snmp/snmpd.conf 設定開始。 ------------------------------------ com2sec local localhost local com2sec mynetwork 192.168.1.0/24 public ------------------------------------ これで 192.168.1.1〜192.168.1.254 のクライアントが SNMP で情報を取得できるようになる。 public というのは SNMP 情報を取得する際のパスワードになるので、わかりにくいものにしておくこと。 まちがっても public などという「説明で使われている一般常識的」文字列を使わないように。 ------------------------------------ group MyRWGroup v1 local group MyRWGroup v2c local group MyRWGroup usm local ------------------------------------ 上記 3行はコメントアウトしておく。 設定が完了すれば起動。 % ./snmpd 起動時に自動実行するように、以下の内容を記述したファイルを /usr/local/etc/rc.d/ に入れておく。 ------------------------------------- #!/bin/sh if [ -f /usr/local/sbin/snmpd ]; then /usr/local/sbin/snmpd echo ' snmpd' fi ------------------------------------- - MRTG http://ee-staff.ethz.ch/~oetiker/webtools/mrtg/ ここでゲットしておく。 あとは定例作業。 % ./configure % make % su # make install 設定ファイルは自前で仕上げる。 以下はサンプル。 ------------------------------------------------------------------------------------ ### 共通設定項目 # グラフ出力先ディレクトリ WorkDir: /home/tsukasa/public_html/mrtg # イメージアイコンの場所 (MRTG ソースディレクトリの images をコピー) IconDir: images # 最新の時間を右側へ Options[_]: growright # 日本語(EUC)出力 Language: eucjp WriteExpires: No # 更新時間(単位:分) Interval: 5 ### ネットワークトラフィック Target[traffic]: 1:public@localhost: SetEnv[traffic]: MRTG_INT_IP="" MRTG_INT_DESCR="rl0" MaxBytes[traffic]: 12500000 WithPeak[traffic]: wm Suppress[traffic]: y ShortLegend[traffic]: Bytes/s Title[traffic]: Traffic Analysis PageTop[traffic]:

ネットワークトラフィック

### CPU Load Average Target[cpuload]: .1.3.6.1.4.1.2021.10.1.5.1&.1.3.6.1.4.1.2021.10.1.5.2:public@localhost Options[cpuload]: gauge,absolute,growright,nopercent MaxBytes[cpuload]: 100 WithPeak[cpuload]: mw YLegend[cpuload]: Load Average (%) LegendI[cpuload]: 1分間 LegendO[cpuload]: 5分間 ShortLegend[cpuload]: % Unscaled[cpuload]: dwmy Title[cpuload]: CPU Load Average PageTop[cpuload]:

CPU ロードアベレージ

------------------------------------------------------------------------------------ ▼Perl でグラフ出力を出来るようにするまでの険しい道のり 上から順番に。 順番を間違えるとインストールできません。 libpng-1.0.10.tar.gz - PNG 生成用 Perl ライブラリ ftp://ring.tains.tohoku.ac.jp/archives/text/CTAN/graphics/gnuplot/libpng-1.0.8.tar.gz % cp scripts/makefile.solaris makefile % make all # make install gd-1.8.4 - GD ライブラリ ftp://ftp.boutell.com/pub/boutell/gd/gd-1.8.4.tar.gz Makefile 編集 ---------------------- CFLAGS=-O gd_jpeg.o 2カ所の削除 (gd_jpeg.o をマージしない) ---------------------- % make # make install GD-1.33.tar.gz - Perl用GD Perl ライブラリ ftp://ring.iwate-pu.ac.jp/pub/lang/perl/CPAN/authors/id/L/LD/LDS/GD-1.33.tar.gz % perl Makefile.PL Build JPEG support? [y] n Build FreeType support? [y] n Build XPM support? [y] n % make # make install GDTextUtil-0.80.tar.gz - テキスト処理用 Perl ライブラリ ftp://ring.iwate-pu.ac.jp/pub/lang/perl/CPAN/authors/id/M/MV/MVERB/GDTextUtil-0.80.tar.gz % perl Makefile.PL % make # make install GDGraph-1.33.tar.gz - グラフ生成用 Perl ライブラリ ftp://ring.iwate-pu.ac.jp/pub/lang/perl/CPAN/authors/id/M/MV/MVERB/GDGraph-1.33.tar.gz % perl Makefile.PL % make # make install ▼クォータ (quota) 設定 1.カーネルに options QUOTA を追加して再構築 2./etc/rc.conf に enable_quota="YES" と check_quotas="YES" を追加する。 3./etc/fstab の第4フィールドに userquota、groupquota を追加する。 4.再起動 5.quotacheck で該当のパーティションを対象にチェックをかける。 # quotacheck /usr 6.edquota で各ユーザー、もしくは各グループに対して quota 制限をかける。 # edquota -u testuser ← -u はユーザーが対象、testuser はアカウント名 ---[edquota]------------------------------------------------ Quotas for user testuser: /var: blocks in use: 0、 limits (soft = 0、 hard = 50) inodes in use: 0、 limits (soft = 0、 hard = 0) /pub1: blocks in use: 12、 limits (soft = 0、 hard = 25) inodes in use: 13、 limits (soft = 0、 hard = 0) ------------------------------------------------------------ カッコ内の soft と hard を変更する。 単位はブロック側は KB (キロバイト)、inodes 側はファイル数。 - フィールド説明 PARTITION: blocks in use: USEBLOCK、 limits (soft = BLOCKSOFTLIMIT、 hard = BLOCKHARDLIMIT) inodes in use: USEINODES limits (soft = INODESSOFTLIMIT、 hard = INODESHARDLIMIT) PARTITION : パーティション名 USEBLOCK : 使用済みブロックサイズ (単位/KB) BLOCKSOFTLIMIT : 執行猶予付きブロック制限サイズ (単位/KB) BLOCKHARDLIMIT : 執行猶予無しブロック制限サイズ (単位/KB) USEINODES : 使用済み inode 数 (単位/恐らくファイル数) INODESSOFTLIMIT: 執行猶予付き inode 数 (単位/恐らくファイル数) INODESHARDLIMIT: 執行猶予無し inode 数 (単位/恐らくファイル数) ・quotaon していないと編集できないかも。 ・group に対して quota をかけると、その group 全体の quota になるので注意。 たとえば gid:1001 に quota 40MB をかけたとすると、gid:1001 に所属している全員の合計が 40MB に制限される。 7.quotaon する # quotaon -a /etc/fstab に書き込まれた全ての quota 設定を有効にする。 8.テストする - inodes テスト 制限個数以上のファイルが作成できないかどうかをチェック。 ファイルサイズは 0バイトでかまわない。 # perl foreach (1..10) { `touch test$_`; } [DTRL+D] /pub1: write failed、 user inode limit reached touch: test6: Disc quota exceeded エラーメッセージが出れば成功。 制限以上のファイルは作成されない。 - blocks テスト 制限ファイルサイズ以上のファイルをコピーして鰓が出るか確認。 # cp /pub1/mp3/z01_19.mp3 . /pub1: write failed、 user disk limit reached cp: ./z01_19.mp3: Disc quota exceeded エラーメッセージが出れば成功。 制限以上のファイルサイズを作成したときは 0バイトになる。 9.スタートアップに登録する。 ブート時は quotaon しないようです。 てっきり on になると想っていたのですが・・・。 --- /usr/local/etc/rc.d/quota.sh ------------------------ #!/bin/sh /usr/sbin/quotaon -a > /dev/null && echo -n ' quota' --------------------------------------------------------- 【Tips】 ・メールの受信サイズを制限したい。 ・ホームディレクトリの上限を制限したい。 共通して言えることは、「パーティションを別にしよう」ということです。 クォータシステムは /etc/fstab で指定されたパーティション直下全てに制限をかけます。 たとえばもし、/var/ 直下全てに制限がかかっており、なおかつ /var/tmp/ をユーザーに一時利用ディレクトリとして開放している場合、/var/tmp/ に制限ギリギリのファイルを置いてあり、大きなメールが来たときにはメール受信拒否をされてしまいます。 今回のような場合は、/home/ 及び /var/mail/ を独立したパーティションとして作成しなければなりません。 【コマンド】 repquota :quota 状況を表示 quota(on|off) :quota を on/off する。 quotacheck :quota の整合性をチェックする (通常は使わない) ▼テープドライブの使い方(FreeBSD 3.3.0-RELEASE) 1.テープドライブを設置する 2./dev/ で ./MAKEDEV sa を実行してテープドライブデバイスを作る 3.mt -f /dev/rsa0 status で認識しているかを確認 HP C1533A での出力サンプル(テープメディア無し) Mode Density Blocksize bpi Compression Current: 0x24:DDS-2 variable 61000 enable ---------available modes--------- 0: 0x24:DDS-2 variable 61000 enable 1: 0x24:DDS-2 variable 61000 enable 2: 0x24:DDS-2 variable 61000 enable 3: 0x24:DDS-2 variable 61000 enable --------------------------------- Current Driver State: at rest. ▼SMTP 不正リレーチェック (共通) telnet で 25番ポートに接続して以下のように処理を行う。 1.telnet チェックするメールサーバー 25 を実行 % telnet localhost 25 2.HELO 名前(適当) を送信 3.MAIL FROM:メールアドレス を送信 これは友達のメールアドレスを貸してもらおう。 4.RCPT TO:メールアドレス を送信 4番を送信し終わった時点でしばらくすると結果が返ってくる。 もしここで 250 Ok となったら不正リレーができてしまう。 しかし、 554 メールアドレス: Recipient address rejected: Relay access denied となったら不正リレーは出来ないようになっている。 telnet を抜ける場合は QUIT を送信することで切断する。 # telnet griffonworks.homeip.net 25 >Trying 203.141.102.154... >Connected to griffonworks.homeip.net. >Escape character is '^]'. >220 leviathan.griffonworks.or.jp ESMTP Postfix HELO wyvern >250 leviathan.griffonworks.or.jp MAIL FROM:griffon@iris.ne.jp >250 Ok RCPT TO:griffon@iris.ne.jp >554 : Recipient address rejected: Relay access denied QUIT >221 Bye >Connection closed by foreign host. 手動で実行するのが面倒な場合は以下のサイトを利用するとよい。 http://www.kyoto.wide.ad.jp/mta/relaycheck.html ◆IPFW による防火壁構築 http://www-imai.is.s.u-tokyo.ac.jp/~natori/ipfw/#3 ◆アップグレード方法のリンク先間違えました。 http://www.jp.freebsd.org/QandA/HTML/325.html ◆wget リンクす http://plaza27.mbn.or.jp/~satomii/jdoc/wget/wget-j4.html http://seagull.cs.uec.ac.jp/~horiuc-m/Others/wget.html#option http://members.tripod.co.jp/futora/wget153/ ◆JVim 付属の日本語ドキュメント http://www.griffonworks.homeip.net/jvim_doc/ ▼vi 日本語版 - JVim Ver-3.x 1.ファイルのダウンロード http://hp.vector.co.jp/authors/VA003457/vim/ で vim と jvim をダウンロードしてくる。 wget なんかがあると FreeBSD で簡単にダウンロードできる。 % wget http://hp.vector.co.jp/authors/VA003457/vim/vim3/2.1/jvim.2.1.tar.gz % wget http://hp.vector.co.jp/authors/VA003457/vim/vim3/orig/vim-3.0.tar.gz 2.vim の展開 ソースは /usr/src/ 直下に展開すると綺麗かも。 % tar xfvz vim-3.0.tar.gz すると vim/ ができあがる。 ファイルはこの中に展開されているのでこの中に潜ろう。 % cd vim ここで jvim を展開する。 %pwd /usr/src/vim % tar xfvz jvim.2.1.tar.gz 日本語化パッチ当て。 % patch -p < jvim.diff これで日本語化パッチが当たります。 次に src に潜って makjunix.mak を編集する。 編集する箇所は最低限、 # generic for Sun、 FreeBSD、 NetBSD、 NeXT、 POSIX and SYSV R4 (?) without x11 code # (TESTED for Sun 4.1.x and FreeBSD) # standard cc with optimizer # #MACHINE = -DBSD_UNIX -DUSE_LOCALE #CC=cc -O #LIBS = -ltermlib の MACHINE 〜 LIBS のコメントを外すだけ。 あとはこのファイルを Makefile にリネーム。 その後、Makefile 内の DEFS = に # # PART 2: various choices # に書かれているオプションを指定することで、デフォルトでその通りの動作になる。 今回は vi と同じ動作をするように、*.bak ファイルを作らなくしてみる。 DEFS = -DDIGRAPHS -DTERMCAP -DSOME_BUILTIN_TCAPS -DNO_FREE_NULL -DVIM_ISSPACE \ -DWEBB_COMPLETE -DWEBB_KEYWORD_COMPL -DNOBACKUP\ -DVIM_HLP=\"$(HELPLOC)/vim.hlp\" \ -DKANJI -DUCODE -DTRACK -DCRMARK -DFEXRC -DUSE_GREP -DUSE_TAGEX -DUSE_OPT $(FEPOPT) -DNOBACKUP を付ける。 これで *.bak を作成しないようになる。 あとは make するだけ。 3.インストール make install で完了する。 エラーがでるけど無視。(ぉぃ 4.リンクを張る 元の vi は /usr/bin/ に入っているので、この vi を適当な名前にリネームしておく。 % cd /usr/bin % pwd /usr/bin % mv vi vi.master あとは vim を vi として使えるようにする。 % ln -s /usr/local/bin/vim ./vi 簡単な方法としては、.cshrc で alias を使って vim を vi として見せかける方法もあるが、これだと alias を指定していない場合は面倒なのでシンボリックリンクを張った方がいいだろう。 % alias vi 'vim' ▼Majordomo インストールと日本語化など ◇Majordomo の日本語化パッチ当て済みファイル http://www.jca.apc.org/~yukihiro/majordomo/ (日本語化 Majordomo → http://www.jca.apc.org/~yukihiro/majordomo/majordomo2k0123.tar.gz) 上記ファイルを展開して、Makefile と majordomo.cf (cp sample.cf majordomo.cf) を編集して make install → make install-wrapper → インストール先ディレクトリに移動 → ./wrapper config-test ◇ML に連番を付ける (追記) ML の記事に連番を付けるのはいいが、毎回 XXXX.config を編集しなおすのは面倒くさい。 そこで、config_parse.pl を修正していつも適用させるようにする。 140行目の 'subject_prefix'、 ''、 # prefix for the subject line を 'subject_prefix'、 '#!$TEMP="";$TEMP="[$list: \$SEQNUM]";$TEMP;'、 # prefix for the subject line にする。 *** config_parse.pl Mon Apr 23 17:32:23 2001 --- config_parse.pl.master Mon Apr 23 17:41:58 2001 *************** *** 136、142 **** 'message_fronter'、 ''、 'message_footer'、 ''、 # text to be added at bottom of posting 'message_headers'、 ''、 # headers to be added to messsages ! 'subject_prefix'、 '#!$TEMP="";$TEMP="[$list: \$SEQNUM]";$TEMP;'、 # prefix for the subject line 'taboo_headers'、 ''、 # if a header matches、 review message 'taboo_body'、 ''、 # if body matches、 review message # yasuda (approve by token) --- 136、142 ---- 'message_fronter'、 ''、 'message_footer'、 ''、 # text to be added at bottom of posting 'message_headers'、 ''、 # headers to be added to messsages ! 'subject_prefix'、 ''、 # prefix for the subject line 'taboo_headers'、 ''、 # if a header matches、 review message 'taboo_body'、 ''、 # if body matches、 review message # yasuda (approve by token) ML に連番を割り当てる方法は http://www.y-min.or.jp/~nob/ML/sequencer.html ◇ML の新規作成スクリプト メーリングリストを新規作成するときは、沢山のファイルを作らないとならないため、比較的面倒な作業になってしまう。 そこで、Perl スクリプトでこれらのファイルを自動的に作成し、alias ファイルまで自動で更新させてしまうことにする。 http://www.os.xaxon.ne.jp/~griffon/freebsd/majordomo/make_ml.pl ・chown を使っているし、alias ファイルを更新するので、必ず root 権限で実行すること。 ・majordomo のホームディレクトリが私の環境とは違うかもしれないので、それに応じてこのスクリプトを編集しなおすこと。 ▼BIND8 アップグレード 1.ファイルのダウンロード http://www.isc.org/products/BIND/ で最新版を拾ってこれるので、ここでソースを拾ってくる % cd /usr/src % pwd /usr/src % mkdir bind % cd bind % pwd /usr/src/bind % wget ftp://ftp.isc.org/isc/bind/src/8.2.3/bind-src.tar.gz 2.BIND を停止する FreeBSD 3.3 では ndc(8) (ネームサーバデーモン制御インタフェース) が付いているので、これで停止させる。 停止させる場合は root になっておくこと。 % su Password: # ndc stop # exit % 3.ソースの展開 % tar xfvz bind-src.tar.gz 4.コンパイル FreeBSD は /etc/namedb/ 直下に BIND の設定ファイルが入っているので、これに合わせて make を実行する。 % make DESTETC=/etc/namedb 5.バージョンの確認 % pwd /usr/src/bind_tmp/src % cd bin/named/ % pwd /usr/src/bind_tmp/src/bin/named % what ./named ./named: (中略) named 8.2.3-REL 2001年 4月25日 水曜日 16時24分27秒 JST root@leviathan:/usr/src/bind_tmp/src/bin/named % 最終行のバージョン番号を確認する。 時間などの情報は、make した時の日時などが記録されている。 6.インストール root になっておくこと。 % su Password: # make install 7.BIND 起動 # ndc start new pid is 91103 # exit 番号は BIND の PID になる。 ▼OpenSSH インストール FreeBSD 4.x には標準で付属しているそうだが、FreeBSD 3.x には入っていない。 OpenSSH をインストールするには以下のファイルが必要。 ・Ver0.9.5a 以上の OpenSSL (http://www.openssl.org/) ・OpenSSH (http://tanaka-www.cs.titech.ac.jp/~euske/doc/openssh/)  ※OpenSSH は「移植版リリース(http://tanaka-www.cs.titech.ac.jp/~euske/doc/openssh/portable.html)」をダウンロードすること 今回使用するのは ・OpenSSL 0.9.6a ・OpenSSH 2.5.2p2 先に OpenSSL をインストールする。 % tar xfvz openssl-0.9.6a.tar.gz % cd openssl-0.9.6a/ % ./config % make % make test % su Password: xxxxxxxx # make install 特に何も考えずに make 一発で終わるようだ。 make test したときに何もエラーがでなければ、引き続き OpenSSH のインストールを行う。 (私が作業を行ったときはあいにく (?) エラーがでなかった) % tar xfvz openssh-2.5.2p2.tar.gz % cd openssh-2.5.2p2/ % ./configure % make ※make install はまだ 設定ファイルのデフォルトインストールディレクトリは /etc/ になっている。 これは configure を実行するときに % ./configure --sysconfdir=/etc/ssh などとすることでディレクトリを変更できる。 あとは設定ファイルの編集を行う。 ---[sshd_conf]------------------------------------ ・PermitRootLogin の yes を no に変更する ・Subsystem sftp /usr/libexec/sftp-server をコメントアウト -------------------------------------------------- 最後に sshd のバージョンを確認して、OK であれば make install を行う。 このとき、ssh でログオンしている場合は、sshd を殺して telnet で入れるようにしておく。 (telnet ログオンの許可は /etc/inetd.conf で設定) 今回はあらかじめ telnet でログオンしていることを前提とする。 % ./sshd -v sshd: illegal option -- v sshd version OpenSSH_2.5.2p2 Usage: sshd [options] (省略) % su Password: xxxxxxxx # make install make install が終了したら、ssh でログオンできるかを確認する。 # /usr/local/sbin/sshd sshd を起動して Windows から TeraTermSSH でログオンしてみる。 ログオンが失敗すれば、sshd_config を確認してみる。 ほかにログにも吐き出されている可能性があるのでそちらも参照 (/var/log/messages かな?)。 成功すれば、/usr/local/etc/rc.d/sshd.sh を作成する。 ---[ /usr/local/etc/rc.d/sshd.sh ] --------- #!/bin/sh /usr/local/sbin/sshd -------------------------------------------- # chmod 755 /usr/local/sbin/sshd.sh ▼wget インストール ファイルダウンロードツール。 これがあるとわざわざ ftp に潜らなくて済んだり、http でファイルに直接ハイパーリンクが張ってある場合はそのままダウンロードできる。 Windows + SSH/Telnet で FreeBSD マシンにログオンし、Windows で情報収集をして FreeBSD でダウンロードするには最適だ。 ダウンロード: ftp://ftp.iis.u-tokyo.ac.jp/pub/GNU/wget-1.5.2.tar.gz ※同ディレクトリで最新版の 1.6 が公開中なり 今回は 1.6 を使用する。 /usr/local/etc/wgetrc % tar xfvz % cd wget-1.6/ % ./configure % make % su Password: xxxxxxxx # make install これでインストールは完了する。 wget の設定ファイル wgetrc は、デフォルトでは /usr/local/etc/ にインストールされる。 この設定ファイルで wget のデフォルト動作を固定できる。 詳しくは上に上げている wget の使い方を見て欲しい。 簡単に使い方をあげると・・・ ・ファイルをダウンロード (ftp/http) % wget http://〜〜〜 % wget ftp://〜〜〜 wget の後ろにインターネットアドレス型式でファイルを指定することで、カレントディレクトリにファイルをダウンロードする。 -p オプションを付けると静かモード (状況出力をしない) になるので、バックグラウンドでダウンロードさせるときに使うとよいだろう。 ▼PostgreSQL ユーザー登録削除及びデータベース登録削除方法 > データベースユーザー登録 % createuser USERNAME Shall the new user be allowed to create databases? (y/n) n ←データベース作成を 許可:Y / 不許可:N Shall the new user be allowed to create more new users? (y/n) n ←続けてユーザーを登録 する:Y / しない:N CREATE USER % データベース管理者アカウントでログイン後実行可能。 USERNAME には登録するユーザーアカウントを指定。 ----------------------------------------- > データベースユーザー削除 % dropuser USERNAME DROP USER % データベース管理者アカウントでログイン後実行可能。 ----------------------------------------- > データベース作成 %createdb -U ADMINUSER DBNAME CREATE DATABASE % データベースを登録する。 ADMINUSER にはデータベース作成権限を持っているユーザーを指定。 DBNAME はデータベース名。 ----------------------------------------- > データベース削除 % dropdb DBNAME DROP DATABASE % データベース管理者アカウントでログイン後実行可能。 ----------------------------------------- ▼DynamicDNS for BIND8 BIND 8.1.2 以降から DynamicDNS がサポートされている。 ということで、今回は実験的にこの機能を使ってみることにする。 1. named.conf を以下のように設定する。 SOA レコードを新たに追加するので zone 定義は新規作成する。 今回は逆引きファイルは用意しない。 zone "testdomain.hoo.bar" { type master; file "testdomain.zone"; allow-update { // nsupdate での登録を許可するマシンアドレス 192.168.1.10; }; }; 2. ZONE ファイルを用意する。 このファイルには DNS が何処にあるかだけを記述すればよい。 $TTL 86400 @ IN SOA leviathan.teamdorcom.or.jp. root.teamdorcom.or.jp. ( 200105230956 ; Serial 3600 ; Refresh 900 ; Retry 3600000 ; Expire 3600 ) ; Minimum IN NS ns.teamdorcom.or.jp. ns IN A 192.168.1.10 3. BIND をリロードする。 # ndc reload 4. エラーが出ていないかを確認。 # cat /var/log/messages May 23 09:57:33 leviathan named[122]: reloading nameserver May 23 09:57:33 leviathan named[122]: dynamic zone file 'testdomain.zone' is writable May 23 09:57:33 leviathan named[122]: Ready to answer queries. 5. nsupdate で登録する。 コマンド入力後はリターンキーの空打ちをしないと実行されないので注意。 # nsupdate > update delete test.teamdorcom.or.jp. A > res_mkupdate: packet size = 51 ;; res_send() (中略) ;; ->>HEADER<<- opcode: UPDATE、 status: NOERROR、 id: 58220 ;; flags: qr ra; ZONE: 0、 PREREQUISITE: 0、 UPDATE: 0、 ADDITIONAL: 0 > update add test.teamdorcom.or.jp. 1200 IN A 192.168.1.10 > ;; res_mkquery(0、 test.teamdorcom.or.jp、 1、 6) ;; res_send() (中略) ;; ->>HEADER<<- opcode: UPDATE、 status: NOERROR、 id: 58223 ;; flags: qr ra; ZONE: 0、 PREREQUISITE: 0、 UPDATE: 0、 ADDITIONAL: 0 > 6. nslookup で確認してみる。 # nslookup test.teamdorcom.or.jp Server: localhost.griffonworks.or.jp Address: 127.0.0.1 Name: test.teamdorcom.or.jp Address: 192.168.1.10 ---------------------------------------------------------------- nsupdate は対話入力の他にも、外部ファイルを利用したバッチ入力も可能だ。 以下のようなファイルを用意し、これを実行する。 ---[ teamdorcom.regist ] -------------------------------- update delete test.teamdorcom.or.jp. A update add test.teamdorcom.or.jp. 20 IN A 192.168.1.12 --------------------------------------------------------- 各コマンドの下には、必ず空行を入れなければならない。 これを入れ忘れた場合は更新が繁栄されないので注意すること。 あとはこのファイルを以下のように使用するだけだ。 # nsupdate < teamdorcom.regist CGI などで使用する場合はこの型式で使うと良いだろう。 ただし、Perl で使う場合は Perl スクリプトを root 権限に SetUID しておかなければならない。 さらに、SetUID された Perl スクリプトは、通常では SetUID モードで動かないので、先頭の Perl パスにオプション -U を付けておく。 (-U:allow unsafe operations) ▼Squid 2.4 インストール 1. 展開。 2. configure 実行。このとき以下のオプションのようにするとエラーメッセージが日本語になる。 # ./configure --enable-err-language=Japanese 3. make 実行。 # make 4. Squid 用アカウント作成。 # useradd squid 5. インストール # make install 6. キャッシュディレクトリ作成。 # mkdir /var/spool/squid 7. 設定ファイルの編集。 # vi /usr/local/squid/etc/squid.conf - http_port squid がリクエストを受け付けるポート番号。 - cache_dir キャッシュファイルを格納するディレクトリ。 ファイルシステムのタイプ、ディレクトリ、キャッシュファイルのサイズ (MB)、第1階層の最大ディレクトリ数、打2階層の(以下略) を指定する。 以下の指定では、ファイルシステムに UFS、ディレクトリは /var/spool/squid、容量は 200MB、第1階層のディレクトリは 16個、第2階層のディレクトリは 256個に限定。 ex.) cache_dir ufs /var/spool/squid 200 16 256 - cache_mem キャッシュに対するメモリキャッシュのサイズ。 MB を付けることでメガバイト単位になる (らしい)。 ex.) cache_mem 8 MB - cache_access_log - cache_log - cache_store_log 各種ログファイルのファイル名及びディレクトリ指定。 - pid_filename Squid の PID を格納するファイル名。 - acl http_access 等の設定で用いるアクセスリスト名の設定。 これは名前とリストを決定するだけで、直接動作を決定するものではない。 ここには適当に家庭内ネットワークアドレスを書いておくこと。 acl gw src 192.168.1.0/255.255.255.0 これは 192.168.1.xxx の全ての範囲を示す。 - http_access TCP のアクセス許可設定。 デフォルトは「全てを弾く」になっているので、acl で設定した家庭内用アクセスリスト名を指定する。 http_access allow gw これでアクセスリスト名 gw で指定された範囲の IP アドレスを持っているマシンから squid が利用できる。 - cache_effective_user Squid の実行 UID。 ユーザーはあらかじめ作成しておく。 ex.) cache_effective_user squid - cache_effective_group Squid の実行 GID。 ユーザーはあらかじめ作成しておく。 ex.) cache_effective_group squid - cachemgr_passwd マネージャにアクセスする時のパスワード設定。 shutdownを禁止し、他のコマンドはパスワードなしにするなら cachemgr_passwd disable shutdown cachemgr_passwd none all - icon を png 化する場合 /usr/local/squid/etc/icons で gif2png -Od *.gif を実行し、 /usr/local/squid/etc/mime.conf のicon名を *.gif から *.png に変更する。 (gif2png が発見できず) 8. /usr/local/squid/ 直下全てのオーナーを squid:squid に変更する。 # chown -E squid:squid /usr/local/squid/ 9. まずは起動テスト。 # pwd /usr/local/squid # touch logs/cache.log # chown squid:squid logs/cache.log # tail -f logs/cache.log こうすることでログファイルに吐き出されるエラーメッセージをリアルタイムに見ることが出来る。 ここで もう1枚 Telnet を上げて # /usr/local/squid/bin/RunCache を実行する。 これを実行すると、デーモン状態『ではない』状態で起動する。 なにかエラーが出て動作できない場合は RunCache が 5回リトライする。ログファイルをよく見ておくこと。 RunCache は sh スクリプトで、squid -NsY で起動している (オプションについては squid -h 参照) 上手く起動していれば適当なクライアントから squid が起動しているマシンをプロキシに指定して外につないでみる。 上手く繋がればあとは自動起動の設定のみだ。 10.オートスタートアップの設定 /usr/local/etc/rc.d/ に適当なファイル名で起動スクリプトを置いておく。 ---[ squid.sh ]----------------------------- #!/bin/sh [ -x /usr/local/squid/bin/squid ] && /usr/local/squid/bin/squid -s > /dev/null && echo -n ' squid' -------------------------------------------- -x でファイルがあるかを調べ、もしあるならコマンドを実行する。 squid オプションは -s (syslog を取る→デフォルトは /var/log/messages に吐かれる) である。 How to install squid-2.3.STABLE4 http://www.am.ics.keio.ac.jp/~masaki/memo/servers/squid-2.3.STABLE4.html 2.2 squid.confの日本語訳 http://www.is.kochi-u.ac.jp/~96i42/conf.html Linux - Squid http://www.win.ne.jp/~yoshikaw/linux/squid.html ▼PostgreSQL & Apache & Perl での注意 PostgreSQL を起動させる時、先に ldconfig -m /usr/local/pgsql/lib と打っておかないとライブラリを見つけられないでエラーになるので注意。 - /usr/local/etc/rc.d/postgres.sh #!/bin/sh POSTGRES=/usr/local/pgsql/bin/pg_ctl PGDATA=/usr/local/pgsql/data # if [ -f $POSTGRES ] ; then echo -n ' PostgreSQL' ldconfig -m /usr/local/pgsql/lib su - postgres -c "$POSTGRES -D $PGDATA start" fi