最新 追記

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2009-07-12 iPhone 3GS

iPhone 3GS 購入

買いました。

とりあえずエントリだけ更新。詳しくは後で書くかも。

絵日記プラグインのテスト

てすとん。

まあこんな感じか。

写真は某所の狭すぎる右折車線。

サムネイルが画像の表示サイズをHTMLで指定しただけになってるけどまあいいか。


2009-07-14 クラウドコンピューティング

iPhone のアドレス帳を OpenLDAP で管理する (OpenLDAP導入編)

なんでもオンラインで管理したい病なのでやっちゃいましょう。

サーバは基本的に FreeBSD です。

まず、OpenLDAP Server をインストールします。

# cd /usr/ports/openldap24-server && make install

次に /etc/rc.conf の編集。

# echo 'slapd_enable="YES"' >> /etc/rc.conf

/usr/local/etc/openldap/slapd.conf を編集。とりあえず書き換えるのは以下のところくらい。

suffix          "dc=thelefty,dc=org"
rootdn          "cn=Manager,dc=thelefty,dc=org"
rootpw          {SSHA}aKeZVecq39wD/EVQiSVzxRsuAVMqqOE8

rootpw は slappasswd で生成します。

$ slappasswd
New password:
Re-enter new password:
{SSHA}R2h4fgMhbwZk7hb1ARyBJvuJeLqVSUhC

そして、slapd を起動。

# /usr/local/etc/rc.d/slapd start
Starting slapd.

LDAPのツリーを作成します。以下のような内容のファイルを作成。

dn:dc=thelefty,dc=org
objectClass:organization
objectClass:dcObject
o: thelefty.org address book

dn: ou=AddressBook,dc=thelefty,dc=org
objectClass: organizationalUnit
ou: AddressBook

そして登録。

$ ldapadd -x -D cn=Manager,dc=thelefty,dc=org -W -f $INPUTFILE

登録されているか確認します。上のファイルの内容に似たものが出てくればOKです。

$ ldapsearch -x -W  -D cn=Manager,dc=thelefty,dc=org -b dc=thelefty,dc=org
Enter LDAP Password:

とりあえずこれでLDAPサーバ側の準備は完了。アクセス制限やSSLでの暗号化設定はまたの機会に。


2009-07-16 iPhone OS 3.0

iPhone OS 3.0 の Wi-Fi 自動接続

iPhone OS 3.0 になって、Wi-FiアクセスポイントのWeb上でのログインを自動で行ってくれる機能が付いたのは既知のとおりだが、釈然としない点がある。ソフトバンクモバイルのページによると、「インターネットテザリング、Wi-Fiへ自動ログインの機能は、日本では対応しておりません。」というのだ。

インターネットテザリングに対応しないのはキャリアの回線の都合なので許可するか否かや料金の設定はキャリア(国)によって異なるというのは理解できるが、Wi-Fiへの自動ログイン機能が使えるか否かにどの国で使うかが関係あるのだろうか。

納得のいかない点がいくつかあったので、iPhone OS 3.0 の Wi-Fi 自動ログイン機能がどのような仕組みなのか調べてみることにした。

FreeBSDとOpengateで公衆無線LANのような認証を設けたネットワークを構築し、Wi-Fi自動ログインの挙動を調べる。 Opengateではファイヤウォールにipfwを使用しており、未認証の端末の通信には以下のルールが適用される。

60000 fwd 127.0.0.1 tcp from 192.168.16.0/24 to any dst-port 80

要するに未認証の端末の外向き80番へのTCPパケットはすべてOpengateサーバにフォワードされる。フォワードされたHTTPアクセスへはOpengateサーバ上のApacheが応答し、認証ページへリダイレクトする。Apacheのログを調べると、

192.168.16.251 - - [01/Jul/2009:18:17:42 +0900] "GET /library/test/success.html HTTP/1.0" 404 833 "-" "CaptiveNetworkSupport/1.0 wispr"
192.168.16.251 - - [01/Jul/2009:18:18:46 +0900] "GET /library/test/success.html HTTP/1.0" 404 833 "-" "CaptiveNetworkSupport/1.0 wispr"

というログが残っていた。Wi-Fiアクセスポイントに接続すると同時に、

へのアクセスを試み 404 Not Found や 301 などのリダイレクトHTTP応答ならWeb認証のあるアクセスポイントとみなしログイン画面を出すようだ。

Opengateによる認証でも自動ログイン機能のログイン画面が表示されて、ネットワーク設定の画面では「自動認証」のスイッチも現れたが、切断後再接続したときに自動でログインするには至らない。


