-
001586
明日 09/11 は Apache CouchDB の勉強会に参加してきます。
話を聞きながら実際に触れる環境があったほうが良かろうと、自宅サーバーに最新の Apache CouchDB をセットアップし直しました。 最初は Windows XP が動いている NetBook にインストールしようとしたのですが、いろいろとハードルがあって断念。 勉強会の会場はルノワールなので、Wi-Fi が使えて自宅サーバーにアクセスできるからまあ良いかと。
Apache CouchDB は Erlang で書かれている RESTful なデータベースシステムで、アクセスに使用するプロトコルは HTTP です。 key-value を JSON の形投げ込み、Map-Reduce で取り出すことができます。 Map-Reduce の記述は JavaScript です。 データベースといっても ACID なトランザクションモデルではなく、いわゆる BASE で Eventually Consistent なイマドキ風です 元々は伝統的なほうのデータベースのエンジニアだった身としては、眉毛にツバをつけたくならなくもないんですが、どれも魅力な技術要素なのでつい手を出してしまいました。 特に RESTful なあたりはぼくの好みです。
インストールの手順はこちらが詳しいです。
必要なパッケージの準備必要なパッケージのいくつかは EPEL (EExtra Packages for Enterprise Linux) のリポジトリーから取得できるので、まずは EPEL を使えるようにセットアップします。
$ wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm $ sudo rpm -Uvh epel-release-5-3.noarch.rpm
これで /etc/yum.repos.d 以下に epel.repo と epel-testing.repo の二つのファイルが作成されます。 ぼくの環境は CentOS 純正以外のリポジトリは /etc/yum.repos.d/extra に分けているので、二つの *.repo ファイルを extra ディレクトリに移動しました。 これで、以下のように必要なパッケージをインストールできます。
$ sudo yum install unixODBC unixODBC-devel $ sudo yum install -c extra.conf js js-devel erlang
"js" というのは SpiderMonkey という Firefox が使用している JavaScript エンジンの Standalone 版です。
icu のインストールEPEL には icu も用意されているのですが、一部コマンドが不足していたので別途ソースからインストールしました。
$ wget http://download.icu-project.org/files/icu4c/4.2.1/icu4c-4_2_1-src.tgz $ tar zxf icu4c-4_2_1-src.tgz $ cd icu $ ./configure && make $ sudo make install
Apache CouchDB のインストールさて、いよいよ Apache CouchDB 本体のインストールです。 前回は Erlang などもソースから入れたりしたので結構手間取ったのですが、今回は yum で入れられたのであっさりです。 2009-09-10 時点で最新の 0.9.1 をインストールします。
$ wget http://ftp.kddilabs.jp/infosystems/apache/couchdb/0.9.1/apache-couchdb-0.9.1.tar.gz $ tar zxf apache-couchdb-0.9.1.tar.gz $ cd apache-couchdb-0.9.1 $ ./configure && make $ sudo make install
インストール後の設定デフォルトでインストールすると /usr/local 以下に設定ファイルなどが配置されます。 今はよいですが、いずれ絶対に忘れてしまうので、Linux の標準的な位置から参照できるようにしておきます。
$ sudo ln -s /usr/local/etc/couchdb /etc/couchdb $ sudo ln -s /usr/local/etc/rc.d/couchdb /etc/rc.d/init.d/couchdb
続いて Apache CouchDB 起動用のユーザーを追加します。
$ sudo /usr/sbin/adduser -r \ > --home /usr/local/var/lib/couchdb \ > -M --shell /bin/bash \ > --comment "CouchDB Administrator" couchdb
起動と動作確認さきほど symbolic link を張っておきながら何なんですが、/etc/rc.d/init.d/couchdb はうまく機能してくれません。 今のところ定常的にサービスを提供する必要はないので、デーモンではなくターミナルから起動してお茶を濁します。
$ sudo couchdb
これでエラーが出ずに起動すれば成功です。 こんな感じにしておけば静かに動いてくれます。
$ sudo couchdb > /dev/null 2>&1 &
Apache CouchdDB へは HTTP でアクセスします。 curl を使って動作を確認して見ます。
$ curl http://127.0.0.1:5984/ {"couchdb":"Welcome","version":"0.9.1"}"Welcom" の文字と Apache CouchDB のバージョンが返ってきます。 終了するときは、不本意ですがこれで。
$ fg ^C
その後以上の手順でひとまず Apache CouchDB を動かすことはできるようになりました。 これからここにデータを入れたり、Map-Reduce で取り出したりする必要があります。 そのあたりはこれを読むと良いでしょう。
紹介した本人もまだ読み切ってはいないのですが、O'Reilly から出ている書籍の Web 版です。 これが無償とは、なんとも太っ腹。 ありがたく活用させていただきましょう。
[ permalink ] [ 0 comment(s) ] [ 0 trackback(s) ] -
001470
自宅では Web mail に Squirrelmail を利用しています。 ここ最近、ファイルを添付できなくなったので、調査してみました。
添付ファイルは一時的に /var/spool/squirrelmail/attach に保存されます。 このディレクトリをチェックしてみたところ、こんな状態でした。
$ ls -l /var/spool/squirrelmail drwx------ 2 user00 user00 4096 Jan 24 07:11 attach
所有者と所有グループが Apache の実効ユーザーと異なっています。 恐らくこれが原因。
$ sudo chmod apache:apache /var/spool/squirrelmail
といった具合で、解消しました。
-
001328
諸事情で HP ML115 を 13,750 円で購入し、2GB のノー・ブランド DIMM DDR2 SDRAM 二枚を 7,760 円で購入して突っ込み、CentOS5.2 をインストールし、MySQL で大きめな統計処理をぐるぐると回しておりました。 が、あまりにも遅い。 同じ処理を RAM 512MB の Dell SC430 でも実行していたのだけれど、その数倍の時間をかけても完了しません。 おかしい・・・。
vmstat をみても、block in / block out がさして多いわけでもなく、CPU usage が 100% 近辺をさまよっています。 ディスクを使わず、メモリ上で CPU がブン回っている理想的な状態です。 が、しばらく見ていると、たまに cpu wait が跳ね上がります。 確かに、データベースを使っていて disk I/O を 0 にするのは厳しいので、これは仕方ない。 が、しかし、よくよく見ると I/O wait が 100% 近くになったまましばらくまたされます。 SC430 はもう少し頻繁に Disk I/O が発生していますが、ML115 ほど I/O wait が跳ね上がったままの状態が続かないぞ・・・。 確かに CPU 性能には差がありますが(AMD Athlon 64 3500+ / Intel Pentium D 2.8GHz)、それは I/O wait 時間に関係がありません。 となると、ディスク性能があやしくなってきます。
まずは dbench を実行してみました。
以下の手順でコンパイルし、
$ wget http://samba.org/ftp/tridge/dbench/dbench-4.0.tar.gz $ tar zxf dbench-4.0.tar.gz $ cd dbench-4.0 $ ./autogen.sh $ ./configure $ make
実行。
ML115 $ ./dbench -c client.txt 1 ... 1 30795 8.61 MB/sec warmup 21 sec latency 201.968 ms 1 31612 8.50 MB/sec warmup 22 sec latency 500.014 ms 1 32777 8.41 MB/sec warmup 23 sec latency 810.937 ms ...
SC430 $ ./dbench -c client.txt 1 ... 1 257768 53.93 MB/sec warmup 26 sec latency 21.852 ms 1 272487 54.93 MB/sec warmup 27 sec latency 21.601 ms 1 287121 55.80 MB/sec warmup 28 sec latency 21.750 ms ...
桁違いです・・・。 スループットもレイテンシーも文字通り桁が違います。 参った・・・。
続いて hdparm を走らせてみます。
ML115 $ sudo hdparm -t /dev/sda /dev/sda: Timing buffered disk reads: 222 MB in 3.00 seconds = 73.93 MB/sec
SC430 $ sudo hdparm -t /dev/sda /dev/sda: Timing buffered disk reads: 216 MB in 3.02 seconds = 71.61 MB/sec
あれ? 殆ど同じ数値です。 何度か取り直しても殆ど同じ。 あれれ・・・うーむ・・・
ここではたと気付いたのですが、hdparm は "disk reads" だけを測定しているんですね。 一方の dbench はもちろん read / write 双方。 これは怪しい。 そこで、ディスクの情報を確認してみると、
ML115 $ sudo hdparm -i /dev/sda /dev/sda: Model=FB080C4080 , FwRev= HPF0, SerialNo=6RW2A54G Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4 BuffType=unknown, BuffSize=8192kB, MaxMultSect=16, MultSect=?16? CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=156301488 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 UDMA modes: udma0 udma1 udma2 AdvancedPM=no WriteCache=disabled Drive conforms to: unknown: ATA/ATAPI-1 ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5 ATA/ATAPI-6 ATA/ATAPI-7 * signifies the current active modeSC430 $ sudo hdparm -i /dev/sda /dev/sda: Model=ST3320620AS , FwRev=3.AAD , SerialNo= 3QF0KHCA Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4 BuffType=unknown, BuffSize=16384kB, MaxMultSect=16, MultSect=?8? CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=268435455 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 UDMA modes: udma0 udma1 udma2 AdvancedPM=no WriteCache=enabled Drive conforms to: Unspecified: ATA/ATAPI-1 ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5 ATA/ATAPI-6 ATA/ATAPI-7 * signifies the current active modeなんと ML115 は Write Cache が disabled です! こいつか・・・。 この設定を変えるには以下のようにします。
$ sudo hdparm -W1 /dev/sda
これで WriteCache enabled になります。 dbench の結果も改善されました。
ML115 $ ./dbench -c client.txt 1 ... 1 290707 63.28 MB/sec warmup 25 sec latency 48.369 ms 1 302699 63.30 MB/sec warmup 26 sec latency 48.974 ms 1 314756 63.30 MB/sec warmup 27 sec latency 44.975 ms ...
めでたい!
と、さらっと書いていますが、ここまで 12h 近くが経過してしまいました。 ふぅ、大変だった。 さて、計算のやり直しだ。
-
001322
先週 2008/06/24 に CentOS 5.2 がリリースされました。
- [CentOS-announce] Release for CentOS-5.2 i386 and x86_64
- Manuals/ReleaseNotes/CentOS5.2 - CentOS Wiki
ぼくの自宅サーバーは CentOS 4.6 が稼動しており、そろそろバージョンを上げたいなと思っていたところなので、せっかくだからと、最新版に手を出してしまいました。 これが間違いの元だった・・・。 なにやらいろいろと苦労したのでメモを残して起きます。
CentOS 5.2CentOS 5.2 はリリースされてからまだ日も浅く、それほど情報はありませんが、4.x から 5.1 にアップグレードした記録を見る限りは yum upgrade では上げられそうにありません。 ここは素直に DVD の ISO イメージを手に入れ、インストーラーでアップグレードすることにします。 いや、それでもあまりオススメされていない手順ですけどね。
ここでまず最初の問題に遭遇。 自宅サーバーの光学ドライブは CD-ROM でした・・・。 これは自分の問題であって CentOS の問題ではないので仕方ない。 筐体をあけて、余っていた DVD を読み書きできるコンボ・ドライブを装着して事なきを得ました。 アップグレード・インストールの手順自体は至って簡単。 パッケージをインストールするのに非常に時間がかかりましたが、これはリリース・ノートにも書かれているようなメモリー容量の問題のような気がしています。 まぁ、待てば終わるので気長に。
アップグレードが終わったら、
$ wget http://ftp2.riken.jp/Linux/centos/5.2/os/i386/RPM-GPG-KEY-CentOS-5 $ sudo rpm --import RPM-GPG-KEY-CentOS-5 $ sudo yum update
としてパッケージを最新の状態にしておきましょう。
Apacheアップグレード直後の起動時に、サービスの起動がいくつか FAILED になっているのが見えました。 まぁ、バージョンを大幅に上げたからねぇ。 予想される範囲内。
そのフェールしているものの一つが Apache でした。 CentOS4.6 では Apache2.0 だったのが、CentOS5.2 では Apache2.2 になっています。 これに伴い、モジュールの構成などが大幅に変わっています。 特に認証周りが顕著。
LoadModule ディレクティブなどを新しい設定ファイル(/etc/httpd/conf/httpd.conf.rpmnew として保存されている)を参考にして書き直します。 そして /etc/rc.d/init.d/httpd start として Apache を起動します。
dovecotIMAP サーバーとして導入している dovecot は 0.99 から 1.0 に上がっています。 メジャー・バージョンが変わっているだけあって、設定ファイルにいろいろと変更が発生していました。
プロトコルごとの LISTEN の設定は次のようにブレースでまとめるようになっていました。
protocols = imap imaps protocol imap { listen = *:143 ssl_listen = *:993 }続いては SSL の設定です。
ssl_cert_file = /etc/ssl/service.crt ssl_key_file = /etc/ssl/common.nokey
最後に認証の設定。 ここもブレースでまとめるように変更されていました。 認証は dovecot 用のユーザー・ファイルを独自にメンテナンスしていたので、それを指定します。
login_dir = /var/run/dovecot/login passdb passwd-file { args = /etc/dovecot.passwd } userdb passwd-file { args = /etc/dovecot.passwd }最後に /etc/rc.d/init.d/dovecot restart として dovecot を再起動します。
SquirrelMailApache と dovecot が動くようになると、次は WebMail システムの SquirrelMail の設定を見直しました。 なかなか動かなかったのですが、結局は
$ sudo chown -R apahce:apache /var/lib/php
が正解。 それって SquirrelMail というよりも PHP の問題・・・。
BINDbind は 9.2.4 から 9.3.4 に上がりました。 RPM が古い設定ファイルを /var/named/chroot/etc/named.conf.rpmsave としてバックアップするので、これを新しい named.conf に上書きすると問題なく動作しました。 Apache といい、この BIND といい、きちんと backward compatibility が保たれているのは素晴らしいですな。
PostgreSQL一番苦労したのが PostgreSQL。 CentOS4.6 では 7.4 だったものが 8.1 になっています。 PostgreSQL は小数点以下一桁目が変わるとデータのマイグレーションが必要になります。 今回はそもそも最上位桁が上がっているのでもう必要も必要。 本来は OS のアップグレード前に pg_dumpall で書き出しておくべきだったのですが、まったく気にせずにアップグレードしてしまいました。
残念というか当然というか PostgreSQL8.1 では 7.4 のデータ・ファイルを読むことができません。 CentOS5.2 上に PostgreSQL7.4 を導入することも検討したのですが、なかなか難しそうだったので結局は VMware 上に CentOS4.6 を導入してデータを吸い出すことにしました。
新たに導入した CentOS4.6 の PostgreSQL7.4 を停止し、/var/lib/pgsql の中身をごっそりと旧データ・ファイルで上書きして再起動します。 最初はセオリーどおり
@vmware $ sudo su postgres @vmware $ pg_dumpall > backup.dmp @vmware $ scp backup.dmp postgres@real:~/
@real $ sudo su postgres @real $ psql -f ~/backup.dmp
としたのですが、データの不正が発生してうまくいきません。 最終的には新マシンで
@real $ pg_dumpall -h vmware -U popsql | psql
として、直接パイプで流し込むことで移行できました。 失敗ケースが 7.4 の pg_dumpall で吸い出して 8.1 の psql で読んでいるのに対して、成功したケースは 8.1 の pg_dumpall を 7.4 のサーバーにつないで、その出力を 8.1 の psql で読んでいる状態です。 ということは、やはり一時的に両方のバージョンを用意する必要があったんですね。
移行とは直接関係ないのですが、PGDATA を切り替える方法です。
@real $ sudo /etc/rc.d/init.d/postgresql stop @real $ sudo vi /etc/sysconfig/pgsql/postgresql PGDATA=/opt/pgsql/data @real $ PGDATA=/opt/pgsql/data @real $ initdb @real $ sudo /etc/rc.d/init.d/postgresql start
SubversionSubversion は、その裏で使っている BerklyDB のバージョンが 4.2 から 4.3 へ上がっており、過去のリポジトリをそのままは読めない場合があります。 そのときは以下の手順を踏むことで解決するようです。
過去と同じバージョンの BerklyDB を持つ環境で、
$ svnadmin recovery ~/svnrepo $ rm `svnadmin list-unused-dblogs ~/svnrepo` $ rm ~/svnrepo/db/__db.00*
として余計なファイルを消しておきます。 多分、OS のアップグレード前に実施しておくのが本当は正しいんだろうね。 今回は PostgreSQL のアップグレードに使った CentOS4.6 環境を使いました。
TracTrac は、その稼働環境であるところの Python が 2.3 から 2.4 に上がっています。 Trac そのものの問題ではないのかもしれないけれど、案の定うまく動きませんでした。 そういえば WebAdmin plugin が Python2.3 用のものだったような気も・・・。 そこで一旦 rpm --erase trac してからあらためて yum install trac としてインストールしなおしました。 WebAdmin plugin も入れなおし。
$ wget http://trac.edgewall.org/raw-attachment/wiki/WebAdmin/TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip $ mkdir TracWebAdmin $ cd TracWebAdmin $ unzip ../TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip $ cd .. $ sudo easy_install TracWebAdmin-0.1.2dev_r4240-py2.4.egg
その他自作ツールPHP が 4.3 から 5.1 に上がったため、自作のツールの一部が動かなくなりました。 結構直したつもりなのだけれど、まだいくつか調子がおかしいです。
というわけで、軽い気持ちで始めた CentOS4.6 から 5.2 へのアップグレードはなかなか大変な作業でした。 でもま、最新版ってのは気持ちがいいですな。
-
001261
先日、どうもメールが届いてこないと思ったら /var があふれていました。
$ df -h | grep var /dev/mapper/VG00-LV05 2.0G 2.0G 0.0G 100% /var幸いこのマシンでは LVM を使用してディスクを運用していたので、以下の手順でパーティションが拡張できました。
状況確認まずはボリューム・グループ (VG) の状況を確認します。
$ sudo vgdisplay VG00 --- Volume group --- VG Name VG00 System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 9 VG Access read/write VG Status resizable MAX LV 0 Cur LV 6 Open LV 6 Max PV 0 Cur PV 1 Act PV 1 VG Size 297.81 GB PE Size 32.00 MB Total PE 9530 Alloc PE / Size 4992 / 156.00 GB Free PE / Size 4538 / 141.81 GB VG UUID xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxxxx
320GB のディスクの半分程度しか使っていません。 142GB 近い十分な未使用領域が残っています。
続いてボリューム・グループ (VG) の状況も確認。
$ sudo lvdisplay /dev/VG00/LV05 --- Logical volume --- LV Name /dev/VG00/LV05 VG Name VG00 LV UUID xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxxxx LV Write Access read/write LV Status available # open 1 LV Size 2.00 GB Current LE 64 Segments 2 Allocation inherit Read ahead sectors 0 Block device 253:4
論理ボリューム (LV) の拡張現在 2GB の /var を、倍の 4GB に拡張します。
$ sudo lvextend -L +2G /dev/VG00/LV05ファイル・システムの拡張論理ボリュームを拡張しただけではファイル・システムとして利用可能な状態になりません。 以下のようにファイル・システムを拡張する必要があります。
$ sudo ext2online /dev/VG00/LV05番外 : yum が使っている領域の開放未使用領域が潤沢だったので、/var の使用状況を調査せずに拡張してしまいましたが、よくよく状況を確認すると yum がかなりの容量を消費していることが分かりました。 ダウンロードした *.rpm ファイルなどは以下のコマンドで削除することができます。
$ sudo yum clean packages
以上の作業で、/var は現在こんな感じになりました。
$ df -h | grep var /dev/mapper/VG00-LV05 4.0G 1.5G 2.4G 38% /var- 001206
自宅サーバーを常時稼動させているのですが、その稼動状況をあまりきちんと把握しておりませんでした。 よろしくない。 そこで、今月の Software Design で取り上げられていた Cacti をインストールすることにしました。
"Cacti" は「カクタイ」と発音するそうです。 Cacti は MRTG の後継であるグラフ化ツールであるRRDTool のフロントエンドとして振る舞い、各種ステータスをグラフ化して表示する Web アプリケーションです。
MRTG は古くから使われていて実績のあるグラフ化ツールではあるものの、二系統しかグラフ化できないなどの制約があり使い勝手はさすがに見劣りしてきています。 そこで開発されたのが RRDTool で、MRTG の蓄積を生かしつつ(開発者は同じ人)機能の拡充がなされています。 がしかし、欠点としてその扱いが複雑になってしまったようです。 という経緯で、この Cacti のようなフロントエンドが必要になるわけですな。
Cacti は SNMP にも対応しているので、今回は Linux サーバーだけではなく Windows XP マシンも監視対象に入れてみたいと思います。
Cacti をセットアップします自宅サーバーは CentOS なのでインストールは簡単。 RPMForge.net から、こんな具合にインストールできます。
$ yum install cacti
インストールが終わったら、DB スキーマの作成です。 Cacti はバックエンドのデータストアとして MySQL を使います。
$ sudo su - mysql $ mysqladmin -u root create cacti $ mysql -u root cacti < /var/www/cacti/cacti.sql $ mysql -u root mysql mysql> grant all on cacti.* to cactiuser@localhost \ identified by '<password>'; mysql> flush privileges
続いて、作成した DB への接続情報を Cacti に設定します。 設定ファイルは /var/www/cacti/include/config.php になります。
$database_type = "mysql"; $database_default = "cacti"; $database_hostname = "localhost"; $database_username = "cactiuser"; $database_password = "<password>"; $database_port = "3306";
念のため、Apache の設定を確認してから起動します。 Apache 用の設定は /etc/httpd/conf.d/cacti.conf に置かれます。 httpd.conf に "Include conf.d/*.conf" というディレクティブがあるので、自動的に Apache の設定として読み込まれます(ぼくはこの動きが気持ち悪いので当該ディレクティブを無効化していますが)。
$ sudo /etc/rc.d/init.d/httpd restart
設定した URI(たとえば http://example.net/cacti/)にアクセスすると、初回アクセス時のコンフィギュレーション画面が表示されます。 ぼくの場合は特に設定を変更すべき箇所が見当たらなかったので、そのまま次へ次へと。 やがてログイン画面が表示されるので admin/admin にてログインしましょう。 新しいパスワードを聞かれるので適当なパスワードを設定すれば起動完了。
デフォルトでは Localhost が登録されています。 crond を使って五分間隔で値を取得しているので、しばらく待つとグラフが表示される状態になります。 左上の "graph" タブをクリックしましょう。
Windows XP マシンの稼動状況をグラフ化するCacti のインストールが終わったので、Windows XP マシンの稼動状況を SNMP で取得してグラフ化してみましょう。 Windows XP Professional には標準で SNMP Agent 機能が用意されています。 "サービス" に "SNMP Service" がリストされているはずです。 これが存在しない場合は "コントロールパネル > プログラムの追加と削除 > Windows コンポーネントの追加と削除" から "管理とモニタツール" を追加してください。 続いて、"サービス > SNMP Service" のプロパティを開き "セキュリティ" タブを開きます。 デフォルトのコミュニティ名 "public" を変更しましょう。 また、必要に応じて接続元ホストも絞りましょう。 今回の Cacti 用には Linux サーバーの IP アドレスを指定しておけば問題ないでしょう。
SNMP Service が起動してなければ起動します。 必要に応じてファイアウォールの設定も変更してください。 以上で Windows マシン側の設定は完了です。
続いて Cacti の設定です。 箇条書きで。
- 先ほどの Web の "console" タブ画面のメニューから "Devices" をクリックします。
- 画面右上の "Add" リンクをクリックします。
- 以下のように入力します。
Description 何か分かりやすい表示名 Hostname Windows マシンのホスト名 Host Template Windows 2000/XP SNMP Community 先ほど指定したコミュニティ名 SNMP Version Version 2 SNMP Port 161 SNMP Timeout 適当に - "create" ボタンをクリックして設定を作成します
続いてグラフ定義の作成です。
- 表示された画面の "Create Graphs for this Host" リンクをクリックします
- すべてのグラフにチェックをつけて "create" ボタンをクリックします
- メニューの "Devices" をクリックします
- 先ほど作成した Windows マシンの設定にチェックをつけます
- "Cheese an action" の "Place on a Tree (Default Tree)" を選択して "go" をクリックします
- "yes" をクリックします
以上でグラフの追加は完了です。 "graph" タブから Windows マシンのグラフを表示して見ましょう。
- 001205
ぼくは CentOS のパッケージ管理に yum を使っています。 CentOS の公式リポジトリだけでもそれなりには使えるのですが、やはりほかにもパッケージが必要になる場合もあります。 そこで、非公式リポジトリをいくつか yum に登録することにしました。 非公式リポジトリを利用するにあたって注意したいのが、リポジトリが継続的にメンテナンスされるかという点。 そのリポジトリからパッケージをインストールしたはよいけれど、その後のアップデートがなくてセキュリティ・ホールもそのまま放置、なんてことになるのは非常にまずいです。 ということで、Web でもそこそこ言及の多い三つのリポジトリを選びました。
CentOS ExtrasCentOS の開発者の一人、Karanbir Singh 氏が公開しているリポジトリ。 Fedora Extras から持ってきたパッケージを CentOS 用にパッケージングしたものだそうです。
設定方法はこんな具合。
$ cd /etc/yum.repos.d $ sudo wget http://centos.karan.org/kbsingh-CentOS-Extras.repo
いたって簡単です。
digこちらは Dag Wieers 氏が個人的に公開しているリポジトリ。
氏のリポジトリは理研の FTP サイトでもミラーされているので、日本からはそちらを使うのが吉でしょう。 というわけで、以下のような内容で /etc/yum.repos.d/dag.repo ファイルを作成します。
[dag] name=Dag RPM Repository for Fedora Core baseurl=http://ftp.riken.jp/Linux/dag/redhat/el$releasever/en/$basearch/dag enabled=1 gpgcheck=1
続いて PGP key をインポートします。
$ sudo rpm --import http://ftp.riken.jp/Linux/dag/packages/RPM-GPG-KEY.dag.txtRPMForge前述の Dag 氏のサイトでも紹介されているリポジトリです。 Dag 氏を含む何名かのメンバーが中心になりメンテナンスを行っているようです。
設定には rpmforge-release という RPM パッケージが便利です。 これをインストールすると yum 用にリポジトリ設定ファイルが出来上がります。
$ wget http:// ftp.belnet.be/ packages/ dries.ulyssis.org/ fedora/ fc4/ i386/ RPMS.dries/ rpmforge-release-0.2-2.2.fc4.rf.i386.rpm
$ sudo rpm -i rpmforge-release-0.2-2.2.fc4.rf.i386.rpm
これでいろいろなパッケージをお手軽にインストールできるようになります。 便利便利。 ただし、ちょっと問題もあって、公式リポジトリからインストールしたパッケージが非公式リポジトリのパッケージで上書きされてしまう場合もあります。 ちょっと気持ち悪いけれど、バージョンが進むわけなので良しとするか。
- 001203
さて、ipchains と iptables - 麦酒堂 でも触れたとおり、我が家のルーターが FORWARD 全面停止となりました。 これは不便だ。 不便というか、そもそもクライアント PC から外に出られない。 というわけで、こいつを導入。
HTTP proxy サーバーの Squid である。 これがあれば、少なくとも Web は見られるようになる。 さらに、最近のサービスでは HTTP proxy をトンネルに使っているものもあるので、そういうサービスも使えちゃう(Skype とか)。 素敵、HTTP Proxy。
まずはインストール。 対象ディストリビューションは CentOS 4.5。 我が家の場合はすでにインストールされた状態でしたが、もし入っていない場合は yum などで入れてしまいましょう。
$ rpm -q squid squid-2.5.STABLE14-1.4E # インストールされてますね
# インストールされていない場合は yum で入れます $ sudo yum install squid
続いて設定です。 設定ファイルは /etc/squid/squid.conf にあります。 が、デフォルトのものは長いので、いったん全部消してから必要な設定項目のみを記述しましょう。 参考になるのはこのあたりです。
- Squid Configuration Basics - Squid User's Guide
- Squid 2.6.STABLE16 configuration file
- Squid 2.6 Configuration Manual
今回の環境では Cache としての役割をほとんど期待せず、アクセス制御ポイントを集約する程度の役割しか担わせないことにします。
# Squid が聴くポートを指定 # icp は分散キャッシュ間の調停に使われるもののようなので今回は disabled # --------------------------------- http_port 172.16.100.254:8080 http_port 172.16.200.254:8080 icp_port 0 # QUERY_STRING を含む URI へのアクセスはキャッシュしないことにする # --------------------------------- acl QUERY urlpath_regex cgi-bin \? no_cache deny QUERY # キャッシュに使用するメモリ容量 / ディスク容量 # デフォルトではメモリ 8MB、ディスク 100MB なのだけれど # そんなにいらないのでそれぞれ 2MB / 16MB に変更しました # --------------------------------- cache_mem 2 MB cache_dir ufs /var/spool/squid 16 16 128 # これは "suggested" と書いてあったのでとりあえずそのまま残す # --------------------------------- refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 # アクセス制御 # アクセス先のポートを制限するのだけれど、そもそもこの Linux box は # iptables で outgoing のパケットをかなり絞ってあるので、 # ここでどう設定しようがあまり影響はない。 # ひとまず 80 / 443 はあけておくことにした。 # 相変わらず icp は拒否。 # --------------------------------- acl all src 0.0.0.0/0.0.0.0 acl home src 172.16.100.0/24 acl jail src 172.16.200.0/24 acl localhost src 127.0.0.1/255.255.255.255 acl Safe_ports port 80 # http acl Safe_ports port 443 # https acl SSL_ports port 443 acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow home http_access allow jail http_access deny localhost http_access deny all http_reply_access allow all icp_access deny all # メールアドレス、クラッシュ時の core 吐き場所など # --------------------------------- cache_mgr admin@example.net coredump_dir /var/spool/squid
設定が終わったら起動しましょう。
$ sudo /etc/rc.d/init.d/squid start
最後にクライアントの設定を忘れずに。 これで HTTP および HTTP をトンネルするタイプのサービスは使えるようになりました。
- 001202
我が家では Linux box をルーターとして使用していて、iptables でフィルタリングを行っています。 かつて、Linux kernel 2.2 の頃は ipchains を使っていて、当時使っていたフィルター設定スクリプトに少しずつ手を入れながら今もそれで設定を行っています。
で、本日驚愕の事実が。 ipchains と iptables とでは built-in のチェーンがいろいろと変更されているのですが、その変更にきちんと追随できておりませんでした。 いやー、自分でもびっくりした。 あれだけ言われていたのに。 そしてその仕組みを、自分ではきちんと理解していたつもりだったのに。
具体的に説明しましょう。 ipchains 時代は INPUT-FORWARD-OUTPUT が一本道になっていて、INPUT チェーンと OUTPUT チェーンをがっちり締めておけば IP masquerading も堅くなる仕組みでした。 ぼくの使っていたスクリプトも、もちろんこの仕組みをベースにして作成されていました。 ところが、iptables になると INPUT-OUTPUT と FORWARD が分離されて(ほかにいくつかテーブルも追加されて)、FORWARD の前後で INPUT-OUTPUT のフィルターが適用されなくなりました。 つまり FORWARD 自体をがっちり締めないと丸裸。 IP masquerading があるので完全な素通しではないけれど、意図しないパケットが外向きに出て行ってしまう危険性があります。
というわけで、早急に対策を施しました。
# フォワードする UDP のポート T="" HOME_UDP_FORWARD=${T} # フォワードする TCP のポート T="" HOME_TCP_FORWARD=${T} # フォワードする UDP のポート T="" JAIL_UDP_FORWARD=${T} # フォワードする TCP のポート T="" JAIL_TCP_FORWARD=${T} # チェーンの追加 ${IPTABLES} -N FORWARD_HOME ${IPTABLES} -N FORWARD_JAIL function forward { PROTOCOL=$1 CHAIN=$2 USING_PORTS=$3 ## 使用サービスの outgoing (request) パケット for port in ${USING_PORTS}; do ${IPTABLES} -A ${CHAIN} -p ${PROTOCOL} --dport ${port} -j ACCEPT done } # FORWARD チェーンの振り分け設定 ${IPTABLES} -P FORWARD DROP ${IPTABLES} -A FORWARD -s ${HOME_NETWORK} -j FORWARD_HOME ${IPTABLES} -A FORWARD -s ${JAIL_NETWORK} -j FORWARD_JAIL ${IPTABLES} -A FORWARD -m conntrack ! --ctstate ESTABLISHED -j LOGGED_DROP # ########## # FORWARD_HOME echo configuring FORWARD_HOME chain... ## UDP forward "udp" "FORWARD_HOME" "${HOME_UDP_FORWARD}" ## TCP forward "tcp" "FORWARD_HOME" "${HOME_TCP_FORWARD}" ## ICMP ## termination ${IPTABLES} -A FORWARD_HOME -j LOGGED_DROP # ########## # FORWARD_JAIL echo configuring FORWARD_JAIL chain... ## UDP forward "udp" "FORWARD_JAIL" "${JAIL_UDP_FORWARD}" ## TCP forward "tcp" "FORWARD_JAIL" "${JAIL_TCP_FORWARD}" ## ICMP ## termination ${IPTABLES} -A FORWARD_JAIL -j LOGGED_DROP結局やっていることは、FORWARD の全拒否です。 "JAIL" "HOME" などは以下のエントリの "UNKNOWN" "KNOWN" と同等です。
経験を過信するのは恐ろしい、と再認識した次第です。
- 001061
Linux に samba を立ててファイルサーバーにしました。
要件は以下の通り。
- ホーム・ディレクトリは所有ユーザーのみが読み書き可能
- "ro" ディレクトリは任意ユーザーが読み取り可能(書き込みは出来ない)
- "rw" ディレクトリは認証済みユーザーのみがそのユーザー権限で読み書き可能
samba の設定は smb.conf ファイルに記述されています。 swat などの便利ツールは今回使用しませんでした。 勇ましく設定ファイルの直接編集で。
smb.conf - 全体の設定最初に samba 全体の設定を行います。
所属するワークグループとサーバーの説明を設定します。
workgroup = example.com server string = Samba Server %v@%h
samba がポートを開くインタフェースと接続を許可するホストを指定します。
interfaces = 192.168.100.0/24 hosts allow = 192.168.100. 127.
プリンタは使用しません。
; printcap name = /etc/printcap ; load printers = yes ;cups options = raw
名前解決関連の設定を行います。 このサーバーの名前解決順は以下の通りです。
- WINS サーバーに問い合わせる
- lmhosts ファイルを参照する
- ブロードキャストにより問い合わせる
また、WINS サーバーとして振舞います。
name resolve order = wins lmhosts bcast wins support = yes
ユーザー認証関連の設定です。 認証を通っていないユーザーはゲスト扱いで、ゲストは UNIX アカウント "nobody" として扱われます。 ユーザー認証に使用するパスワードは暗号化されて "/etc/samba/smbpasswd" ファイルに格納します。
map to guest = bad user guest account = nobody encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd
smb.conf - home の設定まずはユーザーのホーム・ディレクトリの共有設定です。 このあたりは samba の決り文句的な設定になります。
[homes] comment = Home Directories browseable = no public = no guest ok = no writable = yes create mask = 0644 directory mask = 0755 hosts allow = 192.168.100.0/24smb.conf - 読取専用の設定続いて読取専用ディレクトリの共有設定です。 "guest ok" としているので誰でも参照できますが "writeable = no" により書き込みは行えません。
[ro] comment = Read Only Directory path = /var/ro guest ok = yes guest account = nobody writable = no hosts allow = 192.168.100.0/24smb.conf - 読み書き可能の設定最後に読み書き可能なディレクトリを設定します。
[rw] comment = Read Write Directory path = /var/rw public = no guest ok = no writable = yes create mask = 0644 directory mask = 0755 hosts allow = 192.168.100.0/24ここで注意しなければならないのは「書き込まれたファイルは誰のもの?」というパーミションの問題。 認証を通ったユーザーは誰でも書き込み可能なので 777 にしておく必要がありそうです。 しかし単純にそう設定すると、たとえばユーザーAが作成したファイルをユーザーBが削除できてしまいます。 これを避けるために、Linux では sticky bit を使用することができます。 /tmp などにも用いられているもので、これが立っているディレクトリではファイルの所有者とディレクトリの所有者以外はファイルを削除できません。 sticky bit の本来の意味からは離れているようですがこの際気にしません。
$ sudo mkdir /var/rw $ sudo chmod 1777 /var/rw $ ls -dl /var/rw drwxrwxrwt 3 root root 4096 Feb 7 00:06 /var/rw
others の実行権限部分が "t" になっているのが sticky bit が立っている状態です。
smbpasswd の設定認証が必要なユーザーのパスワードを設定します。
$ sudo smbpasswd -a user001 New SMB password: <password> Retype new SMB password: <password> Added user user001.
動作確認samba を起動して Windows マシンでエクスプローラから "\\example.com\rw" などを開きファイルを参照 / 作成 / 削除できることを確認します。
$ sudo /etc/rc.d/init.d/samba start
- 001054
最近 HTML をちくちくといじる事が多いので、HTML の書式チェッカーを手元に置きたくなりました。 で、これをインストール。
インストール手順は以下のような感じでした。 すでに Apache は動いているという前提で、CGI モードで動作させるよう設定しています。
ファイルの入手以下から htmllint.zip をダウンロードします。
ファイルの展開ファイルを展開します。 カレント・ディレクトリにフラットにどばっと吐かれるので、ひとつディレクトリを掘っておきます。
$ cd /var/web $ mkdir htmllint $ cd htmllint $ unzip ~/htmllint.zip
Another HTML-lint の設定変更設定ファイルを用意します。 サンプル設定のコピーで充分です。
$ cp htmllintenv htmllint.env必要に応じて *.cgi ファイルの Perl のパスを変更します。
#!/usr/bin/perl
*.cgi ファイルを実行可能にします。
$ chmod +x *.cgiApache の設定変更Apache の適当な VirtualHost に以下の設定を追加します。
Alias /htmllint /var/web/htmllint <Location /htmllint> AddDefaultCharset iso-2022-jp Options +ExecCGI AddHandler cgi-script .cgi </Location>htmllint が吐く HTML は iso-2022-jp でエンコードされているので "AddDefaultCharset" で指定します。 また、拡張子 "cgi" を持つものは CGI として扱うように設定しています。
動作確認Apache を再起動して http://example.com/htmllint/ など適切な URI にアクセスします。
で、まずは手始めに麦酒堂をチェックしたところ、あちらこちらにほころびが……。 直すの面倒くさいなぁ。
- 001041
メール関連セットアップ の続き。 ぼくが契約している ISP では Outbound Port25 Blocking を実施しています。
まぁ、最近多いですよね。 これまでの設定(qmail使用)ではこの規制に引っかかったことがなかったので全く気にしていなかったのですが、Postfix で運用を開始したとたんに引っかかってしまいました。 何故。
引っかかってしまったものは仕方がないので対策を考えます。 ISP の Web サイトをよく読んでみると、以下の二つの手の併用で抜けられるようです。
- 外に出て行くメールをすべて ISP の SMTP サーバーにリレーさせる
- ISP の SMTP サーバーに接続する際に SMTP Auth を使う
一つ目は既に設定済みなので、さっそく Postfix に SMTP Auth の設定を行います。
Postfix での SMTP Auth の設定は、以下のドキュメントに詳しく書かれています。
main.cf の設定SMTP で接続する場合に SMTP Auth を使うように設定します。 "smtp_sasl_password_maps" は使用するパスワードを指定するファイル(後述)です。
smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_type = cyrus
パスワードの指定SMTP Auth に使用するパスワードをファイルに保存します。 ファイル名は先ほど指定したものです。 接続先の SMTP サーバーごとに使用するパスワードを切り替えられますが、今回は外に出てゆくすべてのメールを同一のの SMTP サーバーに渡すのでエントリは一行だけです。
[<SMTP サーバー名>] <アカウント名>:<パスワード>
SMTP サーバー名 / アカウント名 / パスワードは ISP から指定されたものを使います。 アカウント名 / パスワードは POP のものと同一とは限らないのでご注意を。
いつものごとく postmap にて形式変換を行います。
$ postmap /etc/postfix/sasl_passwd設定反映Postfix に設定を読み込ませます。
$ /etc/rc.d/init.d/postfix reload
- 001040
メール関連セットアップ の最後。 Web Mail 環境を構築します。 外出時も自宅メールをチェックできるので重宝します。 CentOS 4.4 には SquirrelMail が含まれているのでこれを利用します。
再度繰り返しになりますが、要件は以下の通り。
- UNIX アカウントAに届いたメールは POP / IMAP (WebMail) の双方で「独立して」アクセスできる。 POP 側でメールを削除しても IMAP 側に影響を与えない。逆もまた然り。
- 非 UNIX アカウントBに届いたメールは他ドメインのアカウントB'に転送する。
- 非 UNIX アカウントCに届いたメールは IMAP (WebMail) でのみアクセスできる。
このうち要件1,3に書かれている IMAP アクセスを Web Mail から利用できるように設定します。
参考リンクです。
SquirrelMail の公式サイトです。 以前のバージョンでは UNIX コマンドで各種設定を行っていたのですが、現在のバージョンは Web のインタフェースから大部分の設定を行うことが出来ます。
インストールSquirrelMail がインストールされていることを確認します。
$ rpm -qa | grep -i squirrelmail squirrelmail-1.4.8-2.el4.centos4インストールされていない場合は何らかの方法でインストールします。 以下は yum を利用した場合の例です。
$ sudo yum install squirrelmailパーミションの設定CentOS 4.4 の標準では Apache を apache ユーザーで実行するように設定されていますが、ぼくの環境では www ユーザーで実行するようになっています。 そのため、いくつかのファイル / ディレクトリについて所有者を変更する必要がありました。
$ sudo chown -R www:www \ > /var/spool/squirrelmail/attach $ sudo chown -R www:www \ > /var/lib/squirrelmail/pref $ sudo chgrp -R www /etc/squirrelmail/
設定変更今回の環境では特に設定すべきことはないのですが、設定の方法だけを一応ご説明します。
$ sudo /usr/share/squirrelmail/config/conf.pl SquirrelMail Configuration : Read: config.php (1.4.0) --------------------------------------------------------- Main Menu -- 1. Organization Preferences 2. Server Settings 3. Folder Defaults 4. General Options 5. Themes 6. Address Books 7. Message of the Day (MOTD) 8. Plugins 9. Database 10. Languages D. Set pre-defined settings for specific IMAP servers C Turn color off S Save data Q Quit Command >>たとえば IMAP サーバーとは別のノードに SquirrelMail を立てる場合などは "2. Server Settings" > "A. Update IMAP Settings" を変更します。
ターミナルの設定によっては設定値が読めない場合があります。 その場合は "C Turn color off" を選択して色設定をオフにしてください。Apache の起動CentOS 4.4 の SquirrelMail はインストール直後に既に Apache の設定が完了しています。 ひとまず何も設定を変更せずに Apache を起動します。 この際、インターネット接続を切っておくことをおすすめします。
$ sudo /etc/rc.d/init.d/httpd start動作確認SquirrelMail の動作を確認します。 ブラウザから http://example.com/webmail にアクセスします。

IMAP アカウントとパスワードを入力してログインします。

自アカウント宛にメールを送るなどして正常に機能することを確認します。

アカウントごとの設定SquirrelMail 1.4.8-2 では Web から様々な設定を行うことが出来ます。 日本語を扱えるようにするには "Options" > "Display Preferences" > "Language" の値を "Japanese" に変更します。


他にも設定項目がいろいろあるので、必要に応じて設定を変更しておきます。
以上で SquirrelMail の設定は完了です。 ただ、この状態だとパスワードがプレーン・テキストで流れてしまうので必要に応じて SSL と組み合わせて利用してください。
- 001039
メール関連セットアップ の第二弾。 Postfix の設定に続いては POP3 / IMAP サーバーの設定です。 CentOS 4.4 に含まれる標準 POP3 / IMAP サーバーは Dovecot となります。 バージョンは 0.99.11 です。 このバージョンではぼくが使いたい機能の一部(APOPなど)が未実装ですが、1.0.x では実装される予定なので今後に期待して標準品をそのまま使用します。
繰り返しになりますが、要件は以下の通り。
- UNIX アカウントAに届いたメールは POP / IMAP (WebMail) の双方で「独立して」アクセスできる。 POP 側でメールを削除しても IMAP 側に影響を与えない。逆もまた然り。
- 非 UNIX アカウントBに届いたメールは他ドメインのアカウントB'に転送する。
- 非 UNIX アカウントCに届いたメールは IMAP (WebMail) でのみアクセスできる。
要件2は IMAP / POP3 には関係ありません。 要件1,3について設定を進めてゆきます。 要件1は二箇所(~/Maildir と ~/Webmail)に配信されたメールをそれぞれ別のアカウントを用意してアクセスできるように設定します。 ただし UNIX アカウントを追加するのは好ましくないので、Dovecot の passwd-file を利用することにします。 要件3についても同様です。
参考リンクです。
但し、上記サイトの記述は Dovecot 1.0.x のものになっています。 0.99.11 には適用できない説明もあるのでご注意ください。 正確を期するためには /usr/share/doc/dovecot* 以下にインストールされたドキュメントを参照してください。
今回の設定のキモは passwd-file の記述方法です。 取り立てて複雑な設定を行っているわけではないのですぐに設定が完了するはずです。
では、以下手順です。
インストールSquirrelMail がインストールされていることを確認します。
$ rpm -qa | grep -i squirrelmail squirrelmail-1.4.8-2.el4.centos4インストールされていない場合は何らかの方法でインストールします。 以下は yum を利用した場合の例です。
$ sudo yum install squirrelmailプロトコルの設定Dovecot が使用するプロトコルを設定します。 設定ファイル /etc/dovecot.conf を編集して以下の設定を行います。
protocols = imap pop3
認証 / ユーザー情報の設定認証 / ユーザー情報を設定します。 設定ファイル /etc/dovecot.conf を編集して以下の設定を行います。
auth_userdb = passwd-file /etc/dovecot.passwd auth_passdb = passwd-file /etc/dovecot.passwd
"auth_userdb" はユーザー名やMaildir の場所などの問い合わせ先です。 次項で定義する passwd-file を指定します。 "auth_passdb" はパスワードの問い合わせ先です。 デフォルトでは PAM を使用するようになっていますが、今回はすべてのユーザー情報を passwd-file に集約します。
passwd-file の設定今回の設定のキモ、passwd-file の設定です。 前項で passwd-file のパスを "/etc/dovecot.passwd" と指定しました。 このファイルを以下の内容で作成します。
Apop3:{md5}xx:1000:1000::/home/A/::userdb_mail=maildir:/home/A/Maildir Aimap:{md5}xx:1000:1000::/home/A/::userdb_mail=maildir:/home/A/Webmail C:{md5}xx:5000:5000::/home/vmailbox/::userdb_mail=maildir:/home/vmailbox/C各フィールドの説明です。
1 アカウント名 2 パスワード(PLAIN-MD5 使用時のパスワード文字列生成方法は後述) 3 uid。要件3のアカウントには Postfix の設定時に作成した vmailbox ユーザーの uid を指定します。 4 gid。要件3のアカウントには Postfix の設定時に作成した vmailbox ユーザーの gid を指定します。 5 - 6 ホーム・ディレクトリ(上記 uid / gid の権限でアクセスできること) 7 - 8 各種オプション。今回の設定ではここでメール・ボックスの場所を指定する。 パスワード文字列は以下のコマンドで生成できます。
$ md5sum --string=<パスワード文字列>コマンド履歴に残したくない場合は以下のような方法もあります。
$ md5sum --string=`cat` <パスワード文字列>^M ^D
起動 / 動作確認Dovecot を起動します。
$ sudo /etc/rc.d/init.d/dovecot startPOP3 / IMAP を話す MUA を使用して動作を確認してください。 "MTA / MDA - Postfix のセットアップ" で送信したテスト・メールが参照できれば問題ありません。
- 001038
メール関連セットアップ - overview でも書いた通り、以下の要件を満たすべくまずは MTA / MDA として Postfix のセットアップを行います。
- UNIX アカウントAに届いたメールは POP / IMAP (WebMail) の双方で「独立して」アクセスできる。 POP 側でメールを削除しても IMAP 側に影響を与えない。逆もまた然り。
- 非 UNIX アカウントBに届いたメールは他ドメインのアカウントB'に転送する。
- 非 UNIX アカウントCに届いたメールは IMAP (WebMail) でのみアクセスできる。
それぞれの要件について、メールをメールボックスに届けるまでは MTA / MDA の役割になります。 要件1については Postfix は通常どおりメールを配送し、その後 procmail で二つのメールボックスに同時に配信します。 要件2については Postfix の virtual alias 機能を利用して転送します。 要件3については Postfix の virtual map 機能を利用して特定のディレクトリに配信します。
以下、説明となります。 以降の説明ではドメインとして example.com を用います。
最初に参考リンクです。
最低でも Architecture Overview の "How Postfix receives mail" と "How Postfix delivers mail" は事前に目を通しておくべきです。 Postfix のメール配信の流れ / 各デーモンの機能が説明されており、これを把握しておくと設定項目の理解が格段に深まるはずです。 それら設定項目の個別の説明は Configuration Parameters に詳しいです。 また、要件2,3で非 UNIX アカウントを処理するために利用する Virtual 系の設定は Virtual Domain Hosting Howto で詳しく説明されています。 Address Rewriting ではメール送受信時のさまざまなタイミングで、エンベローブとヘッダのアドレス情報をどのように加工できる / 加工されるかを詳しく説明しています。 一般的な Postfix の設定は "/etc/postfix/main.cf" ファイルが主となりますが、今回はいくつかの設定ファイルを追加します。 これらの設定ファイルの中身、設定ファイル処理コマンドなどは Manual Pages に記載されています。
インストールPostfix がインストールされていることを確認します。
$ rpm -qa | grep -i postfix postfix-2.2.10-1.RHEL4.2もし存在しなければ何らかの方法でインストールします。 以下は yum を利用した場合の例です。
$ sudo yum install postfixMTA の切り替えCentOS 4.4 では MTA として Postfix と Sendmail を選択できるようになっています。 デフォルトでは Sendmail が起動しているので、停止した後に Postfix に切り替えます。
最初に Sendmail を停止します。
$ /etc/rc.d/init.d/sendmail stop続いて MTA を切り替えます。
$ sudo /usr/sbin/update-alternatives --config mta There are 2 programs which provide 'mta'. Selection Command ----------------------------------------------- *+ 1 /usr/sbin/sendmail.sendmail 2 /usr/sbin/sendmail.postfix Enter to keep the current selection[+], or type selection number: 2
基本的な設定Postfix を動かすにあたっての基本設定です。 主にメール・アドレスの "@" 以降に関する設定です。 各設定項目の詳細は "Postfix Configuration Parameters" を参照してください。
# 自サーバー名です myhostname = mailserver.example.com # 自サーバーのドメイン名です mydomain = example.com # メール・アドレスの補完などに使用されるドメイン名です myorigin = $mydomain # Postfix が聴くインタフェースです inet_interfaces = all # 自サーバーが最終処理を行う必要のあるドメイン名です mydestination = $mydomain, $myhostname, localhost.$mydomain, localhost(実際は一行)
上流 SMTP の設定野良 SMTP サーバーからの接続を受け付けない SMTP サーバーが世には存在するため、外部に送るメールは一度プロバイダの SMTP を経由させます。 外部に送るメールは smtp(8) が処理します。 main.cf に以下の行を追加します。
default_transport = smtp:[<プロバイダの SMTP サーバー>]
"[]" で囲まないと SMTP サーバーの指定ではなくドメイン名の指定と見なされ、MX レコードによる解決が行われてしまいます。 必ず "[]" で囲みましょう。
ローカル配信に procmail を使用するための設定ローカル配信は local(8) がキックします。 デフォルトでは所定のファイルに書き出されるのですが、処理を渡す外部コマンドを mailbox_command により設定することも可能です。 main.cf に以下の行を追加します。
mailbox_command = /usr/bin/procmail
そして各 UNIX アカウントのホーム・ディレクトリに procmail のレシピ・ファイル ~/.procmail を作成します。 今回は "~/Mailbox/" (POP3用)と "~/Webmail/"(IMAP用)の二箇所にメールを配信するので以下のような具合です。
:0 c ${HOME}/Webmail/ :0 ${HOME}/Maildir/メールを受信する各 UNIX アカウントの権限で配信先ディレクトリを作成します。
$ mkdir ~/Mailmail $ mkdir ~/Webmail
非 UNIX アカウント宛のメールの設定(転送)特定のアドレスに届いたメールを他ドメインに転送するには virtual_alias_map が利用できます。 この設定は cleanup(8) の挙動に影響を与えます。 値にはアカウントのマッピングを記述したマップ・ファイルのパスを指定します。 マップ・ファイルの詳細はvirtual(5) に記述されています。
virtual_alias_maps = hash:/etc/postfix/virtual
マップ・ファイル(/etc/postfix/virtual)は以下のように設定します。 "B@example.com" 宛のメールを他ドメインの "B'@otherdomain.example.net" に転送する設定です。
B@example.com B'@otherdomain.example.net
マップ・ファイルを編集した際には以下のコマンドが必須です。
$ sudo postmap /etc/postfix/virtual非 UNIX アカウント宛のメールの設定(IMAP 用ローカル配信)非 UNIX アカウント宛メールを IMAP でアクセスさせるためには別エントリで後述予定の Dovecot の機能と組み合わせる必要があります。 大まかな流れは以下の通りです。
- Postfix の Virtual Alias 機能により対象メールのエンベローブを書き換える。具体的には、メールの宛先を次の Virtual Domain 機能の適用対象となるように変更する。
- Postfix の Virtual Domain 機能により変更後のメールを捕捉 / 受信 / 指定したディレクトリに配信する。
- Dovecot にて上記配信先ディレクトリを当該ユーザーのメール・ボックスとして扱う
ここではこのうちの 1,2 について説明します。
最初に Virtual Alias 機能です。 これは前項でも説明しているので詳細は割愛します。 設定のキモは内部的な一時ドメイン(ここでは仮に "vmailbox.example.com" とする)の利用です。
C@example.com C@vmailbox.example.com
$ sudo postmap /etc/postfix/virtualこの設定で C@example.com 宛のメールのエンベローブが内部的に C@vmailbox.example.com に書き換えられ incoming キューに入ります。
続いて Virtual Domain の設定です。 Virtual Domain は virtual(8) により処理されます。 main.cf に以下の設定を追加します。
virtual_mailbox_domains = vmailbox.example.com virtual_mailbox_base = /var/spool/postfix/vmailbox virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_minimum_uid = 100 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000
1行目で Virtual Domain として扱うドメイン名 "vmailbox.example.com" を指定しています。 2行目はメールの保存先となるディレクトリ名です。 このディレクトリ以下にアカウントごとのディレクトリが掘られます。 3行目は Virtual Domain のアカウントを定義している設定ファイルを指定しています。 4~6行目はメールを保存する際に使用する uid / gid の指定です。
ユーザー / グループを追加し保存先ディレクトリを作成します。
$ sudo groupadd -g 5000 vmailbox $ sudo useradd -g vmailbox -d /dev/null \ > -s /bin/false -u 5000 vmailbox $ sudo mkdir /var/spool/postfix/vdomain $ sudo chown vmailbox:vmailbox \ > /var/spool/postfix/vdomain
Virtual Domain のアカウント設定するためにマッピングファイル(/etc/postfix/vmailbox)を作成し postmap コマンドで処理します。 マッピング・ファイルはアカウント名と保存先ディレクトリの組です。 保存先ディレクトリは上で指定した virtual_mailbox_base からの相対パスとして処理されます。
C@vmailbox.example.com C/
$ sudo postmap /etc/postfix/vmailbox起動と動作確認Postfix を起動します。
$ sudo /etc/rc.d/init.d/postfix start簡単な動作確認を行います。 尚、"^D" は Ctrl+D、"^M" は Ctrl+Mです。
最初に A@example.com 宛のメールです。 ~A/Mailbox と ~A/Webmail の双方にメールが届けば問題ありません。
$ mail A@example.com Subject: Test Mail 1 Test Mail 1 ^D Cc: ^M $ find ~A/Mailbox $ find ~A/Webmail
B@example.com 宛のメールです。 指定した外部のメール・アカウントに届けば問題ありません。
$ mail B@example.com Subject: Test Mail 2 Test Mail 2 ^D
最後に C@example.com 宛のメールです。 設定どおりのディレクトリに届けば問題ありません。
$ mail C@example.com Subject: Test Mail 3 Test Mail 3 ^D $ sudo find /var/spool/postfix/vmailbox/C
以上でメールの配信 / 配送の設定が完了しました。 大規模環境などでは "Postfix Performance Tuning" などの設定を行う必要があるのでしょうが、今回はそこまで気にする必要はないため割愛です。
- 001037
年末年始の長期休暇を利用してサーバー環境を Dell PowerEdge SC430 上の CentOS 4.4 に移行しています。 いくつかのサービスを移行した中でもっとも難航したのがメール関連。 これまでは qmail を使用していましたが、公開サービスは RPM で管理しまうのがなにかと便利なので CentOS 4.4 標準の Postfix に乗り換えることにしました。 ただメール絡みの要件が少々厄介で、以下のような具合です。
- UNIX アカウントAに届いたメールは POP / IMAP (WebMail) の双方で「独立して」アクセスできる。 POP 側でメールを削除しても IMAP 側に影響を与えない。逆もまた然り。
- 非 UNIX アカウントBに届いたメールは他ドメインのアカウントB'に転送する。
- 非 UNIX アカウントCに届いたメールは IMAP (WebMail) でのみアクセスできる。
"UNIX アカウント" は当該マシンに存在する(/etc/passwd にエントリがある)ユーザー、"非 UNIX アカウント" はその逆で当該マシンに存在しない(/etc/passwd にエントリがない)ユーザーを指します。 個々にはそれほど複雑な要件ではないのですが、どのソフトウェアのどの機能をどのように利用すれば実現できるのかを見極めるところでなかなか苦戦しました。
セットアップ手順はそれぞれ以下のような別エントリに分けます。
- 001018
半ば死蔵されかかっている Dell PowerEdge SC430 に火を入れるべく、まずは形からということで HDD を増強しました。 購入したのは容量単価が非常に低い Seagate Barracuda 7200.10 の 320GB です。
RAID を組むためにこれを二台と、接続するための SATA 用ケーブルを購入。 一時期、購入半年で HDD がバタバタと死んでゆく経験をしたため、HDD には500円の追加で10ヶ月保証をつけておきました。 ケーブルは Dell PowerEdge SC430 の HDD 取り付け位置から考えて、片側L字コネクタを選択。
HDD メーカー Seagate 型番 Barracuda 7200.10 (ST3320620AS) インタフェース SATA II (3Gb/s) 容量 320GB 速度 7,200rpm キャッシュ 16MB SATA ケーブル メーカー Ainex 型番 SAT-3007LBL インタフェース SATA ケーブル長 70cm コネクタ 片側L字(ラッチなし) 我が家には Dell PowerEdge SC430 が二台あるので、既存の2台の HDD を片側に寄せて、購入した2台を空いたマシンに載せました。 ケーブルは、既存 HDD を真似て取り回そうとすると 70cm では微妙に足りませんでした。 ただ、コネクタの形状は正解。 ストレート型のコネクタだと間違いなくケースと干渉するし、ラッチ付だと M/B 側のコネクタが干渉しそう。
さぁ、投資した分使うぞ。
- 000894
ぼくの自宅環境では DHCP サーバーが稼動しているので、ハブに PC をつなぐだけでインターネット環境に出られるようになっています。 これまでは既存の自宅 LAN に直接参加させていたのですが、セキュリティ上はあまり好ましくない状況です。 そこで今回、dhcp による IP アドレスのアサインと iptables によるフィルタリングを組み合わせることで、登録されていない PC は仮想的に分離された別の LAN に参加させるように設定します。
今回の設定で実現できる動作今回の設定では以下のような振る舞いを実現します。
PC をハブにつなぐと、自動的に IP アドレスなどの情報が設定されます。 この情報を用いることでインターネットへの NAPT 経由のアクセスが可能となります。 さらに、登録済みの PC の場合は自宅 LAN 内のサービスを利用できます。 しかし、登録していない PC からは自宅 LAN へは接続できません。基本アイディアはシンプルで、同一の Ethernet セグメントに異なる IP サブネットワークを重畳させることで仮想的な分離を実現します。 一方のサブネットワークは通常の LAN で、比較的自由に振舞うことのできる環境です。 LAN 内のサーバーが提供する各種サービスはすべて利用可能です。 もう一方のサブネットワークは制限された LAN で、インターネットに出ることのみに行動を制限します。 LAN 内のサービスは(DHCP / DNS など必須のもの以外は)利用できません。 互いのサブネットワーク間の IP による通信はすべて禁止とします。
同一の Ethernet に二つの IP サブネットワークが載っている状態は慣れないと直感的には理解しにくいかもしれませんが、Ethernet と TCP/IP のプロトコル・スタックはこういったことができるような設計になっています(詳細はここでは取り上げませんが、ARP が今回の構成のキモとなります)。 しかし、ある程度ネットワークの知識のある方なら思い当たるでしょうが、この構成にはいくらでも抜け穴があります。 制限された LAN の中でも、もう一方の LAN で使用している IP アドレスを覗き読むことが可能です。 IP アドレスがわかれば、DHCP に頼らずに直接 NIC にアドレスを指定でき、もう一方の LAN に入ってゆけます。 インターネット層よりも上での分離なので、これは仕方のないことです。 完全な分離を目指すのであれば他の方法を検討すべきでしょう。 ここではあくまでも、自宅 LAN へ参加する障壁を高くすることでリスクを少しでもおさえることを目的とします。
必要なツール / コマンド / 機能Linux Kernel 2.6 の機能を使用しますので、相応のディストリビューションを用意します。 その他に以下のツール / 機能も使用します。
- IP alias
- IP alias を使用すると、ひとつの NIC に複数の IP アドレスを割り当てることができます。Linux Kernel の機能で、ifconfig コマンドで設定することが可能です。
- dhcpd
- ネットワーク関連の設定を自動化するデーモンです。登録の有無を判断してクライアントPCを適切なサブネットワークに所属させるために使用します。
- iptables
- Linux の IP パケットフィルタリング・ルールの制御を行うコマンドです。各サブネットワークに適切なサービスのみを提供し、サブネットワーク間の通信を制御するために使用します。
これらを組み合わせることで、LAN の仮想的な分離を実現します。 Kernel コンパイルのコンフィギュレーションによっては iptables / IP alias が機能しないかもしれません。 その場合は insmod でモジュールを読み込むか、設定を変更して Linux Kernel の再構築を行ってください。
それぞれのコマンドについてのリファレンスをご紹介します。
- Setting up IP Aliasing on A Linux Machine Mini-HOWTO - JF
- Manpage of dhcpd-options - JM
- Manpage of IPTABLES - JM
iptables については、コマンドそのものよりも Linux の IP パケットフィルタリングについてきちんと理解しておくことが非常に重要です。 その目的には、以下のドキュメントは非常に役立ちます。 TCP/IP の基礎のお勉強にもなりますのでざっと目を通してください。。
- Iptables Tutorial 1.2.0
- Iptablesチュートリアル 1.2.0(Tatsuya Nonogaki 氏による日本語訳)
想定する構成以降の説明では各ネットワークを以下のように想定します。
目的 Subnet NIC GLOBAL 0.0.0.0/0 ppp0 自宅 LAN 172.16.100.0/24 eth0 制限された LAN 172.16.200.0/24 eth0:0 NIC に複数の IP アドレスを割り当てる設定ファイル /etc/sysconfig/network-scripts/ifcfg-eth0:0 を以下の内容で作成します。 ifcfg-eth0 を雛形にすると良いでしょう。
DEVICE=eth0:0 BOOTPROTO=static BROADCAST=172.16.200.255 IPADDR=172.16.200.254 NETMASK=255.255.255.0 NETWORK=172.16.200.0 ONBOOT=yes TYPE=Ethernet続いて eth0:0 を有効化します。
# ifup eth0\:0ifconfig などで 172.16.200.254 のアドレスを持つ NIC を確認してください。
dhcpd の設定多くの Linux で採用されている ISC の dhcpd は、設定ファイルにマッピング情報をもつことで、NIC の MAC アドレスから割り当てる IP アドレスを判断することが出来ます。 設定ファイルにマッピング情報が登録されていない PC (正確には NIC)は “unknown-clients” として扱われます。 この機能を利用すると、登録済みの PC と未登録の PC とで割り当てる IP アドレスを切り分けることが可能になります。 設定ファイルは /etc/dhcpd.conf となります。 まず、登録済み PC に対する設定を行いましょう。
pool { deny unknown-clients; range 172.16.100.1 172.16.100.253; option subnet-mask 255.255.255.0; option broadcast-address 172.16.100.255; option routers 172.16.100.254; option domain-name-servers 172.16.100.254; default-lease-time 86400; max-lease-time 2592000; host registered01 { hardware ethernet 00:11:22:33:44:55; fixed-address 172.16.100.1; } }1行目で未登録 PC への IP アドレス割り当てを拒否しています。 以降は 172.16.100.0/24 のサブネットワークの設定です。 最後に記述のある “host ~” の部分が PC の登録となります。 NIC の MAC アドレスと割り当てる IP アドレスの対が記述されていますね。
続いて、未登録 PC に対する設定です。
pool { allow unknown-clients; range 172.16.200.1 172.16.200.127; option subnet-mask 255.255.255.0; option broadcast-address 172.16.200.255; option routers 172.16.200.254; option domain-name-servers 172.16.200.254; default-lease-time 300 ; max-lease-time 300 ; }こちらは未登録 PC の接続を許可しています。 未登録のものはこちら側の pool から IP アドレスを割り当てられるので、172.16.200.0/24 を使用することになります。
以上の設定を含む dhcpd.conf 全体のサンプルは以下となります。
この設定により、登録済みの PC と未登録の PC は分離されたサブネットワークに所属することになります。
iptables の設定続いて、サブネットワークごとに提供サービスを切り分ける構成を iptables によるフィルタリングで実現します。 最初に各ネットワークに便宜上の名前をつけます。
名前 NIC Subnet 概要 GLOBAL ppp0 0.0.0.0/0 いわゆるインターネット。 KNOWN eth0 172.16.100.0/24 登録済み PC が参加するネットワーク。GLOBAL への NAPT および LAN 内のサービスを全て利用可能。 UNKNOWN eth0:0 172.16.200.0/24 未登録 PC が参加するネットワーク。GLOBAL への NAPT は制限なく利用できるが、LAN 内のサービスは一部を除いて利用不可。 繰り返しになりますが、iptables を利用する前に以下にざっと目を通しておいてください。 TCP/IP プロトコル・スイートの基本的な動作と、Linux の IP パケット・フィルタリングの動作原理を理解していないと iptables を使いこなすのは難しいでしょう。
- Iptables Tutorial 1.2.0
- Iptablesチュートリアル 1.2.0(Tatsuya Nonogaki 氏による日本語訳)
特に“Chapter 6. Traversing of tables and chains(日本語訳:テーブルとチェーンの道のり)”が重要です。 3つのテーブルと、それぞれのテーブルに属するビルトイン・チェーンの役割分担はしっかりと理解してください。 ipchains 時代を知る人が陥りがちなのが、転送パケットには INPUT / OUTPUT が適用されない点。 転送パケットは PREROUTING / FORWARD / POSTROUTING のみが適用され、INPUT / OUTPUT が適用されるのは当該 Linux Box 自身が発信元 / 送信先であるパケットのみです。 ipchains は転送パケットを INPUT => FORWARD => OUTPUT と処理していたため、これを想定すると iptables では痛い目を見ます。 ご注意ください。
これ以降、これら 3 つのテーブル、5 種類のビルトイン・チェーンに対して、ユーザー定義チェーンとルールを追加することで、様々なフィルタリングを実現します。
iptables 実行時の注意iptables を実行する際はスクリプトなどで一括設定を行いましょう。 実環境にて手作業でチクチクと設定変更を行うと、その過程で一時的にセキュリティが低下するタイミングが発生する恐れがあります。 さらに、スクリプト言えども0秒で設定が完了するわけではありません。 スクリプトの最初に以下の3行を入れておきましょう。
iptables -I INPUT -j DROP iptables -I OUTPUT -j DROP iptables -I FORWARD -j DROP
これは、パケットの出入りと転送全てを停止します。 そして最後に以下の3行で停止状態を解除します。
iptables -D INPUT -j DROP iptables -D OUTPUT -j DROP iptables -D FORWARD -j DROP
停止している間に届いたパケットはすべて破棄されます。 TCP であれば再送機能でリカバリされるはずですが、UDP などの場合の挙動はアプリケーション依存です。 ご注意ください。
ネットワークごとの処理振り分け一つの Linux Box は1セットの IP table を持ちます。 “NIC ごとに1セット”ではなく Linux Box につき1セットです。 つまり、GLOBAL から入ってくるパケットも KNOWN から入ってくるパケットもどちらも同一の INPUT チェーンで処理されます。 出てゆくパケットも同様です。 そこで、ルールの設定をシンプルにするために INPUT と OUTPUT の最初の時点で GLOBAL / KNOWN / UNKNOWN を別チェーンに振り分けてしまいます。
最初に、ユーザー定義チェーンを追加します。
iptables -N INPUT_GLOBAL iptables -N INPUT_KNOWN iptables -N INPUT_UNKNOWN iptables -N OUTPUT_GLOBAL iptables -N OUTPUT_KNOWN iptables -N OUTPUT_UNKNOWN
続いて、INPUT 側のパケットを振り分けます。 ここで注意したいのですが、iptables は “eth0” と “eth0:0” を区別できません。 そこで、KNOWN と UNKNOWN の識別にはネットワーク・アドレスを使用します。
iptable -P INPUT DROP iptable -A INPUT -i lo -j ACCEPT iptable -A INPUT -i ppp0 -j INPUT_GLOBAL iptable -A INPUT -s 172.16.100.0/24 -j INPUT_KNOWN iptable -A INPUT -s 172.16.200.0/24 -j INPUT_UNKNOWN
OUTPUT についても同様です。
iptables -P OUTPUT DROP iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -o ppp0 -j OUTPUT_GLOBAL iptables -A OUTPUT -d 172.16.100.0/24 -j OUTPUT_KNOWN iptables -A OUTPUT -d 172.16.200.0/24 -j OUTPUT_UNKNOWN
これ以降、各ネットワーク・インタフェースを出入りするパケットは、それぞれ対応する INPUT_* チェーンと OUTPUT_* チェーンでフィルタリングします。
サービスの提供 / 利用ネットワーク・インタフェースごとのフィルタリング・ルールを考えるにあたって、サービスの提供と利用の概念が重要になります。 提供しているサービスは新規通信の開始要求を受け入れなければなりませんが、利用しているだけのものはこちら主導で通信を開始するのみです。 つまり、INPUT_* については以下のようにフィルタリング処理をおこなう必要があります。
- 提供サービスの incoming はすべて受け入れる
- 通信開始要求はすべて落とす
- 利用サービスの incoming はすべて受け入れる
2 で通信開始要求を落としているので、3 にたどり着くものはすべて自分が開始した通信の応答パケットです。 逆に OUTPUT_* は以下のように設定します。
- 利用サービスの outgoing はすべて受け入れる
- 通信開始要求はすべて落とす
- 提供サービスの outgoing はすべて受け入れる
INPUT_* とは「利用 / 提供」が逆になっています。 このあたりは直感的には理解しにくいかもしれないので、具体的な通信開始時のパケットのやりとりを想像してみてください。
ここまで漠然と「通信開始要求」と書きましたが、TCP の SYN だけを指すわけではありません。 UDP や ICMP でもまとまりとして意味のある一連の通信が発生します。 その一連のパケットの一番最初のものを「通信開始要求」と呼んでいます。 iptable ではステートフル・パケット・フィルタリングが可能なので、通信開始要求に該当するパケットにマッチするルールを記述可能です。
例として、GLOBAL のネットワークに HTTP (tcp/80) / HTTPS (tcp/443) を提供し、DNS (udp/53) を利用する場合のフィルタリング・ルールを挙げます。
iptables -A INPUT_GLOBAL -p tcp --dport 80 -j ACCEPT iptables -A INPUT_GLOBAL -p tcp --dport 443 -j ACCEPT iptables -A INPUT_GLOBAL -m conntrack \ ! --ctstate ESTABLISHED -j DROP iptables -A INPUT_GLOBAL -p udp --dport 53 -j ACCEPT iptables -A OUTPUT_GLOBAL -p udp --sport 53 -j ACCEPT iptables -A OUTPUT_GLOBAL -m conntrack ! --ctstate ESTABLISHED -j DROP iptables -A OUTPUT_GLOBAL -p tcp --sport 80 -j ACCEPT iptables -A OUTPUT_GLOBAL -p tcp --sport 443 -j ACCEPT
FORWARD の設定FORWARD は以下のようなポリシーを設定します。
- TCP のみ許可し、UDP / ICMP は FORWARD しない
- KNOWN=>GLOBAL / UNKNOWN=>GLOBAL の通信は特に制限しない
- GLOBAL=>KNOWN / GLOBAL=>UNKNOWN の通信開始要求はすべて落とす
- KNOWN<=>UNKNOWN の通信はすべて落とす
以上をフィルタリング・ルールに翻訳すると以下のようになります。
iptables -A FORWARD ! -p tcp -j DROP iptables -A FORWARD -s 172.16.100.0/24 -o ppp0 -j ACCEPT iptables -A FORWARD -s 172.16.200.0/24 -o ppp0 -j ACCEPT iptables -A FORWARD -d 172.16.100.0/24 -i ppp0 \ -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -A FORWARD -d 172.16.200.0/24 -i ppp0 \ -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -P FORWARD DROP
“-P”はデフォルト・ポリシーで、いずれにもマッチしなかった場合に適用されるターゲットを指定します。 ビルトイン・チェーンでのみ設定可能です。
IP Masquerading (NAPT) の設定今回の環境では、グローバル IP アドレスを持つのは ppp0 だけで、他はすべてプライベート・アドレスを使用しています。 これでは、Linux Box 以外はインターネットに出てゆかれないので、NAPT を適用します。 NAPT はひとつのグローバル IP アドレスを複数のマシンで共用するためのしくみで、TCP / UDP のポートごとに各マシンに割り当てることが出来ます。 Linux Kernel で実装される NAPT は “IP Masquerade” と呼ばれています。
IP Masuquerade の設定は nat テーブルの POSTROUTING チェーンにて行います。
iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -A POSTROUTING -s 172.16.100.0/24 \ -o ppp0 -j MASQUERADE iptables -t nat -A POSTROUTING -s 172.16.200.0/24 \ -o ppp0 -j MASQUERADE
今回の環境は、ppp0 は動的に IP アドレスが振られるため IP Masquerade を使用しましたが、固定 IP の場合は SNAT を使用してください。ログの記録iptables ではターゲット “LOG” を利用することで syslog にログを残すことが出来ます。 特に多いのが、DROP するパケットをログに残しておきたいというニーズだと考えられます。 これを実現するためには「ログに記録して破棄」をおこなうユーザー定義チェーンを用意すると便利です。
iptables -N LOGGED_DROP iptables -A LOGGED_DROP -j LOG iptables -A LOGGED_DROP -j DROP
iptables 以外の設定iptables で設定するルール・ベースのフィルタリング以外にも、Linux Kernel のパラメータも幾つか設定したほうが良いです。
ICMP echo のブロードキャストを無視します。 ブロードキャストの ICMP echo メッセージを許可すると、ネットワーク上で有効な IP アドレスを一覧される恐れがあります。
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts他のマシンが ICMP ブロードキャスト・メッセージに不正に反応した場合でも、その旨をログには残しません(デフォルトでは warning が出力される)。 これは直接セキュリティの向上には寄与しませんが、ログが読みやすくなります。
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses以下は NIC ごとに設定します。 どちらも、man-in-the-middle attack を防止するための設定です。
for i in /proc/sys/net/ipv4/conf/* ; do ## Ignore Source Routed Packet echo 0 > ${i}/accept_source_route ## Ignore ICMP Redirect echo 0 > ${i}/accept_redirects doneその他の設定項目については以下などを参照ください。
IP forwarding の設定Linux のディストリビューションや設定によっては、フォワードが無効になっている場合があります。 この場合は Linux Box がルーターとして動作することができません。 以下のように IP forwarding を有効にします。
echo 1 > /proc/sys/net/ipv4/ip_forward
以上のようなことを考慮しつつ、まとめられる部分は関数にしてくくりだしたりしました。 最終的に出来上がったスクリプトは以下のようになります。 (セキュリティ上、実環境で使っているものを少し改変してあります)
今回は dhcp と組み合わせて未登録 PC を隔離するという特殊な設定でしたが、フィルタリングの基本的な考え方は再利用が可能な筈です。 特に上で紹介したチュートリアルを読んだ上で、それぞれの環境に合ったフィルタリング・ルールを考えてみてください。
- 000884
Dell PowerEdge SC430 に CentOS4.3 をインストールしました。 その後、何度かインストールし直したりしていじくっていたのですが、そろそろ本格的にセットアップを開始しようかと思います。
このマシンの役目は、現在のルーター兼Firewall兼Webサーバー兼メールサーバー兼ネームサーバー etc マシンのリプレース。 直接インターネットに接続することになるので、パッケージの最新状況を常に把握しておくことは必須です。 yum - Yellowdog Updater Modified を使用して、ネットワーク越しに最新パッケージを取得することにします。
yum によるパッケージの更新最初に、そのパッケージを本当に信頼してよいのかを確認するための PGP キーをインポートします。 yum は更新状況のチェック / 取得を行いますが、最終的なパッケージ管理は RPM が行います。 以下のように rpm に PGP キーを読み込ませましょう。
# rpm --import /usr/share/rhn/RPM-GPG-KEY-centos4続いて、更新の確認を行います。
# yum check-updateズラリとパッケージの更新が一覧されたと思います。 以下のようにするとダウンロードして更新が適用されます。
# yum update勝手 yum リポジトリの準備 / 設定このように、yum によりパッケージ更新の追跡 / 適用が可能になります。 他にも機能があり、ネットワーク越しにパッケージの追加も可能です。
# yum install <package>このときに、いちいち Web に出て行くのも遅くて面倒です。 更新分は常に外にチェックしに行くのは仕方ありませんが、ベース・インストールイメージは既にダウンロードしてあるので(参照)、これを利用しないともったいない。 そこで、勝手に yum のレポジトリを立ててしまいます。 CentOS ディレクトリに加えて、headers ディレクトリと repodata ディレクトリも Disk1 からコピーして以下のような配置にします。
- /tmp
- /CentOS
- /4.3
- /CentOS
- /base
- /RPMS
- /headers
- /repodata
- /CentOS
- /4.3
- /CentOS
これに http://example.com/CentOS でアクセスできるように Web サーバーを設定します。 最後に /etc/yum.repos.d/CentOS-Base.repo ファイルを以下のように変更します。
[base] name=CentOS-$releasever - Base baseurl=http://example.com/CentOS/4.3/ gpgcheck=1 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4 (省略)以上で、base に関しては LAN 内だけで完結できるようになりました。 パッケージの追加 / 削除が早くて素敵です。 もちろん、更新があるものについてはきちんと最新版を持ってきてくれます。
定期更新チェック最後に、パッケージ更新の有無を定期的にチェックするよう設定します。 yum をデーモンとして起動しておけば定期的に更新をチェックしに行き、更新の適用も行ってくれるのですが、サーバーマシンでそれもちょっと気持ち悪い。 更新の適用は手動で行いたいので、あくまでもチェックだけを行うスクリプトを作成します。
#!/bin/sh ADMINMAIL=admin-mobile@example.com SUBJECT="yum find updated package(s) at `hostname`" # yum returns status code 0 when there is no updates yum check-update > /dev/null 2>&1 if [ $? != 0 ]; then yum check-update | mail -s "${SUBJECT}" ${ADMINMAIL} fiこれを crontab に設定しておけば、定期的に更新をチェックして、更新が存在する場合はメールを送信します。
- 000882
Dell PowerEdge SC430 を購入したことにより、とうとう我が家にも GbE 対応機種が登場したことになります。 しかし、NIC だけが GbE に対応しても、hub やケーブルが対応していなければ意味がありません。 宝の持ち腐れ。 もったいない。 というわけで、これらを購入して LAN を GbE 化しました。
- HUB : corega CG-SW05GTV2B
- NIC : BUFFALO LGY-PCI-GT
LGY-PCI-GT は、メインマシン用。 残念ながらメインマシンは 32bit 33MHz の PCI v.2.2 にしか対応していません。 32bit 33MHz の理論上の帯域は 132MByte/sec となります。 GbE はバイト換算で 125MByte/sec。 数字は足りているように見えますが、諸々考えると心許ないですな。 でも 100BASE-TX よりは早くなるだろうということで、メインマシンも GbE 化します。
“GbE” と漠然と書いていますが、正確には 1000BASE-T なので Cat.5e のケーブルが必要となります。 しかし、生憎これまでは 100BASE-TX を使っていたので手持ちのケーブルはすべて Cat.5。 これも買い足さなければ。 というわけでお買い物へ。 現時点での主流は Cat.6 なのでわざわざ Cat.5e を探して買う必要もありません。 価格差もそれほどないのでここは素直に Cat.6 で。 それにしても、1000BASE-T 対応の NIC が2,000円を切ってるなんて驚き。
HUB corega CG-SW05GTV2B 6,180円 NIC BUFFALO LGY-PCI-GT 1,780円 NIC
(onboard)Broadcom BCM95751 (5750) -- cable KB-T6-02(Cat. 6 / 2m / ストレート) 500円 x 2 cable KB-T6-03(Cat. 6 / 3m / ストレート) 600円 さて、勢いで購入したのは良いけれど果たしてどれだけネットワーク性能が向上したのかが気になるところです。 パフォーマンス測定を行ってみましょう。
今回はスループットを指標にします。 ネットワークのスループットを測定するツールは幾つかありますが、Windows でも Linux でも動くことが必要な条件なので ttcp を選択。
Windows 用は cygwin に含まれているのでそれをインストール。 Linux 用は上記サイトからソースを入手して gcc でコンパイル。
$ gcc -o ttcp ttcp.c警告が出ますが、無視して大丈夫なようです。 コマンド一発のシンプルなツールですが、思いのほかいろいろな機能があります。 今回は TCP と UDP の場合をそれぞれ計測します。 まず片側で ttcp を -r オプション付きで起動し、続いてもう一方で -t オプション付きで起動します。以下は UDP の場合の例。TCP の場合は“-u”を除く。
$ ttcp -r -s -u$ ttcp -t -s -u <host>今回はこれに加えてデータ量を指定する -l -n を使い、600,000,000byte の場合を計測しました。
ttcp を使うと理想的な状態でのネットワークの性能は判断できますが、もっと重要なのは普段の作業効率がどれだけ向上するかってこと。 プロトコルの特性やエンコーディングなどによるオーバーヘッド、ネットワーク以外のリソースによるボトルネックなど色々な要素が絡むので、実際の作業に近い環境で測定することにします。 帯域を多く使う作業で真っ先に思い浮かぶのがファイルのやりとり。 そこで、HTTP と SMB(Windows のファイル共有)も併せて測定しました。
計測には二台のPCを使用し、片側からもう一方へデータを送出します。 片側の NIC は常に BCM95751 に固定し、もう一方の NIC を替えて計測しました。 結果はこんな感じになりました。 単位は Mbps です。
100Mbps 1000Mbps
(LGY-PCI-GT)1000Mbps
(BCM95751)ttcp - udp 91.589 791.979 890.591 ttcp - tcp 73.324 243.621 897.576 HTTP (wget) 55.008 105.516 408.204 SMB 9.091 118.150 141.202 HTTP と SMB は 630MB 強のファイルをやりとりしました。 HTTP の 408.204Mbps という数字は、このファイルをダウンロードするのに 13 秒程度で完了することを意味します。 CD-ROM 一枚分がほんの十数秒。 早いねー。 ttcp による計測だけではなく、HTTP や SMB もこれだけスループットが向上しているのであれば、 GbE を導入した価値は十分にあるといえます。
- 000878
PowerEdge SC430 を購入したので、久し振りに Linux をインストールしてみました。
これまでは Fedora Core を使っていたのだけれど、アップデートの早さに追従するのはなかなか骨が折れました。 そこで今回は、RHEL から派生した(一応)エンタープライズ向けのディストリビューションである CentOS を使ってみることにしました。
CentOS は "The Community ENTerprise Operationg System" から名付けられています。 中身はRedhat 社が公開しているソースコード (SRPM) からバイナリを構築したもので、差分は Redhat 社その他が権利を保有している部分(ロゴや商用パッケージ)の有無となります。 Fedora Core とは異なり、リリース・スケジュールは基本的に RHEL に準じるので安定したパッケージ・マネジメントが期待できます。 サーバーマシンであんなにボコボコとアップデートがかかるのは正直怖い。 あるアップデートが 2,3 日で上書きされたりするしね。
もちろん、Fedora Core の意義を否定するものではなくて、あくまでも「サーバー・マシンとして使うのなら」ということ。 もう一台の SC430 にインストールするにはやぶさかではない。 というかむしろ入れて遊びたい。 そのための二台目です。
毎度のことながら、インストールのために CD-ROM を焼くのが嫌いなのでネットワーク経由でインストールすることにします。 ところが! CentOS 4.3 は FD からのインストーラ起動が行えません。 ブート・イメージだけで 6.0MB あります。 FD に入らない……。 確か Fedora Core 3 からは既に FD からのインストールは棄てられてたんだよな。 仕方がないので一枚 (Disk1) だけ CD-ROM を焼き、そこからブートしてネットワーク・インストールを行いました。
以下手順。
前提ここでの手順は、同一の LAN 内に充分なディスク・スペースを持った Linux サーバーが存在していることが前提です。 自前で Linux サーバーを用意できない場合はインターネット経由でどこかのサーバーからファイルを取得してください。 手順も一部変化しますのでご注意ください(“2~4枚目のCD-ROMは不要”など)。 もしかすると、NTFS の Windows 2000 に Apache をインストールした場合も HTTP 経由のインストールが可能かもしれません。
ISO イメージの入手適当なミラーから CentOS 4.3 の ISO イメージを入手します。
PowerEdge SC430 は Intel Pentium D 搭載なので、アーキテクチャは x86_64 を選びます。 必要なイメージは全部で4つです。
- CentOS-4.3-x86_64-bin1of4.iso
- CentOS-4.3-x86_64-bin2of4.iso
- CentOS-4.3-x86_64-bin3of4.iso
- CentOS-4.3-x86_64-bin4of4.iso
起動ディスクの作成適当な CD-R 書き込みソフトで一枚目 (CentOS-4.3-x86_64-bin1of4.iso) を焼いて起動ディスクを作成します。
ディスクを HTTP 経由で公開既存のサーバー上で行う作業です。
4枚すべてのディスクの中身を、HTTP 経由でアクセスできるようにします。 まずは4つの ISO イメージに含まれる *.rpm ファイルを以下のディレクトリ構造に集約します。
- /tmp
- /CentOS
- /4.3
- /CentOS
- /base
- /RPMS
- /CentOS
- /4.3
- /CentOS
# mkdir -p /tmp/CentOS/4.3/CentOS # mkdir -p /tmp/CentOS/mount # mount -o loop -o ro CentOS-4.3-x86_64-bin1of4.iso \ > /tmp/CentOS/mount # cp -r /tmp/CentOS/mount/CentOS/* \ > /tmp/CentOS/4.3/CentOS/ # umount /tmp/CentOS/mount # mount -o loop -o ro CentOS-4.3-x86_64-bin2of4.iso \ > /tmp/CentOS/mount # cp -r /tmp/CentOS/mount/CentOS/RPM/* \ > /tmp/CentOS/4.3/CentOS/RPM/ # umount /tmp/CentOS/mount # mount -o loop -o ro CentOS-4.3-x86_64-bin3of4.iso \ > /tmp/CentOS/mount # cp -r /tmp/CentOS/mount/CentOS/RPM/* \ > /tmp/CentOS/4.3/CentOS/RPM/ # umount /tmp/CentOS/mount # mount -o loop -o ro CentOS-4.3-x86_64-bin4of4.iso \ > /tmp/CentOS/mount # cp -r /tmp/CentOS/mount/CentOS/RPM/* \ > /tmp/CentOS/4.3/CentOS/RPM/ # umount /tmp/CentOS/mount
続いて Apache の設定です。 httpd.conf に以下の行を追加し、"/CentOS" というパスでインストール・ファイルにアクセスできるように設定します。 インストーラでのポート番号の指定方法が怪しかったので、Well-known の80番を使用しました。
Alias /CentOS /tmp/CentOS
Apache を再起動しましょう。
$ ./bin/apachectl restart
念のため、ブラウザからアクセスできることを確認しておくと安心です。
http://example.com/CentOSインストール開始先ほど作成した起動CDを使用して、PowerEdge SC430 を起動します。 “boot:” というプロンプトが表示されたら、インストール・メソッドを指定できるように以下のとおり入力します。
boot: linux askmethod言語 / キーボードの選択“インストールに使用する言語” にはお好きなものを選択してください。 “キーボードの種類” ではお使いのものを。 (選択肢の例示で、ぼくが選んだものがある程度ばれてしまうわけですが)。
インストール方法の選択インストール方法の選択画面が表示されるので、“HTTP” を選択します。
TCP/IP の設定NIC の設定です。 今回使用した環境では DHCP サーバーが立っているので「動的 IP 設定を使用する」を選択すれば自動的に NIC が設定されます。 そうでない環境では、有効な IP アドレス及びサブネット・マスクを指定しましょう。
HTTP の設定インストール・メディアを取得する HTTP サーバーの指定です。 Web サイト名は IP アドレスでも構わないはずですが、Apache で Name based Virtual Host を使用している際は注意が必要です。 ディレクトリは “CentOS” ディレクトリのひとつ上を指定するので、今回は “/CentOS/4.3” と入力。
ここまでは昔懐かしのインタフェースですが、ここからはマウスも使えちゃうリッチなanaconda が立ち上がります。
以上の手順でネットワーク・インストールが行えます。 ここから先は一般的な Linux のインストール手順なのでエントリーを改めるか、割愛します。
- 000877
Intel Pentium D 820 (2.8GHz / 2 core / 2x1MB L2 Cache / EM64T / 800MHz FSB) 搭載で29,980円(消費税込 / 送料込)という驚異的な低価格に惹かれてポチッとお買い上げ。 しかも「数量:2」。 だって、フェイルオーバーとかさせてみたいんだもの。
もう少し詳しいスペックは以下。
CPU Intel Pentium D 820 (2.80GHz / 2 core / 2x1MB L2 Cache / EM64T / 800MHz FSB) Chipset Intel E7230 RAM 512MB (256MB x 2) (533MHz / DDR2 SDRAM / ECC) HDD WDC WD800JD-75MSA2 (80GB / SATA / 7200rpm) Optical LITE-ON CD-ROM LTN-4891S (min x20 / max x48) OS N/A ちょっと気をつけたいのが対応メモリ。 この SC430 は ECC が必須です。 non-ECC のメモリは挿しても動作しないことが報告されています。 「ECC / non-ECC の混在がダメ」なのではなくて non-ECC がそもそもダメ。 メモリを増設する場合のコストが幾分高くなるのでこれは注意です。 とはいえ、これで30,000円切るんだもんな。 メイン・マシンとして使うには多少難ありだけれど、自宅サーバー / 開発機として使用するには充分。
ただ Dell のちょいとした難点は発送が遅いこと。 もう少し正確には「国際輸送」に時間がかかりすぎること。 荷物のステータスを Web から確認できるのだけれど、6/1にどこかの国を発った SC430 が日本に着いたのは 6/8 の夕方でした。 "Made in China" という文字がみえるので、日本海を渡るのに一週間もかかるってこと?
しっかし恐ろしいことに、同等スペックのものがたった二週間で22,980円まで下がっているんだよね。 何その値崩れ具合は。 ぼくの SC430 がぶらぶらと一週間も船旅を続けている間に何があったというのか。
- 000670
「麦酒堂」は PostgreSQL で運用しています. 今回,定期バックアップの代わりにレプリケーションを行ってみました. PostgreSQL のレプリケーションを行うには幾つか方法があるのですが,今回は一番楽そうな pgpool を使用することにします.
現在 PostgreSQL が動いているのは Linux マシンです. これとは別に,新たに Mac OS X 上に PostgreSQL をセットアップし, Linux を Master,Mac を Secondary として運用します. pgpool はデフォルト設定では参照系も Master / Secondary 双方にリクエストを投げ,その結果をつき合わせます. 麦酒堂の環境は Master と Secondary の性能差があるため,デフォルトだと遅いほうに引っ張られます. 今回の目的はバックアップの代替としてのレプリケーションなので,select 結果の整合性チェックまでは求めません. そこで更新系処理のみを Master / Secondary 双方に対して行い,参照系は Master のみで処理するように設定します.
インストールMaster である Linux マシンに pgpool をインストールします.
上記サイトからファイルをダウンロードして解凍します. ここでは 2005-10-12 時点で最新の 2.6.3 を使用します.
$ wget http://.../pgpool-2.6.3.tar.gz $ tar zxvf pgpool-2.6.3.tar.gz
続いて,お決まりの configure / make です.
$ cd pgpool-2.6.3 $ ./configure \ > --prefix=/home/pguser/pgpool-2.6.3 $ make $ make install $ ln -s /home/pguser/pgpool-2.6.3 \ > /home/pguser/pgpool
Master 側 PostgreSQL の設定PostgreSQL は通常は UNIX domain socket を使用します. 今回,マシンをまたがる接続が必要となるため,TCP/IP を使用するように設定を変更します. また,待ち受けに使う TCP のポート番号はデフォルト 5432 と衝突しないように 5433 とします. 以上の設定変更には ${PG_DATA}/postgresql.conf を編集します.
tcpip_socket = true ... port = 5433
Secondary 側 PostgreSQL の設定最初に,データベースクラスターを新規に作成します. 後ほど,Master からデータをここに移します.
$ mkdir ~/pgdata/ $ initdb -D ~/pgdata/ -U pguser
設定は Master と同様です. TCP/IP によるリクエストを受け付けて,待ち受けは 5433 番ポートにします. Master とはマシンが異なるので,同じポート番号を使用しても問題ありません.
tcpip_socket = true ... port = 5433
Master 側マシンの pgpool から接続できるように ${PG_DATA}/pg_hba.conf を変更します.
host all all 192.168.1.0 255.255.255.0 trust
pgpool の設定いよいよ今回のキモとなる pgpool の設定です. 設定ファイルは pgpool/etc/pgpool.conf.sample を pgpool/etc/pgpool.conf とコピーして使用します.
今回 pgpool はアプリケーションに対して透過的に動作するように設定します. そのために,待ち受けポート番号は PostgreSQL のデフォルトである 5432 とします.
listen_addresses = '*' port = 5432
Master / Secondary それぞれに接続するための設定を行います.
backend_host_name = '127.0.0.1' backend_port = 5433 ... secondary_backend_host_name = '192.168.1.2' secondary_backend_port = 5433
今回は Master と Secondary の間でレプリケーションを行います. これにより,同じデータが二箇所に保存されるようになります.
replication_mode = true
最後に,ロード・バランス・モードで動作するように指定します. 通常のモードでは,select 時に Master と Secondary 両方にクエリーを投げてその結果の整合性をチェックします. 上でも書いたように,select 時は Master のみにリクエストを投げてくれれば充分なので,1:0 の比でロード・バランスするような設定を行います.
load_balance_mode = true weight_master = 1 weight_secondary = 0
まだこの時点では pgpool を起動しないで下さい.
データの複製Master のデータを Secondary に複製します. pgpool はオブジェクトIDなども含めて,Master と Secondary が同期されていることが前提です. このような複製はデータファイルの丸ごとコピーか pg_dumpall によるデータ移行で実現できるのですが,ファイルコピーではうまく行きませんでした. CPU アーキテクチャの違いが原因ではないだろうかという気がします. そこで今回は pg_dumpall を採用します.
$ pg_dumpall -p 5433 > pg_dumpall.dmp $ scp pg_dumpall.dmp pguser@192.168.1.2:~/
$ psql -p 5433 -f pg_dumpall.dmp \ > -U pguser template1動作確認[ permalink ] [ 0 comment(s) ]- 000641
日々,ちょっとした計算をする場面があります. そんなときにぼくは TeraTerm のウィンドウに手を伸ばします. "cd" を慌てて入力して "dc" と typo した経験があるのはぼくだけではないと思いますが,この dc って実は計算機なんですよ.
逆ポーランド記法で入力する任意精度の計算機です. 逆ポーランドという時点で嫌になる(もしくはわけがわからない)人もいるかもしれませんが,ぼくのように常にターミナルが起動している人間は覚えておいて損はないと思いますよ. 逆ポーランド記法で書かれた計算式は,情報工学 / 計算機工学を学んだ人にはお馴染みのスタックを使って簡単に計算できます. そんなに難しい概念じゃないし,演算子の優先順位にとらわれずに入力できて非常に便利(つまりは括弧がいりません).
以下,使い方を簡単に.
dc は標準入力から式を受け取ります. p は,スタックの TOP を表示するためのコマンドです.
$ echo '25000 50 / p' | dc 500同様のことが "-e" オプションでも可能です.
$ dc -e '25000 50 / p' 500スクリプトも使えます.
$ cat calc.txt 2500 50 / p $ dc -f calc.txt 50
対話形式も可能です. このモードはちょっと込み入った計算をするには非常に便利です.
$ dc # スタックに積んで TOP を表示 1 100 p 100 #スタックの中身を表示 f 1 100 # 割り算を実行 / p 0 # スタックをクリアして TOP を表示 c p dc: stack empty # 精度を 10 に変更 10 k # 割り算を実行 1 100 k .0100000000 # 2 の平方根を計算 2 v p 1.4142135623 # 終了 quit
[ permalink ] [ 0 comment(s) ]- 000605
手動で spam メールを消すのにも嫌気が差してきたので,丁度 Software Design で取り上げられていた SpamAssassin を導入することにしました.
Software Design の記事によると,なかなか精度もよろしい様子です.
ちなみに,いわゆる「スパムメール」を “SPAM” と全部キャピタルで表記してはいけません. “spam” や “Spam” と表記しましょうね. 本家がそういっていますから.
自宅のサーバーは, MTA は qmail,MDA は procmail を使用しています. Software Design の記事は,SpamAssassin を Postfix とともに使用する方法を取り上げていましたが,SpamAssassin は procmail と連携することができるので問題ありません.
SpamAssassin のご紹介SpamAssassin の入手このサイトからダウンロードできます.
今回は 2005-07-31 時点で最新の 3.0.4 を使用します.
セットアップ手順- Perl のモジュールを幾つか追加
SpamAssassin は外部の公開データベースと連携して spam 判定を行うことができます. そのためには Perl のモジュール Net::DNS が必要となりますので,まずはこれを追加します. ただ,ぼくの環境では Net::DNS が依存する以下のモジュールが必要となりました. これらを全部インストールします. 通番は依存関係によるインストール順です.
- Digest::SHA1
- Digest::HMAC
- Net::IP
- Net::DNS
モジュールの入手はこちらから.
手順は各モジュール共通でこんな感じ.
$ tar zxvf Net-DNS-x.xx.tar.gz $ cd Net-DNS-x.xx $ perl Makefile.PL $ make test $ make $ su Password: # make install
make test がこける場合はログをチェックして,必要なモジュールがあればそれを先に追加しましょう.
- SpamAssassin のインストール
続いて SpamAssassin のインストールです. 基本的な手順は上記のモジュールと一緒ですが,perl Makefile.PL 時に幾つか入力項目があります.
$ tar Mail-SpamAssassin-3.0.4.tar.gz
$ cd Mail-SpamAssassin-3.0.4
$ perl Makefile.PL
What email address or URL should be used in the suspected-spam report text for users who want more information on your filter installation? (In particular, ISPs should change this to a local Postmaster contact)
default text: [the administrator of that system] admin@example.com
Check network rules during 'make test' (test scripts may fail due to network problems)? (y/n) [n] y
Run SQL-based Auto-whitelist tests during 'make test' (additional information required) (y/n) [n] n
Run Bayes SQL storage tests during 'make test' (additional information required)? (y/n) [n] n
Writing Makefile for Mail::SpamAssassin
Makefile written by ExtUtils::MakeMaker 6.17
$ make test
$ make
$ su
Password:
# make installperl Makefile.PL の入力項目を上からご説明.
- spam としてブロックされたことをレポーティングする際に使用する連絡先です.
- 外部の公開データベースを使用するためのテスト.使用します.y.
- Whitelist(無条件通過アドレス一覧)を RDB に格納するためのテスト.今回は使用しないので n.
- ベイジアンフィルタのデータを RDB に格納するためのテスト.今回は使用しないので n.
- spamd の起動設定 & 起動
メール受信時に叩くのは spamc コマンドですが,このコマンドの実行には spamd デーモンが必要となります. spamd の起動設定を行います. システム起動時に自動的に spamd が上がるようにしましょう.
$ su Password: # cp /spamd/redhat-rc-script.sh \ > /etc/rc.d/init.d/spamd # chkconfig spamd on
この設定は次回起動時から有効なので,今回は手動で起動します.
# /etc/rc.d/init.d/spamd start # ps ax | grep spamd 17399 ? Ss 0:01 /usr/bin/spamd -d -c -m5 -H 17409 ? S 0:08 spamd child 17410 ? S 0:09 spamd child 17411 ? S 0:09 spamd child 17412 ? S 0:09 spamd child 17413 ? S 0:08 spamd child
- .qmail の設定
以上で SpamAssassin が動く状態になったので,メール受信時に SpamAssassin を叩くように設定しましょう. まずは,.qmail を編集して Procmail を MDA として使用するよう設定します.
|/var/qmail/bin/preline /usr/bin/procmail
- .procmail の設定
メール受信時に SpamAssassin にメールを渡すように設定します. ぼくの環境では他に幾つか設定があるのだけれど,関係する部分のみ抜粋します.
:0fw: spamassassin.lock | /usr/bin/spamc :0 : ${MAILDIR}実は .procmail の設定次第では,SpamAssassin が spam と判定したメールを Procmail で削除(/dev/null行き)してしまうことも可能です. ただ,まだ false positive が怖いのでそこまで設定していません.
- MUA の設定
Procmail で削除していないので,MUA で振り分け設定を行います. SpamAssassin は spam と判断したメールに対してこのようなヘッダーフィールドを追加します.
X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 3.0.4 (2005-06-05) on mizba.net
X-Spam-Level: *****
X-Spam-Status: Yes, score=5.8 required=5.0 tests=FORGED_RCVD_HELO, MIME_BOUND_NEXTPART, MISSING_MIMEOLE, NO_REAL_NAME, PRIORITY_NO_NAME, RCVD_IN_NJABL_DUL, RCVD_IN_SORBS_DUL, RCVD_IN_XBL autolearn=no version=3.0.4
(改行は加工)“X-Spam-Flag: YES” を目印に,spam と判定されたメールを放り込むフォルダなりに振り分けてください. ぼくの MUA は電信八号なので,正規表現で振り分けです.
以上で設定完了です. 現在のところ,spam 判定はかなりの好成績です. 素晴らしい.
[ permalink ] [ 0 comment(s) ]- 000590
よく忘れるので備忘録.
^V^M
^V (Ctrl+V) が特殊文字のエスケープ. 上記は Enter の例で,Tab も同様に可能.
例えば,全タブ文字を半角空白二つに置換するのは下のような感じ.
:%s/^VTab/ /g
[ permalink ] [ 3 comment(s) ]- 000470
昨年末から続いた移行作業がひとまず一段落しました. エントリの数が多くなってしまったのでここで一旦整理しておきたいと思います. エントリの時系列は無視します.
FedoraCore インストール ~ ネットワークの設定- Fedora Core 3 を HDD からインストールする
- probe_partition_for_geom() faild
- rp-pppoe で ADSL 接続
- EveryDNS.net で Dynamic DNS
- Fedora Core 1 で Firewall 構築
- NV III を導入しました
Web 関連メール関連- qmail のセットアップ
- qmail で APOP
- qmail で POP before SMTP (未稿)
- IMAP サーバー dovecot のセットアップ
- SquirrelMail のセットアップ
その他[ permalink ] [ 0 comment(s) ]- 000469
出先から自宅のメールをチェック,返信する場合があるので Web メールシステムを導入します.
以前までは sqwebmail を使っていたのですが,C で書かれているためカスタマイズが面倒でした. そこで今回は,PHP で書かれた SquirrelMail を導入したいと思います.
- ファイルのダウンロード
2005-01-17 時点での最新版,1.4.3a-ja-20041014 をダウンロードします.
- ファイルの展開
ダウンロードしたファイルを展開します.後ほど Apache 経由でアクセスするので,それを考慮した位置に展開するのが良いでしょう.
# cd /var/web # tar zxvf /tmp/squirrelmail-1.4.3a-ja.tar.gz
- ディレクトリの作成
設定を保存するディレクトリと,添付ファイルを一時的に保存するディレクトリを作成します.所有者,グループは apache を動かすユーザ,グループにします.
# cd /var/spool # mkdir squirrelmail # mkdir squirrelmail/attach # cp -r /var/web/squirrelmail-1.4.3a-ja/data \ > squirrelmail/ # chown -R apache:apache squirrelmail # chmod 730 squirrelmail/attach
- 設定ファイルの編集
設定ファイルを編集するためのツールが用意されているので,それを利用します.
$ cd /var/web/squirrelmail-1.4.3a-ja/config $ ./conf.pl
設定項目が沢山あるのですべてを説明することはしませんが,一部書いておきます.
Organization Preferences > Default Language ja General Options > Default Charset iso-2022-jp General Options > Data Directory /var/spool/squirrelmail/data/ General Options > Attachment Directory /var/spool/squirrelmail/attach/ - Apache の設定変更
Web ブラウザからアクセスできるよう Apache を設定し,再起動します.
- 設定確認
http://www.example.com/src/configtest.php にて,squirrelmail の設定を確認することができます.何らかのエラーが表示される場合は修正します.
以上で設定は完了です. 使ってみたところ,メール文中の一部に文字化けが生じています. どのような文字で発生する問題なのかはまだ切り分けられていませんが注意が必要ですな. また,From ヘッダフィールドを設定できないのもイマイチなので,ここは今度手を入れることにします.
[ permalink ] [ 2 comment(s) ]- 000468
しばらく間が開きましたが,メール環境構築の続きです.
以前までは Courier-imap を使用していたのですが,バージョンが上がってなにやら事前にやるべきことがいろいろ増えたのと,わざわざ configure make しなくても FC3 には dovecot という IMAP サーバーが用意されていたのとで,こちらに乗り換えることにしました.
設定の方針は以下の通りです.
- 提供するのは IMAP のみ.POP は使用しない.
- 開くのはローカル側のみ.
- dovecot 専用のパスワードファイルを用意する.
- 設定ファイルの編集
設定ファイルは /etc/dovecot.conf になります.デフォルトからいじった箇所だけを書きます.
protocols = imap imap_listen = 192.168.100.1 #pop3_listen = [::] #imaps_listen = [::] #pop3s_listen = [::] disable_plaintext_auth = no #login = pop3 auth_userdb = passwd-file /etc/dovecot.passwd auth_passdb = passwd-file /etc/dovecot.passwd
- パスワードファイルの作成
設定ファイルで設定した通り,/etc/dovecot.passwd に dovecot 専用のパスワードファイルを作成します.パスワードファイルの形式は次の通りです.
user:password:uid:gid:::::maildirデフォルトの設定では uid と gid の範囲に制限があって,uid は500以上,gid は root と wheel 以外を選択しなければなりません.また,password は MD5 で記述しておく必要があります.perl を使って以下のように生成できます.
cat | perl -e 'while(<>){ print crypt("$_","\$1\$01234567\$")."\n";}'
(実際は一行)実行すると入力待ちの状態になるので,パスワードを入力してください.終わるときは ^D や ^C で抜けてください.
- 起動
# /etc/rc.d/init.d/dovecot start
[ permalink ] [ 0 comment(s) ]- 000464
ぼくの使っている PHS,AH-K3001V は MUA が載っています. こいつを使って自宅サーバに接続してメールチェックができるのだけれど,POP はパスワードもプレーンテキストで垂れ流なのでさすがに気持ち悪い. そこで,APOP の導入です.
APOP は RFC1939 で定められていて,メールの受信に OTP (One-time password) を使用するものです. qmail はそもそも POP のパスワードチェックを自前で持っていなくて,checkpassword を併用していました. これを APOP 対応のものに差し替えることで,簡単に APOP による認証を導入することができます.
qmail と併用できる APOP 対応ツールとしては qmail-vida というものもありますが,今回はもっとシンプルな vucheckpw を採用します.
設定手順- ソースの入手と展開
以下のページから vucheckpw-1.01.tar.gz を入手します.
展開を行います.
$ cd /tmp $ tar zxvf vucheckpw-1.01.tar.gz
- インストール先の設定
コンパイル前に幾つかのファイルを変更することで,インストール先を変更することができます.付属の INSTALL より抜粋します.
- The vucheckpw home directory, normally /var/qmail/alias. To change this directory, edit conf-home now.
- The qmail home directory, normally /var/qmail. To change this directory, edit conf-qmail now.
- The maildir directory, normally Maildir. To change this name, edit conf-maildir now.
- The password file, normally .password. To change this name, edit conf-password now.
ぼくの環境ではデフォルトで問題がないので何も設定を行いません.
- コンパイル
make 一発です.
$ cd vucheckpw-1.01 $ make
- インストール
インストール先が ~alias なので alias に su して行います.
$ su alias Password: $ ./install $ ./instcheck
instcheck はインストール状況をチェックするのですが,こいつが WARNING を吐く場合があります.パーミション関連の場合は以下のようにしてみてください.
$ su Password: # chmod g+s ~alias/bin ~alias/rc # ^D $ ./instcheck
参考までに,現在の設定状況です.
$ ( cd ~alias ; ls -ld bin rc ) drwxr-sr-x 2 alias qmail 4096 12月 31 23:57 bin drwxr-sr-x 2 alias qmail 4096 12月 31 23:57 rc
- tcpserver の設定変更
AH-K3001V からアクセスできるよう,tcpserver の設定を変更します.
/etc/tcprules/pop3.rules192.168.100.:allow :allow
次に設定ファイルを tcpserver が使用する形式に変換します.
# cd /etc/tcprules # /usr/bin/tcprules pop3.cdb pop3.tmp < pop3.rules
- 起動スクリプトの変更
vcheckpw により認証を行うために,起動スクリプトの pop3d に関する部分を以下のように書き換えます.
# Starting pop3d/tcpsrver echo "Starting pop3d/tcpserver..." /usr/local/bin/tcpserver -HR \ -x /etc/tcprules/pop3.cdb \ 0 pop3 \ /var/qmail/bin/qmail-popup mizba.net \ /bin/vucheckapoppw \ /var/qmail/bin/qmail-pop3d Maildir \ 2>&1 | /var/qmail/bin/splogger pop3d 2 & - qmail の再起動
qmail-pop3d を再起動します.
- ユーザーの追加
ユーザーの追加は以下のように行います.
# ~alias/bin/adduser newuser # ~alias/bin/passwd newuser pass
この手順で追加されたユーザーは OS ユーザーとしては存在せず,メール受信のみのユーザーとなります.
[ permalink ] [ 0 comment(s) ]- 000462
今までは pserver を使って CVS をリモートから使用していたのだけれど,どうやら SSH 経由でいけるらしいことが判明しました.
- 2.9.2 Connecting with rsh - Version Management with CVS
上記が "official" manual for CVS だそうです.
設定方法$ export CVS_RSH=ssh $ export CVSROOT=:ext:cvshost:/home/cvsuserこれで cvs co などを行えば SSH 経由で CVS の操作が可能です. ただ,ポートの変更方法が未だ見つからず.
[ permalink ] [ 0 comment(s) ]- 000461
PC の時計は案外狂いやすいそうです. しかし,そこはよくしたもので,きちんと正確な時刻を取得するための仕組みも用意されています.
原子時計等を使用した,かなりの精度で正確な時刻を持ったサーバをルートに据えて,それと時刻を同期させるためにサーバ階層を構築しています. 今回はその階層の末端に自分のドメインのマシンを一つぶら下げる設定を行いました.
NTP はネットワーク経由で時刻情報をやり取りする関係上,伝送遅延の影響を完全には排除し切れませんが,ターンアラウンドタイムなどを用いてかなりの精度で時刻合わせを行うことができます(我が家では 10 msec オーダー). ただしこの際注意したいのが,同期先のサーバがいかに正確であろうとも,伝送遅延の変動が大きい場合は精度が落ちる点です. 非常に正確 (例えば Stratum1) だけれど遠いサーバにつなぎにゆくよりも,プロバイダなりが提供するような,Stratum3,4 程度だけれど近いサーバのほうが結果的により精度が出る可能性があります. それに,いきなり Stratum1 につなぎにいってしまったのでは,階層構造をもたせている意味もないですしね. まずは,近所の NTP サーバを探してみましょう.
設定手順- NTP サーバ探し
プロバイダのページに記述がありました.以下の二つが用意されているようです.
- ntp1.wakwak.com
- ntp2.wakwak.com
- 設定ファイルの編集
上記 NTP サーバの設定に加え,本サーバに接続できるクライアントマシンを制限する設定を行います.
/etc/ntp.conf... restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap ... server ntp1.wakwak.com server ntp2.wakwak.com ...
- ntpd の起動
設定が終わったら以下のように ntpd を起動します.
# /etc/rc.d/init.d/ntpd start - 動作確認
ntpd を起動してしばらく経ったら,以下のように動作を確認します.
# ntpq -p"offset" が同期先サーバと本マシンの時刻のズレ (ms) です.
設定ファイルの詳細は次のページを参考にしてください.
一番下に設定ファイルについての説明ページへのリンクがあります.
[ permalink ] [ 0 comment(s) ]- 000459
PostgreSQL 7.3.4 から PostgreSQL 7.4.6 にデータを移行しました.
結論を述べますと,バックアップ / リストア の手順そのままですんなりいきます.
今回ちょっと気になったのがバージョンが変わる点だったのだけれど,まったく問題なく以下の手順でいけました.
この手順ではラージオブジェクトの移行は行えません.pg=# \dlとして何か結果が返る場合は別の手順をご検討ください.- データ抽出
7.3.4 付属の pg_dumpall を用いて全データを抽出します.
$ pg_dumpall > pg_dump.dat
途中,データベースごとにパスワードを訊き直されました.
- データの書き戻し
7.4.6 を立ち上げてのち,以下の手順です.
$ pg_sql -f pg_dump.dat template1
これは,新規データベースクラスタを作成 (initdb) した直後に行うのがシンプルで良さそうです.データベースサーバが起動している必要がある点にご注意.
[ permalink ] [ 0 comment(s) ]- 000458
サーバーの OS 入れ替えに伴い,PostgreSQL もバージョンをあげました.
本当は 8 も試してみたかったのだけれど,今は妙なところで引っかかる事態はできるだけ避けたいので7系最新の 7.4.6 で我慢.
このあたりを参考に作業を行いました.
- ユーザーの追加
PostgreSQL 用のユーザーを作成します.
# adduser postgresql
- ソースの入手
適当なミラーサイトから postgresql-7.4.6.tar.gz をダウンロードします.
$ wget http://.../postgresql-7.4.6.tar.gz
- ソースの展開
適当なディレクトリでソースを展開します.
$ cd /tmp $ tar zxvf ~/postgresql-7.4.6.tar.gz
- configure の実行
configure を実行します.インストール先と,スレッド関連のオプションを指定しました.
$ ./configure \ > --prefix=/home/pg/7.4.6 \ > --enable-thread-safety
- コンパイルとテスト
コンパイルには gmake を使います.make ではダメだそうです.
$ gmake
インストールが終わったら念の為回帰テストを実施しましょう.
$ gmake check
以下のメッセージが出れば O.K. です.
====================== All 93 tests passed. ======================
- インストール
ヘッダファイルも含めてインストールします.
$ gmake install-strip $ gmake install-all-headers
以上でインストールは完了です. 続いてインストール直後の設定を幾つか行います.
- データベースクラスタの初期化
データベースが管理するデータを格納するファイル群を作成します.ここでいう「クラスタ」はサーバを束ねる所謂「クラスタリング」とは別物で,後に作成するデータベースを複数格納するためこの名がついていると思われます.この際デフォルトで,実行したユーザと同名のデータベースユーザが作成されます.
$ mkdir ~/pgdata $ initdb -D ~/pgdata
- 追記
7.4.8 を入れてみたところ,ここで$ createdb userNameとしてデータベースを作成する必要がありました.
- データベース・サーバの起動
先ほど作成したデータベースクラスタを指定してデータベース・サーバを起動します.
$ pg_ctl -D ~/pgdata start
- データベースユーザの作成
デフォルトのデータベースユーザは権限が強すぎるので,作業用のデータベースユーザを作成します.
$ psql -U postgresql postgresql=# create user userName postgresql-# with password 'password';
- データベースの作成
データベースを作成します.所有者,エンコーディングを指定することができます.
postgresql=# create database dbName postgresql-# with owner=userName postgresql-# encoding 'Unicode';
[ permalink ] [ 0 comment(s) ]- 000457
本エントリに現れる手順はパーティションテーブルに変更を加えるものがあります. 最悪の場合データを失う恐れがないとはいえないので,必要なデータはバックアップを取るなど十分にご注意ください. 一応,ぼくの場合は問題は発生しませんでしたが.今回の Fedora Core 3 のインストールは,既存のディスクの空きパーティションを使用しました. インストール前のパーティションの状況は以下でした.
/dev/hde1 /boot /dev/hde2 swap /dev/hde3 拡張 /dev/hde5 / /dev/hde6 空き /dev/hde7 /u01 (雑多なデータ) この空いている hde6 に Fedora Core 3 をインストールしようとしました.
前回述べたようにフロッピーディスクから grub 経由でインストーラーを起動したのですが,以下のようなエラーが発生します.
Assertion (serectors<=xx) at disk_dos.c:xxx in function probe_partition_for_geom () faild.
Google で検索してみたところ,幾つかそれらしきものがヒット.
原因は Windows パーティションにあるらしいとのこと. 確かに,エラーの発生箇所が "disk_dos.c" となっていますしね. work around は「パーティション切り直す」なのだけれど,今回は既存の環境を残さなければならないのでこの方法は採れません. そこで,以下のようにパーティションタイプの変更で回避できないか試みました.
# fdisk /dev/hde Command (m for help): p Disk /dev/hde: 255 heads, 63 sectors, 14946 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System /dev/hde1 * 1 33 265041 83 Linux /dev/hde2 34 164 1052257+ 82 Linux swap /dev/hde3 165 14946 118736415 5 Extended /dev/hde5 165 1470 10490413+ 83 Linux /dev/hde6 1471 2776 10490413+ 83 Linux /dev/hde7 2777 14946 97755493+ 83 Linux Command (m for help): t Partition number (1-7): 3 Hex code (type L to list codes): 85 Command (m for help): w
「拡張領域」を「Linux 拡張領域」に変更してみたのですが,これでも同じエラーが発生しました.
他に手はないかと更に調べてみたところ,以下のようなものを発見.
- Assertion at disk_dos.c:485? when trying to install(update) to Fedora Core 3? - FedoraForum.org
- Fedora Core 3 Install - Jim O'Halloran's Weblog
sfdisk というパーティションを切り直すツールを使用して,バッチでパーティションテーブルを書き換える方法です.
# sfdisk -s /dev/hde | sfdisk --no-reread /dev/hde前半の "sfdisk -s /dev/dhe" の部分は現在のパーティションのサイズをリストします. 後半の "sfdisk --no-reread /dev/hde" は標準入力から設定を読み込んでパーティションを切り直します. 組み合わせることで,現在のパーティションのサイズ通りにもう一度切り直す(パーティションテーブルを書き直す)操作を行うことになります. 結果として,これでインストーラーが正常に動作するようになりました.
もし同様の問題が発生した場合は,試してみるのも良いかもしれませんが,at your own risk でよろしくお願いします.最後に sfdisk の manpage より.
BE EXTREMELY CAREFUL - ONE TYPING MISTAKE AND ALL YOUR DATA IS LOST[ permalink ] [ 0 comment(s) ]- 000456
昨晩,とうとう Fedora Core 3 の導入に成功しました.
世では,カーネルサイズが 1.44 MB を越えているためフロッピーブートで Fedora Core 3 をインストールすることは無理といわれています. となると,ISO イメージを CD-ROM に焼く必要があるのだけれど,他にもこういう方法が紹介されています.
上記ページでは既存の grub を使って HDD 上のインストール用カーネルイメージを叩く方法を紹介していますが,grub が入っていなくても,フロッピーディスクから起動することで Fedora Core 3 をインストールすることができました.
概要を述べると,grub をフロッピーに入れて,これから HDD 上のインストール用カーネルイメージを叩く,という流れです. たいしたひねりではありませんが,ぼくのようにいまだに lilo を使っている人には役立つ手法です. また,ぼくは試していませんがネットワークインストールも可能な筈なので,CD-ROM ブートもできず,HDD にメディア4枚分も空きがないマシンにインストールする際にも応用できるかと思います.
参考リンク前提情報今回使用する環境はパーティション /dev/hde1 を /boot 用に切ってあり,ここに起動イメージが置かれています.
手順- grub 起動ディスクの作成
フロッピーディスクを一枚用意し,まずはフォーマット.
# fdformat /dev/fd0 # mkfs.ext2 /dev/fd0
続いてgrub のイメージを書き込みます.
# cd /usr/share/grub/i386-vine # dd if=stage1 of=/dev/fd0 count=1 # dd if=stage2 of=/dev/fd0 seek=1
stage1 , stage2 のパスはお使いのディストリビューションに応じて変更してください.
# rpm -qa | grep grub grub-0.95-3 $ rpm -ql grub | grep stage
などとして見つけることも可能です.
- インストール用カーネルイメージのコピー
Fedora の CD イメージに含まれる,以下のファイルを /boot ディレクトリ (/dev/hde1) にコピーします.
# mkdir /boot/install # cd $_ # mount -o loop -o ro FC3-i386-disc1.iso /mnt/cdrom # cp /mnt/cdrom/isolinux/vmlinuz . # cp /mnt/cdrom/isolinux/initrd.img .
- 起動
作成した grub 起動ディスクを使用してマシンを起動します.grub のプロンプトが出た時点で以下のように入力してインストール用カーネルイメージから起動します.
grub> root (hd0,0) grub> kernel /install/vmlinuz ramdisk_size=8192 grub> initrd /install/initrd.img grub> boot
"root" の引数は,BIOS が認識したディスクを順に 0 , 1 , ... と番号を振るのでたとえ /dev/hde でも hd0 (一番最初)となります.二つめの "0" はパーティション番号 (0 origin) です.fdisk のパーティション番号より一つ小さいのでご注意を.
"kernel" , "initrd" の引数にファイル名を渡す際は,"root" で指定したパーティションがルートディレクトリになっている点にご注意ください.
ちなみに,このプロンプトは tab による補完が効きます.
以上の手順で FC3 のインストーラが起動するはずです. 途中,インストール方法を聞かれるのでネットワークなり,ハードドライブなりを選択してください.
今回は CD-ROM なしでもなんとかいけたけれど,やはり今後 FDD 等々の所謂レガシーは置き去りにされるんでしょうかね・・・. 少々寂しいし,何より不便ですな.
[ permalink ] [ 0 comment(s) ]- 000455
先日の夜中に急に思い立って,フレッツ ADSL モア III の申込みを行いました.
下り最大 47Mbps もさることながら,上り最大 5Mbps もかなり魅力. 自宅サーバーにファイルをアップしておいて,出先でダウンロードすることも多いし,他にも色々サービスを提供している関係上,下りだけではなく上り速度も結構重要です.
今まで利用していたのが フレッツ ADSL 8M タイプなので,レンタルモデムは ADSL モデム - MN というものなのですが,これは 47Mbps に対応していません(対応規格が ITU-T G.992.1 Annex C,ITU-T G.992.2 Annex C). そこで新たに送られてきてのがこのモデムです.
これはなかなか多機能で,速度アップだけではなく次のようなことも行えます.
- IP 電話
- ルーター (w/t NAT , NAPT)
- 仮想 DMZ の構築
- 他多数
最近の ADSL モデムはすごいねぇ. 使っているプロバイダも丁度 IP 電話が無料なので,使ってみようかなぁ,と思っていました.
しかし,IP 電話ということは ADSL モデムが 第3層 aware なわけですよ. つまりはルーター + NAPT にしなければならない. それをやってしまうと,今までのネットワーク構成ががらりと変わるのでただいま躊躇しております. ひとまず,今のところはブリッジモードを使って2層で Linux サーバーと接続し,そこでルーター,NAPT ,Firewall を実現しています. まぁ,今まで通り.
でもなぁ.IP 電話って周りに使っている人がいないから特にメリット感じないしなぁ. モデムにルーターやってもらう必要もないし,別に今のままでもいいか.
このモデムのドキュメントはオンラインで提供されていますが,見つけにくい場所にあります. 「バージョンアップ情報」というリンクを辿ったページの一番下にあります.[ permalink ] [ 0 comment(s) ]- 000454
本番運用サーバーを停止している間も,メールサーバーだけは止めたくありません. というわけで,VAIO 505R に qmail をセットアップしました. 本番運用サーバーでは以前に色々と追加の設定を行いましたが,今回はいたってシンプルに以下のオーソドックス三点セットの導入となります.
何ゆえ三つも必要なのかと申しますと,qmail はメールを送受信,配信する機能だけを担うシンプルなプログラムで,単体では認証の仕組みなどを持たないためです. qmail は他のツールと組み合わせることで,例えばセキュリティを高めたり,例えば OS ユーザー以外の仮想ユーザーを扱える仕組みを追加したりなど,様々な拡張が可能となります. 今回はそれらの中から,最低限必要と思われる POP3 のユーザー認証,SMTP の不正中継防止機能を追加したいと思います.
導入手順にはいる前に,qmail と組み合わせて使われるツールに良くある特長を述べておきます. 後ほど起動スクリプトを作成する際に,スクリプトの内容を理解する助けになるかと思います.今回の tcpserver , checkpassword もそうなのですが,実行ファイルへのパスを引数にとるものが多くみられます. これらは,そのツールの中で何らかの処理を行い,何らかの条件に従って環境変数を設定,変更したのちに,引数として与えられたプログラムを exec する,という動きをします. exec ですので,プロセス自体が取って代わられます. 今回を例に挙げると,tcpserver は接続元 IP アドレスに基づいて後続のプログラムの実行を行ったり拒否したり,特定 IP アドレスの場合は環境変数を設定したりします. checkpassword は OS のユーザ認証と同一ロジックでパスワードチェックを行い,正しいパスワードが与えられた場合は後続のプログラムを実行します.
これらのツール群を使用した起動スクリプトを理解する際は,どれがコマンドで,何処までがそのコマンドが処理する引数で,何処からが次のコマンドなのか,という点に注目する必要があります. パイプがあるわけでも,";" で区切るでもなくコマンドがずらずらと並ぶので,慣れるまでは読みにくいと思うのでご注意ください.それでは,以下 qmail の設定手順です. インストールを行うにあたって,次のサイトを参考にしました.
- ユーザーの作成
qmail では,メール送受信,配信といった機能ごとにプロセスが分かれており,更にそれらの実効ユーザー ID も異なっています.最初に qmail が使用するユーザーとグループを作成します.
$ su Password: # mkdir /var/qmail # groupadd nofiles # useradd -g nofiles -d /var/qmail/alias \ > -s /bin/false alias # useradd -g nofiles -d /var/qmail -s /bin/false qmaild # useradd -g nofiles -d /var/qmail -s /bin/false qmaill # useradd -g nofiles -d /var/qmail -s /bin/false qmailp # groupadd qmail # useradd -g qmail -d /var/qmail/ -s /bin/false qmailq # useradd -g qmail -d /var/qmail/ -s /bin/false qmailr # useradd -g qmail -d /var/qmail/ -s /bin/false qmails
- qmail のインストール
最初に,qmail をインストールします.ソースを解凍した後に,タイムゾーンに関するパッチを適用します.
glibc 2.3.1 以降の場合は以下のパッチも必要となります.
$ tar zxvf qmail-1.03.tar.gz $ cd qmail-1.03 $ patch -p1 < ../qmail-date-localtime.patch $ patch -p1 < ../qmail-1.03.errno.patch $ patch -p1 < ../qmail-1.03.qmail_local.patch $ su Password: # make setup # make check
- tcpserver のインストール
glibc 2.3.1 以降の場合は以下のパッチが必要となります.
$ tar zxvf ucspi-tcp-0.88.tar.gz $ cd ucspi-tcp-0.88 $ patch -p1 < ../ucspi-tcp-0.88.errno.patch $ patch -p1 < ../ucspi-tcp-0.88.a_record.patch $ patch -p1 < ../ucspi-tcp-0.88.nobase.patch $ su Password: # make setup # make check
- checkpassword のインストール
glibc 2.3.1 以降の場合は以下のパッチが必要となります.
$ tar zxvf checkpassword-0.90.tar.gz $ cd checkpassword-0.90 $ patch -p1 < ../checkpassword-0.90.errno.patch $ su Password: # make # make setup # make check
- SMTP サーバーとしての設定
最初に SMTP サーバーとしての設定を行います. 不正中継を防止するために,以下の挙動が必要となります.
- 中継を許可されていないホストからの接続の場合
- 自ドメイン宛であれば受信して配信
- 他ドメイン宛であれば破棄
- 中継を許可されているホストからの接続の場合
- 中継して送信
以上の挙動を実現するためには,中継を許可されている/いないを判断する必要があることはお判り頂けるかと思いますが,そのために使用するのが tcpserver です. tcpserver で IP アドレスをチェックし,中継を許可されているホストからの接続の場合は環境変数「RELAYCLIENT」を設定した後に qmail-smtpd に exec します. qmail-smtpd は環境変数をチェックし,その有無で中継の挙動を制御します.
最初に設定ファイルを作成します.192.168.100.0/24 からの接続は中継を許可(RERAYCLIENT を設定)し,それ以外も接続は許可します. 接続を許可するのは,中継不許可の接続であっても自ドメイン宛の場合が考えられるためです. 自ドメインか否かの判断は qmail-smtpd が行います.
/etc/tcprules/smtp.rules192.168.100.:allow,RELAYCLIENT="" :allow
次に設定ファイルを tcpserver が使用する形式に変換します.
# cd /etc/tcprules # /usr/bin/tcprules smtp.cdb smtp.tmp < smtp.rules
続いて幾つかの設定ファイルを作成します.
- /var/qmail/control/me
mizb.net
- /var/qmail/control/defaultdomain
mizb.net
- /var/qmail/control/locals
localhost mizba.net
- /var/qmail/control/plusdomain
mizba.net
- /var/qmail/control/rcpthosts
localhost mizba.net
- 中継を許可されていないホストからの接続の場合
- POP3 サーバーとしての設定
SMTP ときたら,次は POP サーバとしての設定なのですが,実は特にやることがありません.仮想ドメイン,仮想ユーザーなどを使用する場合は色々と手順が必要となるのですが,今回は実ドメイン,実ユーザーのみなので tcprules の設定のみを行います.
/etc/tcprules/pop3.rules192.168.100.:allow :deny
# cd /etc/tcprules # /usr/bin/tcprules pop3.cdb pop3.tmp < pop3.rules
- ローカル配信の設定
qmail は mbox 形式ではなく Maildir 形式を使用します.
$ cd ~ $ /var/qmai/bin/maildirmake Maildir $ echo "./Maildir/" > .qmail
当該ドメイン宛のメールをすべて特定のアカウントで受け取りたい場合は以下のように設定します.
# echo "all@your-domain" > ~alias/.qmail-default - 起動
以下のように起動スクリプトを準備します.tcprules はデフォルトで auth にリクエストを投げるのですが,それを止めるために -HR をいうオプションを渡しています.
#!/bin/sh exec env - PATH="/var/qmail/bin:$PATH" \ qmail-start ./Maildir splogger qmail 2 & #Starting smtpd/tcpserver echo "Starting smtpd/tcpserver..." /usr/local/bin/tcpserver -HR \ -x /etc/tcprules/smtp.cdb \ -u qmaild -g nofiles \ 0 smtp \ /var/qmail/bin/qmail-smtpd \ 2>&1 | /var/qmail/bin/splogger smtpd 2 & # Starting pop3d/tcpsrver echo "Starting pop3d/tcpserver..." /usr/local/bin/tcpserver -HR \ -x /etc/tcprules/pop3.cdb \ 0 pop3 \ /var/qmail/bin/qmail-popup mizba.net \ /bin/checkpassword \ /var/qmail/bin/qmail-pop3d Maildir \ 2>&1 | /var/qmail/bin/splogger pop3d 2 &
以上で設定完了です. qmail は非常に堅いアプリケーションで,長い間セキュリティーホールは一つも発見されていませんでした. ただ,現在のところ唯一このようなものがあります. ご注意ください.
TIPS - パッチの当て方パッチを当てる際に,いちいちパッチのファイルをローカルに保存する必要はありません.
$ patch -p1として patch を実行した状態で,ターミナル画面にパッチの中身をペースト. 標準入力から patch に流れ込みます. ペーストし終えたら,ctrl + D で終了です.
[ permalink ] [ 0 comment(s) ]- 000447
諸事情で作業のペースをあげます. 細かな記録は整形せずにテキスト化します. 精度は,一月以内ならば自分がそのテキストを見ながら同じ作業を行える程度. このエントリには,その項目と概略のみを記します. 詳細は今後余裕を見てアップ予定.
最初に,作業の目的から. 本番運用サーバーを Fedora Core 3 に移行するにあたり,そのセットアップ作業中に最低限のサービスを確保するために VAIO 505R を仮サーバーとして運用する準備です.
- 静的 IP に変更
現在,本番運用サーバーから DHCP で各種ネットワーク設定を取得していますが,移行作業中は自前でネットワーク設定を行わなければなりません.
- /etc/sysconfig/network-scripts/ifcfg-eth0
- /etc/resolv.conf
- DHCP サーバーとして設定
移行作業中は VAIO 505R からネットワーク設定を取得します.
- /etc/dhcpd.conf
- DNS サーバーとして設定
移行作業中は VAIO 505R が DNS サーバーとして稼動します.
- /etc/named.conf
- /etc/named/*
- qmail のセットアップ
移行作業中は一時的に VAIO 505R にメールを貯めます.
- Apache のセットアップ
お詫びページを表示しておくために使用します.
[ permalink ] [ 0 comment(s) ]- 000445
iptables の設定を行っていて,limit モジュールに与えるオプションの意味がわからなくなってきたので Linux Kernel のソースを読んでみました.
以下のドキュメントにも limit モジュールの詳細が載っています.
まず,limit モジュールに与えるオプションがコード内で持つ意味を示します.
include/linux/netfilter_ipv4/ipt_limit.h--limit 平均パケット到着間隔.要するに --limit の逆数.--limit は内部で逆数として扱われる. --limit-burst 瞬間最大パケット数 チェーンにルールを追加する際の初期化は次のように行われます.
net/ipv4/netfilter/ipt_limit.c持ち点 = 平均パケット到着間隔 * 瞬間最大パケット数 持ち点の上限 = 平均パケット到着間隔 * 瞬間最大パケット数 減点幅 = 平均パケット到着間隔
パケットが到着するごとに以下の計算が行われます.
net/ipv4/netfilter/ipt_limit.c持ち点 += 前回のパケット到着からの経過時間 if ( 持ち点 > 持ち点の上限 ) 持ち点 = 持ち点の上限 if ( 持ち点 >= 減点幅 ) { 持ち点 -= 減点幅 パケット許可 } パケット拒否これを,平均パケット到着間隔で正規化するとロジックがわかりやすくなります.
持ち点 = 瞬間最大パケット数 持ち点の上限 = 瞬間最大パケット数
前回のパケット到着からの経過時間 持ち点 += ------------------------------- 平均パケット到着間隔 if ( 持ち点 > 持ち点の上限 ) 持ち点 = 持ち点の上限 if ( 持ち点 >= 1 ) { 持ち点 -= 1 パケット許可 } パケット拒否パケット到着ごとに一点減点され,時間の経過とともに徐々に点数が回復していく,という挙動です. 減点されて持ち点が一点を下回ると,一点以上に回復するまではパケットを拒否します. 瞬間最大パケット数 (--limit-burst) は初期持ち点(かつ最大持ち点)を表し,平均パケット到着間隔 (--limit の逆数) は回復するレートを表します.
実際の Linux Kernel ソースコードでは,これらに underflow 防止のロジックや各種補正計算がくっついているため多少追いにくくなっていますが,基本的な考え方を押さえておけば理解しやすいかと思います.
以下に,--limit-burst 4 の場合の模式図を示します. 赤掛けの部分がパケットが拒否される期間です. 右肩上がりの線分の傾きは --limit により変化します.
最後に,このエントリで使用した用語とソースコード内の変数名との対応を載せておきます. ご自身でソースを読み解く際のご参考までに.
credit 持ち点 credit_cap 持ち点の上限 avg 平均パケット到着間隔 burst 瞬間最大パケット数 cost 減点幅 [ permalink ] [ 0 comment(s) ]- 000444
続いて,Firewall としての設定を行います.
現在契約しているプロバイダはグローバル IP を一つしかもらえないので,IP Masquerade を使用して複数のクライアントがインターネットにアクセスできるよう設定します. さらに,iptables でパケットフィルタリングの設定を行い,接続可能なホスト,使用可能なサービスを制限します.
- Linux 2.4 Packet Filtering HOWTO
- Linux IP Masquerade HOWTO(November 14, 2000.ちょっと古めです.)
- JM : iptables
今回は,Linux Box で提供するサービスはローカル向きの SSH だけとします. また,IP Masquerade はローカル --> グローバル のみを許可します.
この設定を順に実行する過程で,一時的にセキュリティーが低下するステップがあります. 下記を step-by-step で実行する際は十分に注意してください. なるべく,下記設定を理解した上でスクリプト化するなどして,セキュリティーが低下している時間をなくすよう対策を行ってください.- IP packet forwarding の設定
最初に,複数 NIC 間でのパケットのやりとりを有効に設定します.
# echo 1 > /proc/sys/net/ipv4/ip_forward
ただし,上記設定は再起動を行うと元に戻ってしまいます.そこで /etc/sysctl.conf の以下の行を "1" に変更します.
# Controls IP packet forwarding net.ipv4.ip_forward = 1 - 幾つかの iptables 以外の設定
Linux Box をネットワークに接続するにあたって,セキュリティの観点から幾つかの設定項目を変更します.
# cd /proc/sys/net/ipv4 # echo 1 > icmp_echo_ignore_broadcasts # for i in conf/*/accept_source_route; do > echo 0 > $i > done # for i in conf/*/accept_redirects; do > echo 0 > $i > done
それぞれ以下のような設定です.
- Broadcast の PING (echo request) を拒否します.Broadcast PING はサブネット内のマシンを検出する目的で使われることがあります.
- IP のソースルートオプションを無視します.ソースルートは IP パケットが経由すべきネットワークノードを明示的に指定するものです.これを使用すると man-in-the-middle 攻撃も可能となる場合があります.
- IP のリダイレクトオプションを無視します.これは,何だっけな・・・.
- SSH のみの提供
最初に,グローバル向きのインタフェースからのパケットをすべて破棄します.
# iptables -A INPUT -i ppp0 -j DROP
続いてローカル向きインタフェースへの SSH (22 番ポート) を許可します.
# iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT
最後に,上記にマッチしなかった場合の処理を定義します.
# iptables -P INPUT DROP # iptables -P OUTPUT DROP
- IP Masquerade の設定
ppp0 から出てゆくパケットは IP Masquerade の対象とします.
# iptables -t nat -P POSTROUTING ACCEPT # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # iptables -t nat -P PREROUTING ACCEPT
- 保存
以上の設定は,再起動すると消えてしまします.設定を保存しておきましょう.
# /etc/rc.d/init.d/iptables save
簡単な設定の手順は以上です. 以下,更に詳細なルールを設定するにあたっての参考に.
- TCP, UDP は大抵の場合 in と out の双方のパケットがあってはじめて意味をなします.どちらか一方のみを許可し,もう一方を拒否している場合は正常な通信が行えません.
- TCP の 3 way handshake を理解しましょう.--syn で SYN パケットを引っ掛けることができるので,自分がクライアントなのかサーバーなのかで異なるルールを設定することができます.ポートによる振り分けの際にはどちらなのかを意識しましょう.
[ permalink ] [ 0 comment(s) ]- 000443
ADSL 接続ができるようになったので,次は Dynamic DNS の設定を行います. Dynamic DNS というのは,固定 IP アドレスを取得できないかわいそうな人たちのために,ホスト名に対応する IP アドレスを動的に変更することができる仕組みです.
とはいえ,DNS サーバーが勝手にホストの状態を監視して設定を変更してくれるわけではなく,クライアント側から IP アドレスの変更を通知しなければなりません. ぼくは EveryDNS.net というサービスを利用しているので,通知のためのツールとして eDNS.pl というものを使用します.
- ダウンロード
eDNS.pl.txt をダウンロードし,適当な場所に "eDNS.pl" として保存します.
$ wget http://www.everydns.net/eDNS.pl.txt $ mv eDNS.pl.txt eDNS.pl $ chmod +x eDNS.pl
- パッチの適用
オリジナルの eDNS.pl は引数として IP アドレスを渡す必要があったり,色々あるので少し改変しました.パッチを以下のロケーションにおいてあります.
$ patch < eDNS.pl.patch
- 設定
eDNS.pl に EveryDNS.net のユーザー名,パスワードなどを書き込みます.
- 定期実行
以下のように crontab の設定を行います.実行間隔は適当に調整してください.IP アドレスが変更にならないと変更要求が飛ばないので,間隔を短くしても EveryDNS.net のサーバーに迷惑をかけることはありません.
$ crontab -e
*/3 * * * * /usr/local/bin/eDNS.pl
[ permalink ] [ 2 comment(s) ]- 000442
ぼくが使っているフレッツ ADSL は,交換局と加入者宅間の通信に PPP over Ethernet (PPPoE) というプロトコルを使用しています.
今回,Fedora Core 1 がインストールされいるマシンで,ADSL 接続の設定を行います. Fedora Core 1 にはデフォルトの PPPoE クライアントとして rp-pppoe が入っています.
- 設定ファイルの準備
/usr/share/doc/rp-pppoe-3.5/configs/pppoe.conf に雛形が用意されていたのでこれを使用します.
# cd /etc/ppp # cp /usr/share/doc/rp-pppoe-3.5/configs/pppoe.conf .
雛形が上記ロケーションにない場合は以下のように探してみてください.
# rpm -ql rp-pppoe | grep pppoe.conf
- 設定ファイルの編集
ADSL モデムに接続されている NIC ,接続に使用するユーザー名を設定します.
# Ethernet card connected to ADSL modem ETH=eth0 ... USER=guest@flets
- 認証情報の設定
パスワードをファイルに書き込みます.編集するファイルは以下の二つです.
- chap-secrets
- pap-secrets
"guest@flets" * "guest"
PAP , CHAP というのは認証の方式です. PAP は認証情報が平文で流れますが,CHAP は Challenge Response 方式なので比較的安全です. - 接続 / 切断
以下のコマンドで接続します.
# /usr/sbin/adsl-start
以下のコマンドで接続状態を確認します.
# /usr/sbin/adsl-status
以下のコマンドで切断します.
# /usr/sbin/adsl-stop
- 接続スクリプト
VineLinux には次のようなスクリプトが付属されていました.なかなか便利です.
[ permalink ] [ 0 comment(s) ]- 000439
PHP5 がなかなか面白げなので,麦酒堂を今後 PHP5 化してゆこうかと考えています.
その第一弾として,既存環境の PHP4 を置き換えようとしたのですが apache が worker thread で構築されていて失敗. 仕方がないので apache を prefork で構築しなおすことにし,ついでに最新バージョンにあげました.
今のところ,これまでの PHP4 系で書かれたスクリプトもきちんと動作しているようです. ただ,Vine の libxml2 が古くて,libxml2 関連の機能が動作しない状態です. これではせっかくの PHP5 の機能が活かせないので,OS から入れ直しを検討中です. それまでは,中途半端ながらこの環境で PHP5 でのプログラミングを試してゆきます.
[ permalink ] [ 2 comment(s) ]- 000438
ちょいと試してみようと思い,Oracle Database 10g の30日間トライアル版をインストールしました.
念の為書きますと,これはあくまでもぼくの個人的活動の範囲で行ったインストールの記録です. 参考にする場合がありましたら,どうぞ at your own risk でお願いします.
[ permalink ] [ 0 comment(s) ]- 000391
XFree86 4.2.1 on VineLinux2.6 の xfs にフォントを追加する手順です. 今回は *.ttc を *.ttf に分割するところから始めます.
まずは *.ttc を *.ttf に分割するツール,ttc2ttf を入手します.
TrueType Collection を True Type Font にバラすこのサイトに ttc2ttf のソースがあるのでダウンロードしましょう. ただし,これだけでは Linux 上でコンパイルが通らないので,次のパッチを使ってください.
ttc2ttf.linux.patch$ patch < ttc2ttf.linux.patch patching file ttc2ttf.cpp $ gcc -DINTEL -o ttc2ttf ttc2ttf.cpp ttc2ttf.cpp: In function `int main(int, char **)': ttc2ttf.cpp:47: warning: multi-character character constant
文句を言われるけれど気にせずに.動きますから. コンパイルが完了したら,*.ttc を分割しましょう.
$ ./ttc2ttf SH_G30.ttc $ ls *.ttc *.ttf SH_G30.ttc SH_G300.ttf SH_G301.ttf
*.ttf を xfs が読めるディレクトリに移動します. /etc/X11/fs/config を参考に,既存のディレクトリを流用するのも楽でよいかもしれません. 自分でディレクトリを掘る場合は /etc/X11/fs/config への追加を忘れずに.
そして当該ディレクトリで以下のように設定を行います.
# cd <当該ディレクトリ> # ttmkfdir > fonts.dir
最後に,xfs を再起動すれば完了です.
# /etc/rc.d/init.d/xfs restart
[ permalink ] [ 0 comment(s) ]- 000356
時々話には聞くけれど,実際に目にしたのは初めてでした. (やったのはぼくではないですよ.)
$ TMPDIR=/home/tmp $ export TMPDIR $ su - Password: # rm -fr $TMPDIR/*何が起こるか判りますか?
でも,これってそれほど特殊なコマンドシーケンスでもなくて,結構やってしまいそうなので注意したいです.
[ permalink ] [ 2 comment(s) ]- 000270
以前,一時ディレクトリの作成 というエントリを書きました.これはこれで便利だったのだけれど,日付のディレクトリがずらりと並んでしまい,何に使っていたものなのかが良くわからない状態になってしまいました.そこで,半ば強制的に README を書くように変更しました.
#!/bin/sh TMPBASE=${PWD} TMPNAME=`date +%Y-%m-%d` SEQ=0 SUFFIX= _NOREADME="" if [ ! "x${1}" == "x" ]; then if [ "x${1}" == "x-q" ]; then _NOREADME="y" if [ ! "x${2}" == "x" ]; then TMPBASE=${2} fi else TMPBASE=${1} fi fi while [ -d ${TMPBASE}/${TMPNAME}${SUFFIX} ]; do SEQ=`dc -e "${SEQ} 1 + p"` if [ 10 -gt ${SEQ} ]; then SUFFIX="_0"${SEQ} else SUFFIX="_"${SEQ} fi done mkdir ${TMPBASE}/${TMPNAME}${SUFFIX} if [ $? -eq 0 ]; then if [ "x${TMPBASE}" == "x${PWD}" ]; then echo "\"${TMPNAME}${SUFFIX}\" is created." else echo "\"${TMPBASE}/${TMPNAME}${SUFFIX}\" is created." fi fi if [ "x${_NOREADME}" == "xy" ]; then exit fi README=${TMPBASE}/${TMPNAME}${SUFFIX}/README cat <<___END___> ${README} // Filename: README // Author: // Created: `date "+%Y-%m-%d %H:%M"` // Updated: `date "+%Y-%m-%d %H:%M"` // Description: about this directory // ////////////////////////////// ___END___ vi ${README}[ permalink ] [ 0 comment(s) ]- 000268
長らく,やろうと思っていながら先延ばしにしてしまっていた,ndtpd のセットアップを行いました.ndtp は Network Dictionary Transfer Protocol で,ネットワーク経由で辞書検索を行うためのプロトコルです.そのサーバが,ndtpd.この ndtpd を動かすためには,辞書ファイルを直接操作する EB ライブラリ が必要になります.
ここまで作業を終えると,telnet で辞書検索が行えるようになります.しかし,ndtp のコマンドがよく判らなかったので,ソースコードからコマンド一覧を起こしました.
でもさすがに,telnet で辞書検索は厳しいので,PHP の勉強を兼ねて,Web からの検索インタフェースを作ろうかと思います.
[ permalink ] [ 0 comment(s) ]- 000266
昨晩,ふと思い立って,VAIO 505R に Fedora core 1 をインストールしました.睡眠時間を削ってまですることなのかと,疑問に思わないでもないですが・・・.
思い立ったのは良いのですが,この VAIO には大きな問題がありまして,頂きもののため CD-ROM ドライブが付いていません.となると,ネットワーク経由でインストールする必要があります.ぼくの手元にある Ethernet 用の PCMCIA カードは Corega Ether II PCC-TD.ソケット一体型なので,使い勝手は良いのですが,fedora のインストールディスクはデフォルトでは対応していません.そこで,次のサイトを参考にして,インストールディスクに手を入れました.
[linux-users:84044] [報告]CoregaEther PCC-TD
CD-ROM のないノート PC に、Corega Ether PCC-TD から Vine 2.1 をインストールする方法このリンク先は Ether PCC-TD の話なので,厳密には型番が異なりますが,チップは一緒なのでいけるでしょう.
Corega Ether II PCC-TD 経由での Fedora core 1 インストールログ以上で,無事にセットアップ完了です.省電力サーバにでも仕立て上げようかなと思っています.
[2004-02-15 02:00] 追記インストールに使用した起動ディスクのイメージをアップしておきます.
bootdisk.img[ permalink ] [ 0 comment(s) ]- 000265
Windows Services for UNIX の機能を試すために,Linux 機を NFS サーバとしてセットアップしました.インストール自体はカーネルの再構築と rpm で済んでしまうので,設定周りについて書きます.
/etc/exports の編集
NFS 経由で公開したいディレクトリを設定します.詳細はこちら.NFS は,マウント先の uid/gid でファイル操作されるので,注意しましょう.特に no_root_squash を設定するのは,非常に危険です.リスクを充分に理解した上で運用してください.
mountd のポート
mountd はデフォルトではランダムにポートを開きます.パケットフィルタリングルールの記述が難しくなるため,固定ポートを開くように設定しました.
/etc/sysconfig/network に以下の行を追加
MOUNTD_PORT=801
VineLinux2.5 の場合は,さらに /etc/rc.d/init.d/nfs に記述ミスがあったため,それを修正します.(49行目から)
if [ -n "$MOUNTD_PORT" ]; then RPCMOUNTDOPTS="$RPCMOUNTDOPTS --port $MOUNTD_PORT" filockd のポート
lockd もランダムでポートを開きます.これはカーネルが直接起動しているため,カーネルパラメータで指定する必要があります.
image=/boot/vmlinuz-2.4.24-20040208 label=2.4.24 read-only root=/dev/hde5 append="lockd.udpport=802"# lilo
rquotad のポート
これだけは,どうやってもポートを指定できませんでした.今のところ必須というわけではないため,起動しないことにします.
# chmod -x /usr/sbin/rpc.rquotad
いよいよ起動
起動しましょう.
# /etc/rc.d/init.d/portmap start # /etc/rc.d/init.d/nfs start
この順番は大切です.必ず portmapper を先に起動しましょう.portmapper は,サービスのレジストリの役割を果たします.mountd , lockd などは起動時に portmapper にサービスを登録するため,nfs よりも portmapper が先に起動している必要があります.
サービスの状況は rpcinfo で確認することができます.
$ rpcinfo -p program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100005 1 udp 801 mountd 100005 1 tcp 801 mountd 100005 2 udp 801 mountd 100005 2 tcp 801 mountd 100005 3 udp 801 mountd 100005 3 tcp 801 mountd 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100021 1 udp 802 nlockmgr 100021 3 udp 802 nlockmgr 100021 4 udp 802 nlockmgr/etc/exports を編集した場合には
exportfs で変更を反映します.特に再起動等は必要ないようです.
# exportfs -r
[ permalink ] [ 0 comment(s) ]- 000262
Windows Services for UNIX は NFS クライアントの機能も提供するので,試そうと思ったのですが,我が家の Linux 機は nfs 無効でコンパイルしてありました.リコンパイルのついでに,バージョンを 2.4 系の最新である 2.4.24 に上げました.
作業のキモになる Configuration の部分を端折っているので,あまりログの意味はないかもしれませんが・・・.menuconfig で表示されるヘルプを手がかりに設定を行えば,何とかなるはずです.
[ permalink ] [ 0 comment(s) ]- 000259
自宅の SMTP サーバから ezweb.ne.jp 宛にメールを送ろうとすると,接続が拒否されるという問題が発生していました.しかも,キュー内にしばらく (数日間) とどまった後にエラーが返るため,ちょっと痛い状況です.調べてみたところ,ezweb の SMTP サーバがはじいている可能性が高そうです.
auの迷惑メール対策でメールが送れません。
EIMS1.3.1でezwebにのみ送信できないかなり前から知られていた問題なのですね.知らなかったぼくが悪いのかな・・・.
自宅 SMTP サーバで明示的に経路指定を行えば,解決しそうです.qmail で経路指定を行うための設定ファイルは smtproutes のようです.
今ちょっと出先なので,帰宅し次第試してみます.
[2004-02-06 02:25 追記]実際に試してみました./var/qmail/control/smtproutes に以下のように記述しました.
ezweb.ne.jp:<ISPのSMTPサーバ>
どうやらこれでうまくいったようです.
[2004-02-07 01:45 追記]keio.ac.jp にもはじかれてしまいました.もういっそと,こうしてしまいました.
:<ISPのSMTPサーバ>
自宅 SMTP サーバ,意味無し!
[ permalink ] [ 0 comment(s) ]- 000247
以前から入れようと思っていて先延ばしになっていた PHP をセットアップしました.
現在運用している apache2 が worker で動いているので,セットアップも多少注意が必要でした.セットアップだけではなく動作も不安といえば不安なのですが,特にクリティカルな用途でもないので,問題が起きてから対処したいと思います.(ファイルロックあたりが多少不安)
今後,複眼中心 に倣い,麦酒堂もインタフェースを php 化してゆく予定です.
[ permalink ] [ 15 comment(s) ]- 000242
未だに環境構築に手を焼いています.満足のゆく環境でないと気が散って仕事がはかどらない性分は,何とかならないものか・・・.
今度は Cygwin/X を試してみました.Windows 上で動くフリーの X Server です.だいぶん前にセットアップはしていたのだけれど,いかんせん TeraTerm さえあれば十分な使い方しかしていなかったので,忘れていました.
インストールの詳細な手順は,Cygwin/X の User's Guide を参照してください.ぼくがインストールしたころから,もしかしたら手順が多少変わっているかも知れませんが,基本的には "XFree86" というカテゴリを "Default" で入れれば良いはずです.
[2004-01-26] "Default" ではなく "Install" でした.起動するには /usr/X11R6/bin にある "startxwin.bat" というバッチファイルを走らせれば良いのですが,デフォルトであがる xterm はいらないのでちょっと編集しました.
[2004-01-25] レイアウトがあまりにひどいのでリンクにしましたコメント行などは省略しています.xterm を起動する行を消し,最後に xhost を追加しました.これにより,該当する IP アドレスからウィンドウを飛ばすことが出来るようになります.逆に xhost しないのであれば xterm は起動してあげたほうが良いです.面倒なので.
あとはこのバッチファイルを実行すれば,Cygwin/X サーバが起動します.タスクトレイにアイコンが現れるはずです.終了はこのアイコンからどうぞ.
以上を終えた上で,Linux box で次のように Tgif を走らせれば,Windows マシンに Tgif のウィンドウが表示されます."192.168.1.1" の部分は適宜変更してください.
$ DISPLAY=192.168.1.1:0 tgif &しかし,この Tgif は日本語入力,日本語のコピペなどが出来ませんでした・・・.そこまで調査する余裕はさすがになく,結局は tightVNC に逆戻りです.となると,ぼくがこれを使う可能性があるのは ethereal くらいだな・・・.
[ permalink ] [ 4 comment(s) ]- 000241
Tgif で図を書くと,*.obj で保存されます.しかし LaTeX で読み込むためには EPS 形式で出力しなければなりません. 編集している間なら Ctrl+P で良いのですが,なにかの理由で *.eps を消してしまうともう一度 Tgif で開いて出力しなおさなければなりません.これは面倒. そこで, make 一発で *.obj を *.eps に変換するための Makefile 記述例です.
OBJ_FILES=$(wildcard *.obj) EPS_FILES=$(addsuffix .eps , $(basename $(OBJ_FILES) ) ) .SUFFIXES: .obj .eps TGIF=tgif TGIF_OPT=-print -eps -one_file_per_page default: $(EPS_FILES) .obj.eps: $(TGIF) $(TGIF_OPT) $< clean: -rm -f *.eps
[2004-01-25] wildcard と -one_file_per_page を追加これで
$ make
とすれば *.obj ファイルのうち更新分を *.eps に変換してくれます.GNU Make version 3.79 , Tgif Version 4.1 (patchlevel 41) にて動作確認済みです.
[ permalink ] [ 8 comment(s) ]- 000240
論文を書き進めながら,並行して未だに Java を書いています.Java をいじるときは,普通は環境変数 CLASSPATH を設定するのだけれど,":" 区切りで一行に詰め込むため,
$ echo $CLASSPATH
とやっても非常に読みにくいです.そこで,.bash_profile などに以下のように記述しておきます.showClassPath () { echo $CLASSPATH | perl -pe 's/:/\n/g;' }これで,
$ showClassPath
とすると,":" を改行に置換して表示してくれるので,1行1Path になります.同様に $PATH にも応用可能.
[ permalink ] [ 0 comment(s) ]- 000237
ぼくの修論執筆環境は自宅のPC上に構築しているため,研究室にいるときも SSH で自宅にログインして作業しています.いままでは主に裏のロジック部分と Web のインタフェース部分のコーディングを行っていたため,TeraTerm + TTSSH と Mozilla があれば事足りていました.しかし,ここに来て,(やっと)実際に論文を書くことになり,さすがにこれまでの環境では厳しくなってまいりました.最初は *.dvi を WebDAV 経由で研究室の PC に持ってきて,dviout で開くという,かなりな荒業でしのいでいたのだけれど,もう無理.
というわけで,SSH port forwarding 経由で VNC を使うことにしました.が,重い.自宅で使っている分には平気だったのですが,研究室から使うには厳しめです.
そして見つけたのが tightVNC です.標準の VNC のプロトコルを拡張し,データの圧縮や認証経路の暗号化などを施したものです.下位互換性は確保されており,tightVNC のサーバに標準の VNC クライアントでつないでもきちんとつながります.特徴は ここ に簡単にまとめてあります.これは標準の VNC に比べるとかなり早く,しかもなぜか表示がとてもきれいになりました.理由は不明.
ただし,これらの恩恵を享受するためには,サーバ側も tightVNC を使わないといけない点には注意しましょう.サーバが標準の VNC のまま,クライアントだけ tightVNC を使っても,画質,速度ともに変化はありませんでした.Linux の場合は RPM が用意されているので,インストールは簡単です.もし標準の VNC をすでにインストールしてあった場合は
# rpm -e vnc-server
で先にアンインストールしましょう.パッケージ名が異なるため "-U" が効かず,ファイルの依存関係がぐちゃぐちゃになる恐れがあります.
# rpm -ivh tightvnc-server-1.2.9-1.i386.rpm
でインストール完了.次はサーバの起動だけれど,SSH port forwarding を用いる関係上,127.0.0.1 で聴いてくれれば十分です.
$ vncserver :0 -localhost
vncserver はデフォルトで 5900 + ディスプレイ番号 のポートで聴くので,
$ netstat -na | grep 5900
tcp 0 0 127.0.0.1:5900 0.0.0.0:* LISTEN
とすれば起動したかどうかを調べられます.次に,自宅 PC に TTSSH でログインします.
その上で [Setup] ==> [SSH Forwarding] ==> [Add]
で SSH Port Forwarding の設定画面を開き,
Forward local port : 5900
to remote machine : 127.0.0.1
port : 5900
と設定し,tightVNC のクライアントを起動します.サーバは "127.0.0.1:0" を指定.お好みで Option の設定などを行ってから接続します. Option では圧縮方式や JPEG の圧縮率などを指定できるのだけれど,目いっぱいまで圧縮率を上げてもたいして画質が落ちないので,いまは最大の 9 を使っています.
さらに Full Screen 表示にすると,デスクトップ画面が VNC に取って代わられたような感じになり,より使いやすくなります.Alt + TAB などは普通に効くので問題ありません.という感じで,ぼくの研究室 PC の必需品に tightVNC が加わりました.提出まであと7日!
[ permalink ] [ 0 comment(s) ]- 000236
gadget に教えていただきました.ありがとう.
qmailにバッファオーバーフローの脆弱性 - slashdot
なんと,あの qmail がです.今のところ回避策は見つかっていないようですが,とうとう 1.04 が出るのでしょうかね.セキュリティホールを見つけた人には,qmail の作者から賞金が出るという噂も耳にしたことがあるのだけれど,その行方も気になるところ.
ちなみに,このセキュリティホールがぼくのサーバに与える影響だけれど,うちで動いている qmail-smtpd は rcpthost で制限をかけているので, DATA を発行する前に拒否することはします.しかし,ぼくのドメイン宛の場合はまったく効果なし.困った・・・.しばらくはこのニュース追いかけておかないと,あぶないですな・・・.
いやぁ qmail にも穴はありましたなぁ.その枯れっぷりと堅さには定評があったのに.やはり,プログラムに完璧はありえないのでしょうかね.
[ permalink ] [ 3 comment(s) ]- 000232
YYYY-MM-DD[_XX]という形式の作業用ディレクトリを作るシェルスクリプトを書いてみました."_XX" は通し番号で,既存のディレクトリと重複しないように,ディレクトリ名の末尾に付与されます.
#!/bin/sh TMPBASE=${PWD} TMPNAME=`date +%Y-%m-%d` SEQ=0; SUFFIX= if [ ! "x${1}" == "x" ]; then TMPBASE=${1} fi while [ -d ${TMPBASE}/${TMPNAME}${SUFFIX} ]; do SEQ=`dc -e "${SEQ} 1 + p"` if [ 10 -gt ${SEQ} ]; then SUFFIX="_0"${SEQ} else SUFFIX="_"${SEQ} fi done mkdir ${TMPBASE}/${TMPNAME}${SUFFIX} if [ $? -eq 0 ]; then if [ "x${TMPBASE}" == "x${PWD}" ]; then echo "\"${TMPNAME}${SUFFIX}\" is created." else echo "\"${TMPBASE}/${TMPNAME}${SUFFIX}\" is created." fi fiスクリプトを組むちょっとの手間で,作業効率が大きく向上するのが,シェルスクリプトの良いところですな.
[ permalink ] [ 0 comment(s) ]- 000223
このコメントに関して,実際に実験してみました.
Proxy を使って,自宅に SoftEther 仮想 HUB を立てる実験です
結果は,見事に成功.プライベートアドレスを持った Win2000 サーバ上で動いている,SoftEther 仮想 HUB に Proxy 経由でつながりました.自宅の Win マシンを立ち上げっぱなしにすることを厭わなければ,研究室からでも快適な TeX 編集が可能かもしれません.(<-ここが自分の中での大義名分.)
SSL 対応 Proxy サーバの立ち上げ方法はこちらをどうぞ.
mod_proxy のセットアップログ
[ permalink ] [ 1 comment(s) ]- 000219
ぼくは,出先で自宅に届いたメールを確認したい,なんてことが結構頻繁にあります.
今までは apache + mod_ssl で直接 Maildir をのぞいていたのだけれど,当然使い勝手は悪く,しかも閲覧のみしか行えず,返信などは不可能でした.そこで,フリーのWebMailシステムを導入してみました.
Maildir をローカルで直接のぞく WebMail システムです.
ここで試すことが出来ます.
webmail@webmail.com/webmail でログインが可能.セットアップログはこちらになります.
まだ自宅からしか試していないけれど,とても快適です.返信,転送,ファイル添付も可能で,YahooMail などと較べても遜色ありません.From を変更することも可能だったり,こちらのほうが優っている点もいくつかあります.
まぁ,自由度という点では,電信八号には遠く及びませんが,Web 経由でそこまで求めても仕方がないですね.
[ permalink ] [ 4 comment(s) ]- 000208
これまでは apache1.3 の上で Movabletype を動かしていたのですが,今日から apache2.0 に移行しました.
その作業ログです.apache2.0
mod_ssl
WebDAV
mod_jk2これらのログは,正確には昨日行った443番 (SSL) の移行作業のものなので,パスなどの細かな点は異なりますが,手順はほぼこのとおりです.また,mod_ssl , WebDAV は80 番では動いていませんが,参考資料ということで,リンクを張っておきます.
本当は mod_jk2 を使っての oc4j との連携も試そうと思ったのですが,必須というわけではないので割愛しました.mod_jk2 も mod_jk と変わらず,ajp13 を話すので,恐らく問題なくつながるのではないかと,思ってはいます.
移行を終えての感想は,インストールや設定のレベルでは,apache1.3 との大きな違いはありませんでした.ただ,設定ファイルやディレクティブが整理されていたり,mod_ssl が取り込まれていたりと,細かなところで楽になっている印象です.本当は MPM なんてのも良さそうではあるのですが,いかんせん,それほどスケーラビリティを要求するような使い方をしていないので,あまり恩恵がありませんなぁ.でも一応 80番は worker で動かしています.
それと,mod_jk2 についての情報が Web 上にあまりなく,とりあえず動いていることは動いているけれど・・・という感じです.カウンタがおかしかったりしたら,お知らせください.
(いまのところ mod_jk2 を通るのはカウンタだけです.)
[ permalink ] [ 5 comment(s) ]- 000201
ぼくはテキスト編集には vi をメインに使っていて,
^Z などを良く使います.
また,シェルでは pushd/popd なども多用します.
su を使って他ユーザになることも管理上必須です.これらは非常に便利ではあるのですが,
何回使ったかが判らなくなることが,間々あります.
こうなると,popd しても "空っぽよ" と怒られたり,
^Z の状態なのにそれを忘れてシェルから抜けてしまったり,
いろいろと問題が出てきます.dirs , jobs , ps などで調べられなくもないのですが,
それはそれで面倒です.
そこで,プロンプトに常に表示させることにしました.まず,background jobs の表示は bash-2.04 の
標準機能で可能でした.
\j次に,directory stack は標準では無理だったので,
スクリプトを組むことにしました.
dirs の出力を wc で数えればよいのですが,
pushd しなくてもカレントディレクトリが積まれてしまっています.
そこで,dc で 1 を引くことにしました.
echo `dirs -p | wc -l ` 1 - p | dc最後の,シェルの呼び出し回数がなかなか厄介で,
ps でとろうにもうまくゆきません.
そこで,vine2.5 のデフォルトでは ~/.bashrc から
/etc/bashrc を常に読むことを利用して,
/etc/bashrc に以下の行を追加しました.
BASHNESTDEPTH=`echo ${BASHNESTDEPTH:-_1} 1 + p | dc`
export BASHNESTDEPTH以上の下調べ & 準備を終えて,最終的にプロンプトを変更します.
~/.bashrc に以下の行を追加します.
PS1='[\u@\h \j:\
`echo \`dirs -p | wc -l \` 1 - p | dc`:\
`echo ${BASHNESTDEPTH:--}` \w]\$ '表示はこんな感じ.
[miz@linux 0:0:0 ~]$ su
[root@linux 0:0:1 /home/miz]# vi test
^Z
[root@linux 1:0:1 /home/miz]# pushd ~
[root@linux 1:1:1 ~]# fg
:q
[root@linux 0:1:1 ~]# popd
[root@linux 0:0:1 /home/miz]# ^D
[miz@linux 0:0:0 ~]$使い勝手はなかなか良いです.
ただし,"su -" してしまうと,
シェルの起動数は正しく機能しないようです.
これは,いかんともしがたい・・・.[ permalink ] [ 2 comment(s) ]- 000184
というわけで,自前サーバをメールサーバに仕立てました. 以前から qmail は入っていて,MDA としては使っていたのですが,これからは MTA としての機能も活用してゆきます.
[できるようになったこと]- 自前ドメインへのメールを手元で一括管理
- PHS への転送
- Web メールへの転送
[問題点]- IPアドレスが変わったときに,DDNS に反映されるまではメールが届かない
- サーバが停止している間はメールが届かない
[手順]
大きく3つにわかれます.- qmail の設定見直し
- tcprules の設定見直し
- 転送設定
参考にしたのはこのサイト.
- qmail の設定見直し
インストール自体はすでに終わっていたので省略./var/qmail/control/ 以下の設定を書きます.
- me
これは必須です.
mizba.net - plusdomain , defaultdomain
これらを設定すると,メール送信時に宛先のドメインを省略できます.でも,mizba.net にメールを送ることはないなぁ.
mizba.net - me
- locals
このファイルに含まれるドメインが宛先になっているメールは,ユーザがこのサーバに存在するとみなしてローカル配信します.
localhost mizba.net
- rcpthost
これはとても大事.SMTP で外から入ってくるメールの宛先 (正確にはRCPT) がここに含まれない場合は拒否します.ここでは,ローカル配信するもののみを書きます.さもないと,不正中継の踏み台にされます.ただ,このままだと,他のドメインへメールが送れないので,次の 02. tcprules の設定見直し を行ってください.
localhost mizba.net
- tcprules の設定見直し
自前サーバの qmail は,tcpserver を利用しています.これの設定次第で,特定のクライアントから送られてきたメールは,宛先 (RCPT) に関わらず中継するように設定できます.セットアップの詳細は省きますが,特定のクライアントからの接続には, RELAYCLIENT という環境変数を設定すれば,qmail は中継してくれます.
/etc/tcprules/smtp.rules127.0.0.1:allow,RELAYCLIENT="" 192.168.100.:allow,RELAYCLIENT="" :allow
という感じでファイルを用意して,
# tcprules smtp.cdb smtp.tmp < smtp.rulesと,形式変換をします.
- 転送設定
~alias/ 以下に, .qmail ファイルを作成することで,転送設定を行えます. ここを参考にしてください.
".qmail-default" というファイルは,システムデフォルトの転送先を指定します. 存在しないアカウント宛のメールは,すべてこの処理対象です. 例えば,"hoge@mizba.net" というアカウントを,"hogehoge@hogehoge.net" に転送したい場合は,~alias/.qmail-hoge というファイル内に,
hogehoge@hogehoge.netと,一行記述します.
以上のような感じで,設定完了です. あ,F/W の設定にも注意.
これで,masurai とお互いに backup mx に設定すれば,上記の問題点も,ある程度解消されるはずです. ただ,backup mx 用の設定も必要ですね.
[ permalink ] [ 1 comment(s) ]- 000183
いやに安かったので,ドメインを取得してみました.
mizba.net
レジストラはここです.
Value-Domain.com
年間 $9 です.日本円で1000円強.
安すぎて,逆に不安を感じたりもしましたが,
まぁ,1000円程度なら,損しても良いかなと思って,
思い切って取得しました.
ドメインの移管も自由に行えるようなので,
不満があったら,どこかに移ればいいし.ここ,値段もさることながら,
ネームサーバの設定を自分で自由に行える点や,
メール転送が無料で使える点なども,
なかなかポイントが高かったです.
NS レコードが使えると,さらに良かったのだけれど,
この値段で,贅沢言ってはいけませんね.ここは,外部のネームサーバを使用することもできるので,
手元のサーバで BIND なりを立ててあげれば,
好き勝手できます.
しかし,手元のサーバではアベイラビリティに不安があるので,
EveryDNS.net の使用も検討しました.
ここであれば,NS レコードも使えるので,
かなり自由度が高まります.
サブドメインを切ってやって,
そこは手元のサーバで管理,なども可能.でも,そこまで設定する時間がとれないので,
現在は,DynDNS.org の Dynamic DNS で
もともと運用していた turu.mine.nu を
CNAME に指定しています.
この方法なら,手元のサーバの設定をいじらずに,
独自ドメインで Dynamic DNS を使えています.
Value-Domain.com にも,
Dynamic DNS の機能はあるみたいだけれど,
更新スクリプトがいまいちだし,どうもうまく動かないようなので,
CNAME を使った方法をお勧めします.そうは言っても,本当は固定IPをとるのが良いとは思います.
それは,いずれ・・・.[ permalink ] [ 10 comment(s) ]- 000167
久し振りに,サーバをガシガシいじり,
そして,めでたく,新 HDD への移行が完了しました.
なんとか,初期不良保証期間内.よかったよかった.本当は,OS から入れ直すつもりだったのだけれど,
手間を考えて今回は断念.
ただ単純にシステム丸ごと,
新 HDD にコピーするだけで済ませました.
その割に,丸二日もかかったのだけれど・・・.サーバダウン中も,
httpd を止めたくなかったことと,
Web 閲覧は行いたかったため,
古いノートPCを引っ張り出して,
PC9821nb10 + FreeBSD4.9R で
nat box + web server に仕立て上げました.
これに時間がかかった・・・.それが終わってから,今度はディスクの移行.
これも,lilo 周りで何かと紆余曲折がありましたが,
何とか完了.
一時は起動しない恐れもあっただけに,
無事終わってほっとしています.
作業を行うにあたって,
有用だったページを貼っておきます.LILO 周りの設定方法
HDD の交換と環境移行 (Linux)ブート用FDの作成方法
フロッピーディスクの扱い方ファイルシステム
ext3 ファイルシステムへの変換ファイルのコピー
Linux Tips
[ permalink ] [ 0 comment(s) ] - 001206



