2009年6月25日木曜日

FreeBSD でサーバ構築 #14 リレー設定

林檎生活100: FreeBSD でサーバ構築 #13 ドメイン名のメールの受信の続き.今回は,メールクライアントからこのメールサーバをメール送信サーバ(SMTP サーバ)として使用できるように,リレーの設定をする.(次回説明する SMTP-AUTH を使用する場合は,今回の設定は必要ない.)

さて,メールクライアントからメール送信サーバとして使用できるようにするにはどうすればいいのか.逆に言えば,なぜメール送信サーバとして使用できないのかをまず考えよう.

SMTP サーバは,メールを受け取ると基本的には次の2つの処理をする.

1. ローカル配信
2. 転送(リレー)

1のローカル配信は,自ホスト宛のメールということで,どこから送られてきても基本的には受信してローカル配信をする.(メールアドレスさえ知っていれば,誰からのメールでもとりあえず届くよね.)2の転送は,自ホスト宛ではないメールを MX レコードを引いたりして,別のメールサーバに転送するということだ.これをどこから送られてきても処理していたら,問題になってしまうので,転送は制限されている.それゆえ,デフォルトでは,メールクライアントからメール送信サーバとして扱えないようになっている.

なぜ問題になるのか.それは,スパムメールの中継サーバに悪用される可能性があるからだ.(悪用される可能性と書いたけど,誰からのメールでも転送する(オープンリレー)状態で放置しておいたら,スパムを転送しようとしてオープンリレーのサーバを探しているクローラに発見されて悪用される.)なので,FreeBSD の Sendmail では,localhost 以外からのメールを転送はしないようにリレー設定されている.

では,ある特定のホストやユーザからのメールを転送するように設定しようと思う.普通に考えれば,ユーザ認証すればいいんじゃない?と思うところだけど,SMTP はスパムメールという概念すらなかったころの古いプロトコルなのでユーザ認証の仕組みがないんだよね.(ユーザ認証が使えるようにする設定は,次回やろうと思ってはいるんだけどね.)なので今回は,メールは自宅からしか使わないことを前提に,LAN 内のホストからの転送を許可するように設定してみる.

1. /etc/mail/access の変更
リレーを許可するホストを指定するには,/etc/mail/access ファイルに次のような行を追加する.これは,接続したホストの IP アドレスが 192.168.1.xxx であればリレーを許可するというものだ.LAN 内のホストの IP アドレスが 192.168.1.xxx である場合は,この設定でメールクライアントからメール送信サーバとして扱えるようになる.
Connect:192.168.1       RELAY

2. アクセスデータベースを再構築する.
# cd /etc/mail
# make maps

以上で設定完了だ.メールクライアントにこのメールサーバを設定するとリレーが可能になっているはずだ.今回は SMTP サーバと会話してみよう.(ちょくせつ SMTP コマンドを発行するということ.)Mac OS X などサーバではないクライアントから次のようにコマンドを打ってみよう.(適宜ホスト名などは,自分の環境に置き換えてほしい.)
$ telnet 接続先ホスト IP smtp
Trying 接続先ホスト IP...
Connected to 接続先ホスト IP.
Escape character is '^]'.
220 接続先ホスト名 ESMTP Sendmail 8.14.3/8.14.3; Fri, 26 Jun 2009 08:38:17 +0900 (JST)
HELO 接続元ホスト名
250 接続先ホスト名 Hello [接続元ホスト IP], pleased to meet you
MAIL From: 送信元メールアドレス
250 2.1.0 送信元メールアドレス... Sender ok
RCPT To: 送信先メールアドレス
250 2.1.5 送信先メールアドレス... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
To: 送信先メールアドレス
Subject: This is test mail.
This is test mail from Mac OS X.
.
250 2.0.0 n5PNcHsY002853 Message accepted for delivery
QUIT
221 2.0.0 lucifer.legna.org closing connection
Connection closed by foreign host.
$

接続元ホスト IP:192.168.1.7
接続先ホスト IP:192.168.1.255
接続元ホスト名:michael.legna.org(適当で OK.)
接続先ホスト名:lucifer.legna.org
送信元メールアドレス:takuya__at__legna.org
送信先メールアドレス:example__at__example.com

というかんじだ.送信できることを確認してほしい.時間があれば,access の内容を書き換えて実験してみてほしい.また,WAN 側から悪用されるようなリレーが働いていないかどうか,次のサイトにアクセスして調べてみよう.Address to test: の項目に接続先ホスト名 (lucifer.legna.org) を入力し,Test for relay をクリックするだけだ.出力の最後に Relay test result の項があり,All tests performed, no relays accepted. となっていれば WAN 側から悪用されることはないはずだ.

Abuse.net: Mail relay testing



というかんじ.リレーの話を理解してもらえたかな.SMTP がシンプルゆえの設定というかんじ.次回は,Sendmail に SMTP 認証する機能を付加したいと思う.いくつかインストールしなければならないプログラムがあるし,Sendmail をリビリルドしなきゃならないし,かなり面倒くさいかんじなんだよなぁ…….まあ,LAN 内からしか使わないっていう人は,次の回の設定はいらないね.

参考文献:
sendmail 第3版〈VOLUME1〉運用編
sendmail 第3版〈VOLUME2〉設定編
sendmailクックブック―設定と運用のためのレシピ集

FreeBSD でサーバ構築 #13 ドメイン名のメールの受信

林檎生活100: FreeBSD でサーバ構築 #12 メールの受信の続き.今回は,ホスト名 (takuya__at__lucifer.legna.org) ではなく,ドメイン名 (takuya__at__legna.org) のメールを受信できるように設定しよう.

まず何をやらなければならないかを考える.変わったのはメールアドレスのホスト名をドメイン名だけにしたことだ.つまり,ドメイン名 (legna.org) からメールサーバのホスト名 (lucifer.legna.org) を引けるようになる必要がある.つまり,MX レコードにこれを設定する必要がある.そして,Sendmail は,rc.conf に設定されているホスト名 (hostname="lucifer.legna.org") のメールをローカル配信するものとして処理するが,ドメイン名 (legna.org) のメールをローカル配信するものとしては処理しない.よって,ドメイン名のメールをローカル配信するものとしては処理するように設定する必要がある.