2009-07-17 SSHは万能?

OpenSSH による VPN

OpenSSH を使った簡易 VPN の構築 を参考にSSHでVPNを接続してみたときのメモ。サーバは 7.2-RELEASE、クライアントは 8-CURRENT。

目標状態はまあこんな感じ。

今回は tap デバイスを使ったトンネリングをするので、サーバ・クライアントの両方に tap デバイスが必要です。なければ、作る。ブリッジインターフェイスもあとで使うのでついでに作っておく。

# ifconfig tap0 create
# ifconfig bridge0 create

SSH-VPN 用の鍵をあらかじめ作っておき、その鍵でrootでログイン出来るようにしておきます。そして、接続。

client# ssh -oTunnel=ethernet -w0:0 -i /root/.ssh/ssh_vpn example.vmeta.jp

オプションの詳細は man 1 ssh でも見てください。うまく接続できたら、こんな風になってるはずです。

server# ifconfig tap0
tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 00:bd:b0:39:c3:00
Opened by PID 73615
client# ifconfig tap0
tap0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 00:bd:8f:37:80:00
Opened by PID 54562

サーバとクライアント間でVPNが確立できたので、VPN回線とサーバ側のネットワークをブリッジで接続します。

server# ifconfig bridge0 addm em0 addm tap0 up
server# ifconfig bridge0
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	ether 72:07:5d:cd:ba:b3
	id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
	maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
	root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
	member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 4 priority 128 path cost 2000000
	member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 1 priority 128 path cost 200000

クライアント側も同様にして、

client# ifconfig bridge0 addm0 vr0 addm tap0 up
client# ifconfig bridge0
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	ether 36:d3:e2:27:4f:d2
	id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
	maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
	root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
	member: vr0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
	        ifmaxaddr 0 port 2 priority 128 path cost 200000
	member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
        ifmaxaddr 0 port 6 priority 128 path cost 2000000

と設定すると、図のようにネットワークがつながります。

接続後のインターフェイスの設定を自動で行うには、上のページの「実際に運用する」あたりに習って設定すればOKです。

手軽に構築できるSSH-VPNですが、常用するには向いてないと思います。


2009-07-21 Mutt Sucks Less

muttrc の書き方 (Courier-IMAP PREAUTH編)

前回からだいぶ間が空いてしまいましたが、muttrc の書き方です。

自分のホームディレクトリにMaildirがある状態を想定して、メールボックスにIMAPでアクセスするための設定方法です。予めCourier-IMAPなどをインストールしておく必要があります。

PREAUTHとは予めSSHなどでログインして認証済みの状態でシェルからimapdを起動することで、IMAPプロトコルは標準入出力経由でやりとりすることになります。

$ /usr/local/bin/imapd ~/Maildir
* PREAUTH Ready.
INFO: LOGIN, user=meta, ip=[127.0.0.1], port=[0], protocol=IMAP

あらかじめ .mutt ディレクトリを作っておき、~/.mutt/muttrc に設定を記述します。

$ ( umask 077 && mkdir ~/.mutt )

muttc の中身はこんな感じ。

# 標準入出力経由でIMAPアクセスするための宣言
set tunnel="/usr/local/bin/imapd ~/Maildir"

# INBOX, Sent, Drafts などの場所を指定
set folder="imap://localhost/"
set spoolfile="imap://localhost/INBOX"
set record="+INBOX/Sent"
set postponed="+INBOX/Drafts"

# お約束の設定
set hostname="example.jp"
set send_charset="iso-2022-jp"
set envelope_from="yes"

# メールをスレッド順にソート
set sort="threads"

# SMTPサーバの設定
set smtp_url="smtps://smtp.example.jp:465/"

# IMAPとSMTPで別のユーザで認証する
account-hook imap://localhost/ 'set tunnel="/usr/local/bin/imapd ~/Maildir"'
account-hook smtps:/example.jp:465/ 'unset tunnel'

# ヘッダとメッセージのキャッシュ
set header_cache=~/.mutt/cache/headers/
set message_cachedir=~/.mutt/cache/bodies/

# IMAPの新着メールを G で受信
bind index G imap-fetch-mail
bind pager G imap-fetch-mail

以上がホームディレクトリ内のMaildirを直接IMAPで読むための設定です。 送信者(自分)の名前などはシステムのgecosフィールドの値が使われます。

明示的に設定するには、

set realname="Charlie Root"

と書いておけばOKです。