それでは,この2点について設定していこう.

1. MX レコードの記述
MX レコードの記述は,次のようにそのまま書ける.(起点名が legna.org だから省略して空白になる.)シリアル番号を増加させることと,named を再起動させることを忘れないように.
          MX 10 lucifer.legna.org.

2. ローカル配信するメールのホスト名の設定
/etc/mail/local-host-names というファイルに,次の内容を記述し,Sendmail を再起動する.このファイルに記述されたホスト名宛のメールについては,ローカル配信するものとして処理するようになる.
legna.org

設定はこれだけ.これで,takuya__at__legna.org というメールアドレスのメールを受信できるようになるので,実際にメールを送って試してみてね.

ローカル配信するメールのホスト名の設定にはいくつか方法があるのだけど,今回は,設定ファイルをビルドする必要がなく,Sendmail を再起動するだけで実現できるこの方法をとることにした.僕としては,この方法がオススメ.

さて,次回は,メールクライアント(Max OS X の Mail や Thunderbird など.) から送信サーバ(SMTP サーバ)として扱えるように設定する.その際に,メールのリレーについての話もする予定.お楽しみに♪

参考文献:
sendmail 第3版〈VOLUME1〉運用編
sendmail 第3版〈VOLUME2〉設定編
sendmailクックブック―設定と運用のためのレシピ集

2009年6月24日水曜日

C 言語の話#4 リスト

リストを林檎生活100: C 言語の話#3 オブジェクト指向プログラミング?のように実装.まあ,スタック的操作しか実装してないけどwイテレータもやればできるもんだね.
/* main.c */
#include <stdio.h>
#include <string.h>
#include "book.h"
#include "list.h"

int main(void)
{
List *books;
Book *book;
Iterator *it;

books = newList();

books->push(books, newBook("伝奇集", "J.L. ボルヘス"));
books->push(books, newBook("ぼく、オタリーマン。", "よしたに"));
books->push(books, newBook("ブタのいどころ", "小泉吉宏"));

it = newIterator(books);
while (it->hasNext(it)) {
book = it->next(it);
printf("%s\t%s\n", book->getTitle(book), book->getAuthor(book));
}
deleteIterator(it);

while ((book = books->pop(books)) != NULL)
deleteBook(book);

deleteList(books);

return 0;
}
/* list.h */
#ifndef __LIST_H__
#define __LIST_H__

typedef struct _List List;
typedef struct _Iterator Iterator;
typedef struct _Element Element;

struct _List {
Element *first;
int ((*push)(List *list, void *data));
void *((*pop)(List *list));
};

struct _Iterator {
Element *e;
int ((*hasNext)(const Iterator *it));
void *((*next)(Iterator *it));
};

List *newList(void);
void deleteList(List *list);

Iterator *newIterator(List *list);
void deleteIterator(Iterator *it);

#endif /* __LIST_H__ */
/* list.c */
#include
#include
#include "list.h"

struct _Element {
Element *next;
void *data;
};

int list_push(List *list, void *data);
void *list_pop(List *list);

int iterator_hasNext(const Iterator *it);
void *iterator_next(Iterator *it);

Element *newElement(Element *e, void *data);
void deleteElement(Element *e);

List *newList(void)
{
List *list;

list = (List *)malloc(sizeof(List));
if (list == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

list->first = NULL;

list->push = list_push;
list->pop = list_pop;

return list;
}

void deleteList(List *list)
{
free(list);
}

int list_push(List *list, void *data)
{
Element *e;

e = newElement(list->first, data);
if (e == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return -1;
}

list->first = e;

return 0;
}

void *list_pop(List *list)
{
Element *e;
void *data;

if (list->first == NULL)
return NULL;

e = list->first;
data = e->data;
list->first = e->next;

deleteElement(e);

return data;
}

Iterator *newIterator(List *list)
{
Iterator *it;

it = (Iterator *)malloc(sizeof(Iterator));
if (it == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

it->e = list->first;

it->hasNext = iterator_hasNext;
it->next = iterator_next;

return it;
}

void deleteIterator(Iterator *it)
{
free(it);
}

int iterator_hasNext(const Iterator *it)
{
return it->e != NULL ? 1 : 0;
}

void *iterator_next(Iterator *it)
{
void *data;

if (!iterator_hasNext(it))
return NULL;

data = it->e->data;
it->e = it->e->next;

return data;
}

Element *newElement(Element *next, void *data)
{
Element *e;

e = (Element *)malloc(sizeof(Element));
if (e == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

e->next = next;
e->data = data;

return e;
}

void deleteElement(Element *e)
{
free(e);
}

2009年6月23日火曜日

Mac OS X の Vim 文字コード

Vim ユーザといいながらも,文字コードまわりを理解していなかった(ダメ

Peace Pipe: Mac 環境構築 その6 - vim の文字コード設定 [mac]

このページが非常に参考になった.

EMOBILE + Interlink マイ IP サービス

FreeBSD でこれを実現すれば,回線引かなくてもサーバ立ち上げることができそう.

今年度中に実験したいなぁ.

参考文献:
EMOBILE
Interlink: マイ IP サービス

2009年6月22日月曜日

FreeBSD でサーバ構築 #12 メールの受信

林檎生活100: FreeBSD でサーバ構築 #11 メールコマンド mailの続き.今回は,メールを受信できるように設定しよう.

メールを受信するということは,どういう仕組みで動作しているのかを簡単に説明しよう.takuya__at__lucifer.legna.org(メールアドレスをボットに拾われるのが嫌なので,@ を __at__ で表記する.これってどのくらい効果があるんだろう?)というメールアドレスにメールを送信する場合,次のような手順で処理される.(厳密な手順ではないんだけど,だいたいあってるはずw)

1. lucifer.legna.org の MX レコードをネームサーバに問い合わせ,転送先メールサーバにメールを転送する.(MX の前はメールアドレスに置けるホスト名に対応し,MX の後はそのメールアドレスのメールを転送すべきサーバのホスト名に対応する.)
lucifer   MX 10 lucifer.legna.org.

2. メールサーバ (lucifer.legna.org) は,メールアドレスのホスト名 lucifer.legna.org のメールを受け取ることになっている場合受け取る.(MX レコードだけであれば,偽装が可能なのでサーバ側でもチェックする.)

3. メールアドレスのユーザ名 (takuya) を参照し,ユーザのメールボックスに配送する.

いろいろ細かいところを端折るとこんなかんじ.このことから,MX レコードを設定し,サーバへ接続できるようにポートを開放し,メールサーバがメールアドレスのホスト名が lucifer.legna.org であるメールを受け取るようにすればいい.

あと,忘れてはならないのがメールサーバを起動すること.正確には,メールサーバが 127.0.0.1 のインタフェースからしか接続を許可しない設定で起動するようになっているので,その限定を解除して起動させるということだ.

1. MX レコードの記述
lucifer   MX 10 lucifer.legna.org.

がネームサーバに記述されていることを確認する.記述されていなかったら記述する.

2. 受信ホスト名設定
Sendmail は,設定されているホスト名宛のメールを受信するので,それが設定されていれば設定は必要ない.もし設定されていなければ,rc.conf の hostname に設定するだけ.

3. Sendmail の起動
rc.conf に次の行を記述する.
sendmail_enable="YES"

FreeBSD を再起動するか,次のコマンドを入力する.
# /etc/rc.d/sendmail restart


4. ポート開放
SMTP は TCP 25番ポートなので,グローバル IP 25番への接続をサーバのプライベート IP 25番への接続に変換する.ネームサーバの設定でやったのと同じ.


ここまで設定したら,それぞれの項目の設定が正しいかチェックしよう.

1. MX レコードの記述
次のコマンドを入力する.
$ nslookup -type=mx lucifer.legna.org

出力にこのような行があれば OK.
lucifer.legna.org mail exchanger = 10 lucifer.legna.org.


2. 受信ホスト名設定
次のコマンドを入力する.
$ hostname

出力にこのような行があれば OK.
lucifer.legna.org


3. Sendmail の起動
次のコマンドを入力する.
# /etc/rc.d/sendmail status

出力にこのような行があれば OK.
sendmail is running as pid 710.


4. ポート開放
次のページに,ホスト名 (lucifer.legna.org) とポート番号 (25) を入力し,ポートチェックをクリック.
CMAN: ポートチェック

ここまでチェックが完了したら,Gmail などからメールを送ってみよう.そうするとユーザのメールボックスにメールが届くはずだ.全解説明した mail コマンドで確認してほしい.

今回はここまで.Sendmail の設定といっても,Sendmail はデフォルトのままでネームサーバの設定などだけだったけどねwほとんどデフォルトでもメールって動くんだなぁと僕も感心してしまった.次回は.takuya__at__lucifer.legna.org ではなく,よくある takuya__at__legna.org というドメイン名だけのメールを受信できるように設定する.

参考文献:
sendmail 第3版〈VOLUME1〉運用編
sendmail 第3版〈VOLUME2〉設定編
sendmailクックブック―設定と運用のためのレシピ集

2009年6月21日日曜日

FreeBSD でサーバ構築 #11 メールコマンド mail

林檎生活100: FreeBSD でサーバ構築 #10 ポートマッピングとゾーン転送の続き.今回からは,Sendmail 編に入るんだけど,今回は Sendmail の話はせずにメールコマンドについて話したいと思う.メールコマンドはメールの送受信の確認のために使うからね.ちなみに,ここまで書くのに1年かかってるwwwApache 編を書き終えるまでに何年かかるんだろうwまあ,そんなに廃れない知識だと思うので,無駄にはならないはずだけどね.

ではさっそくメールを送ってみたいと思う.実は,FreeBSD をインストールしただけで,デフォルトのメールサーバである Sendmail は機能を限定して動作している.なので,ローカルのユーザ間でのメール送受信はもちろんできるし,インターネットへの接続がきちんと設定されていれば,外部のメールアドレスへのメール送信ができてしまうのだ.外部のメールアドレスへメール送信ができるのがなぜかについては,Sendmail の設定をするあたりで説明をしようと思うので,今回は送信できるんだなぁと思っておいてもらえれば OK.

では,適当なメールアドレスにメールを送る.次のようにコマンドを入力する.
$ mail  メールアドレス

そうすると,このような画面になると思う.


件名を入力して,Enter を押す.


次に本分を入力して,行頭で ctrl+D を入力することで送信される.EOT と出力されると思うが,それは End Of Transmission(転送終了)の意味なのだ.


僕は Gmail のアドレスに送付してみた.メールサーバによっては,スパムとしてはじかれる可能性があるので,届かない場合はメールアドレスを変えて試してほしい.(それでも届かない場合は,プロバイダ側で SMTP で使用する 25 番ポートを塞いでいる可能性がある.このことについては,参考文献を参照のこと.)

次に,自分自身にメールを送ってみる.これは,ローカルで動作している Sendmail を経由して,自分のメールボックスにメールを送るということだ.このような感じで送ってみる.(メールアドレスは,ユーザ名だけでも,ユーザ名@localhost でも,ユーザ名@自ホスト名でもいい.)


これで,自分宛にメールが送信されたはずだ.では,メールが届いてるかチェックしてみよう.ここからが,ちょっと癖のある mail コマンドの操作になるのでついてきてほしい.まず,引数なしで,mail とだけ打って実行しよう.
$ mail

そうすると,こんな画面になるはずだ.


1行目にバージョン情報など(1993年6月6日のバージョン!)が表示され,2行目に /var/mail/takuya にメッセージが1通あり,そのうち1通が新着ということが表示されている.3行目からは,メールボックスに入っているメール一覧が表示される.それが終わったあとに,mail プログラム用のコマンド入力を受け付ける状態になる.メールを見るために enter を押してみよう.


このように新着メールの内容が表示されたはずだ.何も入力せずに enter を入力すると,1番上の新着メールを表示することになる.新着メールが2通以上あるときは,enter を押していくだけで,上から順にメールを参照することができる.さて,h と入力してみよう.


このような画面になったはずだ.起動時に表示されたメール一覧が表示される.メールの先頭にあった N マーク,つまり新着を表す印がなくなっていることには注目してほしい.この状態で enter を押しても,そのメールを参照することはできない.もう1回そのメールを見たいときには,メールの先頭についている番号を入力する必要がある.1 と入力してみよう.


さっきと同じような画面が出力されたはずだ.こうやってメールを参照すればいい.より詳細なメールの情報がほしくて,メールヘッダを表示したいときには,P 1 と入力する.


そうすると,このようにメールヘッダの情報をすべて表示してくれる.終了させるときは,q を入力すればいい.


mbox にメッセージ1通を保存しましたと出力されることに注意してほしい.読んだメールは,システムのメールボックスから,ホームディレクトリにあるメールボックス (~/mbox) に保存されるようになっているのだ.なので,mail をもう1回実行してみてほしい.


そうすると,このようなメッセージが出力されて,保存したメールを見ることができない.こうなるのは,メールボックスからホームディレクトリの mbox にメールが移動したからだ.郵便局 (/var/mail/takuya) にあったメールが,自宅に転送されて読み終わったので,自宅のメールボックス (~/mbox) に保存したというように考えてもらうといいと思う.自宅のメールボックスのメールを見るためには,mail コマンドを次のように実行する.
$ mail -f ~/mbox

そうすると,このようなさっき見た画面を見ることができるはずだ.


こんなかんじで,mail コマンドの使い方を説明した.これから Sendmail の設定をやっていく上で,たぶん役に立つはずだwもっとちゃんと mail コマンドを使ってみたいという人は,参考文献にあげた mail コマンドの man の日本語翻訳を参考にしてほしい.次回は,Sendmail を設定して,今回 FreeBSD から送信した外部のメールアドレスから逆にメールを送信し,FreeBSD でメールを受信できるようにしたいと思う.たぶん,mail コマンドより理解しやすいと思うのでお楽しみにwww

参考文献:
FreeBSD 日本語マニュアル検索: On-line Manual of "mail"
Wikipedia: Outbound Port 25 Blocking

追記(2009年7月2日):
メールを保存するコマンド.
& s メール番号 ファイル名

2009年6月20日土曜日

メールの仕組み

メールの仕組みということで,メールがどうやって送受信されているのかについて説明する.

PC でメールを使用したことがある人は,メールクライアント(Mac OS X の Mail や Thuderbird など.)に SMTP (Simple Mail Transfer Protocol) サーバと POP (Post Office Protocol) サーバか IMAP (Internet Message Access Protocol) サーバを設定したことがあると思う.それらが正しく設定されていれば,メールは無事に使えるようになったんじゃないかな.こうやって設定した項目が,メールの仕組みを実現する上でどのように動作しているのかを説明していく.

まず,メールのもっとも根幹を担っている SMTP について.Simple Mail Transfer Protocol の名前のとおり,単純にメールを転送するプロトコルだ.太郎 (taro@aaa.com) が花子 (hanako@bbb.com) にメールを送る場合,この図のような流れになる.


1. メール転送
太郎がメールを送ると太郎のメールクライアントは,設定されている太郎のメールサーバ (mail.aaa.com) に花子宛のメールを転送していいか確認し,OK であればメールを転送する.

2. 転送先を調べる
太郎のメールサーバは,花子宛のメールを転送するサーバを調べる必要がある.それは,メールアドレスのドメイン部分(bbb.com) について,ネームサーバの MX レコードを対象として問い合わせることで実現する.この問い合わせによって,花子宛のメールは,花子のメールサーバ (mail.bbb.com) に転送すればいいことがわかる.

3. メール転送
太郎のメールサーバは,花子のメールサーバに花子宛のメールを転送していいか確認し,OK であればメールを転送する.花子のメールサーバは,花子宛のメールを保存するメールボックスがローカルにあるので,そのメールボックスに配送する.

というような流れ.1と3で行っていることが同じってことがわかるかな.メールサーバにこのメール受け取って処理くれる?って聞いて,OK ならメールを転送しているだけ.あとは,メールサーバが別のメールサーバに転送するなり,ローカルのメールボックスに配送するなりを選択しているのだ.2は別のメールサーバに転送するときに転送先サーバを決める重要な作業で,転送先はネームサーバの MX レコードによって決まる.

さて,お気づきのことと思うけど,花子のメールサーバと花子の間に矢印がない.そう,SMTP がサポートするのはここまでなのだ.メールサーバが動いてるサーバのメールボックスまではメールが届くけど,そのメールボックスのメールを普通のユーザは見ることができない.(逆に言えば,PC 上でメールサーバが動いているという稀有な人は,SMTP だけでメールの送受信ができるんだけどね.)

それで登場するのが,POP と IMAP なのだ.


POP はメールサーバのメールボックスからメールを取得するプロトコルで,IMAP はメールサーバのメールボックスを操作するプロトコル.POP はメールをダウンロードして持ってくるだけだから,複数の PC でメールを管理するのには向かない.IMAP はサーバ上にあるメールを参照したり操作したりするから,複数の PC でメールを管理するのには向いている.だけど,サーバに接続しないとメールが見れないので,常時接続じゃないと辛い.というかんじで,それぞれ特徴がある.

今回は,すごく簡単にメールの仕組みを説明した.より具体的な仕組みについては,メールサーバを構築する課程で説明していく予定.まあ,だんだんとわかるようになると思うよ.

参考文献:
sendmail 第3版〈VOLUME1〉運用編

2009年6月19日金曜日

MacBook の DVD ドライブ (UJ-857D) をリージョンフリーにする方法

Top Gear にはまって,リスニングもできないのに Top Gear の DVD を買ってしまったwww買ったのはいいんだけど,リージョンのことをすっかり忘れていたので,今回のエントリのようなことになった.

リージョンフリーってグレーなのかなぁと思ってたけど,法律的には問題なしみたいだね.ただ,保証とかそこらへんがなくなりそうだなぁ…….ちゃんと確認してはいないけど.とりあえず,うちの MacBook (Late 2006) の DVD-RW ドライブ (MATSUSHITA DVD-R UJ-857D) をリージョンフリーにしてみたので,その方法を書いとく.

※この方法を実行して何か不利益を被ったとしても一切保証はしません.

1. Mac OS X Tiger から起動する.
ファームウェアの書き込みツールが Tiger じゃないと動かないため.僕は,外付けドライブに Tiger をインストールして作業した.

2. ファームウェアのリビジョンを調べる.
システムプロファイラを起動して,ディスク作成の項目からファームウェアのリビジョンを調べられる.


3. リージョンフリーにするファームウェアをダウンロードする.
次のページの下の方にある表になっているところを参照し,使用している Mac の名前とドライブ名とファームウェアのリビジョンを確認して,対象となるファームウェアをダウンロードする.デフォルト版とリージョンフリー版が別れているが,結局リンク先のファイルは同じで,両方のバージョンのファームウェアが入っているので,片方をダウンロードすれば問題ない.

MacBook-fr: Region Free

4. ダウンロードしたファイルを解凍する.


5. リージョンフリー版(この場合は Update KBVB to region free の方.)ファームウェアアップデータを実行する.


6. 再起動する.


7. 普段の環境(Mac OS X Leopard な環境だな.)に戻り,Region X というツールでリージョンを変更して DVD を鑑賞する.

というかんじ.Max OS X Tiger の環境が懐かしく感じるなぁ.本当にリージョンフリー化されてるのって人は,DVD Info X というソフトウェアでチェックしてみるといいよ.標準版のファームウェアにも戻せるので,戻したくなったらそれで戻せばいいはずだ.

参考文献:
MacBook-fr: Region Free
xvi's site

関連製品:
Top Gear: Complete Season 10

2009年6月18日木曜日

FreeBSD でサーバ構築 #5.5 アップデートの自動化

林檎生活100: FreeBSD でサーバ構築 #5林檎生活100: FreeBSD でサーバ構築 #6の間あたりのネタだな.絶対に設定するべきってわけじゃないから,あまり気にしなくてもいいエントリだw

今回は,freebsd-update を自動実行してアップデートがあることを通知するようにすることと,portsnap を自動実行して最新の Ports コレクションをダウンロードしておくことと,portaudit を自動実行して Ports のセキュリティ問題を定期的に調査するようにすることについて.これは,cron というユーティリティで,指定時刻に定期実行させるように設定することで実現する.

まずは,freebsd-update で,FreeBSD 本体のセキュリティアップデートを自動取得するように設定する./etc/crontab の末尾に次の行を追加して,毎日実行するように設定する.
#
# Check update and download freebsd security patches.
@daily root freebsd-update cron

セキュリティアップデートがあると,root 宛にメールが届くようになっているので,そのメールが届いたら早めにセキュリティアップデートを実行しよう.root 宛のメールを見る方法や別のアドレスに転送する方法は,メールサーバの構築のときに説明する.

つぎに,portsnap も自動実行するように設定する.freebsd-update と同様に,/etc/crontab の末尾に次の行を追加する.
#
# Download a compressed snapshot of the Ports Collection.
@daily root portsnap cron

これについては,とくに通知は届かない.(毎日なんらかの Ports はアップデートされてるからね.)新しく Ports をインストールする前に,portsnap update を実行するだけで最新の Ports ツリーにできるところが魅力なわけだ.

最後に,portaudit も自動実行するように設定する.とは言っても,Ports から portaudit をインストールするだけで,自動実行の設定がされる.(/usr/etc/periodic/security/410.portaudit によって実行される.)そして,毎日実行されて届く lucifer.legna.org security run output という件名のメールの中に,portaudit の実行結果が記述されるようになる.Ports の更新も含めたインストール方法はこんな感じ.
# portsnap fetch
# portsnap extract(以前にこのコマンドを実行したことがあるのであれば,portsnap update で OK.)
# cd /usr/ports/ports-mgmt/portaudit
# make install clean

ついでに,Ports をアップデートするツール portupgrade をインストールしておこう.これを使って,脆弱性がみつかった Ports をアップデートしよう.
# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

使い方はこんなかんじ.(Ports インストール直後は,実行ファイルへのパスが更新されていないので,rehash コマンドを打ってから実行すること.)

○すべてのインストール済み Ports をアップグレード
# portupgrade -a

○すべてのインストール済み Ports それぞれについてアップグレードするか訪ねる
# portupgrade -ai

○指定した Port をアップグレード
# portupgrade ポート名

○指定した Port とその Port を必要としている Port をアップグレード
# portupgrade -r ポート名

○指定した Port とその Port が必要としている Port をアップグレード
# portupgrade -R ポート名


参考文献:
FreeBSD Handbook: FreeBSD Update
FreeBSD Handbook: Using the Ports Collection
FreeBSD Handbook: Monitoring Third Party Security Issues
ttt: (FREEBSD) PORTAUDITでPORTSのセキュリティチェック

2009年6月17日水曜日

freebsd-update で FreeBSD をアップグレード

FreeBSD 7.0-RELEASE がいつの間にかセキュリティアップサポートから外れていたようなので,freebsd-update コマンドを使って FreeBSD 7.1-RELEASE にアップグレードしてみた.打ったコマンドはこんなかんじ./var/db/freebsd-update がデフォルトのワーキングディレクトリなのだが容量不足だった.なので /usr/freebsd-update というディレクトリをつくり,そこをワーキングディレクトリとした.コマンドの -d オプションはそのため.
# freebsd-update -d /usr/freebsd-update -r 7.1-RELEASE upgrade
(何回かでる質問に y と答える.)
# freebsd-update -d /usr/freebsd-update install
# shutdown -r now
# freebsd-update -d /usr/freebsd-update install

楽になったもんだなぁ.大変だった頃が懐かしくなる.

参考文献:
FreeBSD Security Information
FreeBSD Handbook: FreeBSD Update

2009年6月16日火曜日

FreeBSD でサーバ構築 #10 ポートマッピングとゾーン転送

林檎生活100: FreeBSD でサーバ構築 #9 BIND の設定 の続き.AirMac Express のポートマッピングの話とゾーン転送がされているかの確認,そして,インターリンク(僕が使っているプロバイダ.)の逆引き設定について書いていく.今回で,BIND に関わる話は最後だね.

まず,AirMac Express のポートマッピングについて.DNS は,UDP の53番ポートを問い合わせに,TCP の53番ポートをゾーン転送に使う.なので,AirMac Express のポートマッピングの設定を次のように変更することで,問い合わせパケットとゾーン転送パケットがサーバ (192.168.1.254) に届くようになる.AirMac Express に必要な設定はこれだけだ.ほかのルータなどもこのような設定項目があるはずなので,そこで設定してほしい.



設定の確認は,WAN 側から次のようなコマンドを打つことで確認できる.(友人などにやってもらうといいかもね.)
$ nslookup lucifer.legna.org 203.152.220.151

これは,WAN 側からホスト名 lucifer.legna.org を構築したネームサーバで名前解決できるかを調べている.LAN 側からは名前解決できているはずなので,ポートマッピングが正常であれば,WAN 側からも名前解決できるはずであるからね.WAN 側から nslookup をしてくれる Web サービスを使う手もあるけど,ネームサーバを指定できないので問題があった場合に原因を特定しにくいんだよね.

次は,ゾーン転送について.これは,待ちましょうwEveryDNS.net の場合は,1時間に1回ゾーン転送を試行してくれるので,それを待つしかない.ポートを空けて1時間待ってみて,次のコマンドを打ってみよう.
$ nslookup lucifer.legna.org ns1.everydns.net

これで名前解決できていれば OK.できていなかったら,/var/log/messages に次のような行がないか見てほしい.
Jun 15 12:39:45 lucifer named[1330]: client 71.6.202.218#51272: zone transfer 'legna.org/AXFR/IN' denied

71.6.202.218 からゾーン転送の要求がきたが,要求に応じなかったことを表している.これがある場合は,allow-transfer サブステートメントに 71.6.202.218 が設定されているか確認しよう.(allow-transfer サブステートメントを設定していない場合は,この行が表示されることはないはず.)もちろん,71.6.202.218 が信頼できるスレーブであること(この場合は,EveryDNS.net のサーバであること.)が前提だけどね.

最後に,逆引き設定について.これは,インターリンクが提供しているサービスを使用する場合の話なので,すべての固定グローバル IP を取得可能なプロバイダで設定できるわけではないんだけどね.設定画面はこんなかんじ.ここで設定することで,IP アドレスからホスト名を参照することができるようになるよ.


本来,ネームサーバを設定する際には,今回設定したようなホスト名から IP アドレスを求める正引きと言われる名前解決と,IP アドレスからホスト名を求める逆引きと言われる名前解決を設定する必要がある.しかし,固定グローバル IP を1つだけ割り当てて貰っているような場合は,その逆引きゾーンの権限が委譲されないので,自前のネームサーバでグローバル向けの逆引き設定をすることにほとんど意味はない.ひとつのサーバで,正引きと逆引きが対応するように設定すべきだと思うが,固定グローバル IP を1つだけ割り当ててもらっているような環境では,逆引きを設定しないか,逆引きをプロバイダ側に持ってもらうかというちぐはぐな状態になってしまう.

さて,次回はメールサーバ立ち上げのために,Sendmail の説明に入っていく♪Postfix が流行ってる中で,FreeBSD デフォルトの Sendmail で行くぞ☆

参考文献:
Craig Small's Home Page: NSlookup

2009年6月15日月曜日

FreeBSD でサーバ構築 #9 BIND の設定

林檎生活100: FreeBSD でサーバ構築 #8の続き.BIND の設定ファイルである /etc/namedb/named.conf とドメインのゾーンファイルの書き方を説明する.

まずは,named.conf の書き方.といっても,デフォルトにちょっと追加するだけなので,詳しい文法は知らなくてもいいと思う.

1. 21行目の listen-on サブステートメントを次のようにコメントアウトする.
// If named is being used only as a local resolver, this is a safe dafault.
// For named to be accessible to the network, comment this option, spedify
// the proper IP address, or delete this option.
// listen-on { 127.0.0.1; };

これが記述されていると,BIND は localhost インタフェースに来た問い合わせ,つまり,ローカルからの問い合わせにしか応答しなくなる.なので,外からの自分が所有するドメイン(僕の場合は,legna.org だね.)への問い合わせを受け付ける必要があるので,インタフェースを限定しないようにコメントアウトする.

2. 自分が所有するドメインのゾーンファイルの場所などをファイル末尾に追記する.
zone "legna.org" {
type master;
file "master/legna.org";
allow-transfer {
71.6.202.218;
};
};

zone のあとの名前は起点名というもので,あとから重要になるのでドメイン名をそのまま使おう.マスタを示す type master; を記述して,ゾーンファイルへのパスを記述する.ゾーンファイルの名前は何でもいいが,ドメイン名が無難だろう.allow-transfer サブステートメントは,ゾーンの転送を許可するスレーブの IP アドレスを記述している.一応,everydns.net のを調べて記述しているが,不明な場合は次のように記述してもいい.allow-transfer のデフォルトは any だからだ.
zone "legna.org" {
type master;
file "master/legna.org";
};


named.conf の変更はこれだけだ.固定 IP 1つだけを取得していることを前提にしているので,逆引きゾーンなどの設定は省略させてもらう.

さて,それではゾーンファイルを書くことにしよう.僕の場合は,/etc/namedb/master/legna.org がゾーンファイルになる.今回はテンプレートがないので,スクラッチから記述していこう.

1. TTL(Time To Live: 生存期間)の記述
$TTL 3h

このゾーンへの問い合わせに対しての応答で,TTL に記述した時間だけ問い合わせもとサーバにキャッシュしておくように指示するという意味がある.まああまり気にしなくてもいい.3h は 3時間の意味.

2. SOA レコードの記述
まずは,次のような SOA (Start Of Authority) レコードを記述する.(ドメイン名のあとのドットを忘れないように.)
@ SOA lucifer.legna.org. hostmaster.legna.org. 2009061500 3h 1h 1w 1h

@は起点名 legna.org に置き換えられる.lucifer.legna.org. はネームサーバの記述で,hostmaster.legna.org. は hostmaster@legna.org ということでメールアドレスの記述で,ネームサーバの管理者の問い合わせ先ということだ.2009061500 はシリアル番号で,スレーブがゾーンデータを更新するときに参照するため,ゾーンファイルを更新したら必ず増加させよう.YYYYMMDDNN(年月日当日更新回数)で記述することで更新するたびにシリアル番号を確実に増加させることができる.

残りの4つの時間は,先頭からリフレッシュ,リトライ,期限切れ,ネガティブキャッシュ TTL を表す.それぞれ,スレーブがゾーンデータをチェックする間隔,リフレッシュ間隔が過ぎてもマスタにアクセスできなかった場合のリトライ間隔,ゾーンデータが無効になる期限,ネガティブキャッシュ(資源レコード集合やドメイン名の非存在をキャッシュする機能.)の生存期間を表す.

3. NS レコードの記述
NS(ネームサーバ)の前には,@が省略されている.つまり,legna.org. というものが省略されていると考える.僕の環境の場合は,次のように ネームサーバの情報を記述する.
          NS    lucifer.legna.org.
NS ns1.everydns.net.
NS ns2.everydns.net.
NS ns3.everydns.net.
NS ns4.everydns.net.

4. MX レコードの記述
MX(メールエクスチェンジャ)はメールサーバの構築のときに説明する.とりあえず,こんな感じに書いておく.
lucifer   MX 10 lucifer.legna.org.

5. A レコードの記述
A(ホスト)の前には lucifer と記述されている.末尾にドットがないので,起点名が付与されるので,lucifer.legna.org. になる.このレオードで IP とホスト名を関連づける.
lucifer   A     203.152.220.151

6. CNAME レコードの記述
賛否両論あるが,localhost と www はここで記述するのが好き.別名みたいなもの.
localhost CNAME localhost.
www CNAME lucifer.legna.org.

全部まとめるとこうなる.
$TTL 3h
@ SOA lucifer.legna.org. hostmaster.legna.org. 2009061500 3h 1h 1w 1h

NS lucifer.legna.org.
NS ns1.everydns.net.
NS ns2.everydns.net.
NS ns3.everydns.net.
NS ns4.everydns.net.

MX 10 lucifer.legna.org.

lucifer A 203.152.220.151

localhost CNAME localhost.
www CNAME lucifer.legna.org.

これで,ゾーンファイルの記述も完了.設定の反映と確認作業をつぎのようなかんじで行おう.
# /etc/rc.d/named restart
Stopping named.
Starting named.
# exit
$ nslookup lucifer.legna.org 0.0.0.0
Server: 0.0.0.0
Address: 0.0.0.0#53

Name: lucifer.legna.org
Address: 203.152.220.151
$ nslookup www.legna.org 0.0.0.0
(省略)
$ nslookup localhost.legna.org 0.0.0.0
(省略)

以上で,BIND の設定は完了.次回は,ルータのポート解放とゾーン転送,逆引き設定(インターリンクの場合のみ.)について書いて,BIND 編の最終回としたいと思う.そのあとは,メールサーバをやるぞ☆

参考文献:
DNS & BINDクックブック―ネームサーバ管理者のためのレシピ集
BIND 9 Administrator Reference Manual
RFC2308(日本語訳)
西村大介の KTYY でのページ: localhost 問題

追記(2009年6月22日):
MX レコードの表記を変更.Sendmail の回での説明のため.

追記(2009年10月13日):
DNS の回送について.ローカルで答えられない問い合わせをほかのネームサーバ(例えば,プロバイダのネームサーバ.)に回送する方法.僕のサーバでは,この設定をすることにした.プロバイダのサーバに任せた方が,キャッシュとか効いていいかなぁってw

その設定は,named.conf の該当箇所を次のように修正するだけ.forward ステートメントは,ローカルで答えられない問い合わせは回送して,再起的問い合わせをしないために only にする.forwarders ステートメントは,うちのブロードバンドルータの IP アドレスを指定し,ブロードバンドルータに解決を任せる.(そして,そのブロードバンドルータがプロバイダのネームサーバに回送するわけなんだけどねw)

// In addition to the "forwarders" clause, you can force your name
// server to never initiate queries of its own, but always ask its
// forwarders only, by enabling the following line:
//
forward only;

// If you've got a DNS server around at your upstream provider, enter
// its IP address here, and enable the line below. This will make you
// benefit from its cache, thus reduce overall DNS traffic in the Internet.
forwarders {
192.168.1.1;
};

2009年6月14日日曜日

C 言語の話#3 オブジェクト指向プログラミング?

オブジェクト指向プログラミング?を C言語でやってみた.オブジェクト指向プログラミングというよりも,カプセル化をやっているだけなのだけどねw

論じるよりソースを見てもらえると早い.やってみたのはこんなかんじのことだ.
/* main.c */
#include <stdio.h>
#include "book.h"

int main(void)
{
Book *book;

book = newBook("伝奇集", "J.L. ボルヘス");

printf("%s\t%s\n", book->getTitle(book), book->getAuthor(book));

deleteBook(book);

return 0;
}

new でつくって,アクセッサで値を参照して,delete で解放する.基本的なルールはこんなかんじ.

・「クラス名 *インスタンス変数名;」でインスタンス変数を宣言する.
・「インスタンス変数 = newクラス名(引数…);」でインスタンス化する.
・「インスタンス変数名->関数名(インスタンス変数名, 引数…)」で関数を呼び出す.
・「deleteクラス名(インスタンス変数名);」でインスタンスを解放する.

new と delete の対応に気をつけさえすれば,Book クラスのメモリのことを気にしなくていいようになっている.(理想としてはね.)

book.h と book.c の実装はこんな感じ.
/* book.h */
#ifndef __BOOK_H__
#define __BOOK_H__

typedef struct _Book Book;

struct _Book {
char *title;
char *author;
char *((*getTitle)(const Book *book));
char *((*getAuthor)(const Book *book));
};

Book *newBook(const char *title, const char *author);
void deleteBook(Book *book);

#endif /* __BOOK_H__ */
/* book.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "book.h"

char *book_getTitle(const Book *book);
char *book_getAuthor(const Book *book);

Book *newBook(const char *title, const char *author)
{
Book *book;

book = (Book *)malloc(sizeof(Book));
if (book == NULL) {
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

book->title = (char *)malloc(strlen(title) + 1);
if (book->title == NULL) {
free(book);
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}
book->author = (char *)malloc(strlen(author) + 1);
if (book->author == NULL) {
free(book->title);
free(book);
fprintf(stderr, "%s:%d: error: %s()\n", __FILE__, __LINE__, __func__);
return NULL;
}

strcpy(book->title, title);
strcpy(book->author, author);

book->getTitle = book_getTitle;
book->getAuthor = book_getAuthor;

return book;
}

void deleteBook(Book *book)
{
free(book->author);
free(book->title);

free(book);
}

char *book_getTitle(const Book *book)
{
return book->title;
}

char *book_getAuthor(const Book *book)
{
return book->author;
}

こういう実装が好きでよくやるのだけど,もっといい方法があったら教えてほしい.

2009年6月13日土曜日

iTunes ライブラリを移動する方法

iTunes Music フォルダを移動する方法.新しい外付け HDD を買ったので,iTunes ライブラリを移動♪

1. iTunes>環境設定…>詳細の「"iTunes Music"フォルダの場所」を新しいフォルダに変更する.また,「"iTunes Music"フォルダを整理する」がチェックされていることを確認する.


2. ファイル>ライブラリ>ライブラリを統合…をクリックし,ポップアップウィンドウの統合をクリックする.




参考文献:
iTunes for Mac: 「iTunes Music」フォルダを移動する

LaCie 4big Quadra を購入

LaCie 4big Quadra 2TB を購入した♪RAID 5 を構築できるバックアップドライブがほしいなということで.


デザインもかっこよくて,とてもいい感じ.背面もすっきりしている.


RAID 5+Spare で使用する.3台で RAID5 を組み,1台は故障したときのスペアドライブとすることで,耐障害性の高い状態にした.アクセスも高速だし,とくに不満はない.

僕が行った初期設定はこんな感じ.

1. 電源をオンにする.
2. 前面 LED と背面 LED が青の点滅から青の点灯に変わる(正常起動)ことを確認し電源をオフにする.
3. 前面スイッチを押したまま起動し,前面 LED を赤と青の交互点滅(RAID 設定モード)状態にする.
4. 背面の+と-のスイッチを細いもので押し, RAID 設定番号を6 (RAID 5+Spare) にする.
5. 前面スイッチを押して,前面 LED を青の点滅にし,青の点灯になるまで待つ.
6. 電源を一度オフにし,再度電源をオンにする.
7. 前面 LED と背面 LED が青の点滅から青の点灯に変わることを確認する.
8. 電源スイッチを AUTO にする.(Mac の起動と 4big Quadra の起動を連動させるため.)

ほかの製品と比べても,こいつは大きいなぁ.まあ,4台 HDD が入ってるから当然なんだけどさ.


関連製品:
LaCie 4big QuadraAmazon で製品を見る

2009年6月12日金曜日

Inspiron Mini 12 のヒンジ破損

左側のヒンジが死亡した.普通にディスプレイを開いたら,ガリガリって音がして,ディスプレイがぐらつくようになってしまった.外側からわかる亀裂や破損はないんだけど,あきらかに左側のヒンジがずれてがたつく.


とりあえずテクニカルサポートに電話したら,破損部分の写真をメールで送ってくれと言われたので,メールに写真2枚を添付して送った.無償修理の対象内だといいなぁ.

3ヶ月しか経ってないのに,ヒンジ破損は残念だなぁ.筐体がちゃちぃのは仕方ないが,ヒンジは丈夫にしてほしい.

関連製品:
Dell Inspiron Mini 12Amazon で製品を見る

2009年6月3日水曜日

rc.conf の gateway_enable についてのメモ

FreeBSD の /etc/rc.conf に gateway_enable="YES" を追加すると,IP フォワーディング(この場合,あるインタフェースから別のインタフェースへの IP パケットの転送の意味.)が有効になる.ルータとして機能させるために必要な設定./etc/rc.d/routing というシェルスクリプトの87, 88行目のコマンドが,この設定によって実行される.
echo -n ' IP gateway=YES'
sysctl net.inet.ip.forwarding=1 >/dev/null

2009年6月2日火曜日

Inspiron Mini 12 で Age of Empires II Gold Edition

就活も終わったし,Age of Empires II Gold Edition を Inspiron Mini 12 でやるかぁと思ったら,動作しないことが判明した(泣)

原因は,搭載されている Intel GMA 500 にあるのではないかなぁと予想.いろいろ試行錯誤をしてみたが,お手上げだった.だれか動かした人がいたら教えてください.

関連製品:
Dell Inspiron Mini 12Amazon で製品を見る
Age of Empires II Gold EditionAmazon で製品を見る

追記(2009年9月15日):
ディスプレイドライバを無効にして,Windows 標準のディスプレイドライバで実行すると起動できた♪