kazu memo@GD

2004|05|06|
2005|03|04|05|06|07|08|09|10|11|
2006|01|02|05|06|07|08|12|
2007|01|02|07|12|
2008|03|05|07|12|
2009|01|03|05|06|09|10|12|
2010|01|04|06|12|
2011|04|

2011-04-28

_ 6to4 による IPv6 対応ルーター設定

グローバル IP (v4) アドレスが静的に割り当てられている Debian squeezeのマシンを tun6to4 で IPv6 対応ルータにしてみました。

参考

単独の接続

最初に単独で接続できることを確認します。ここの手順は参考にしたサイトの設定の話とほぼ同じです。

まず 6to4 のアドレスを計算します。

$ printf "2002:%02x%02x:%02x%02x::1\n" 220 218 54 201
2002:dcda:36c9::1

次に tun6to4 という iface の設定を追加します。

$ sudoedit /etc/network/interfaces
auto tun6to4
iface tun6to4 inet6 v4tunnel
address 2002:dcda:36c9::1
netmask 16
gateway ::192.88.99.1
local 220.218.54.201
endpoint any
ttl 64

local や address にグローバル IP アドレスから一意に決まるものをわざわざ書かないといけないのが面倒ですが、参考にした例がそうなっていたので、同じようにちゃんと書いています。

次に firewall 設定です。

iptables を直接使っている場合は IPv4 の /etc/network/iptables と同様に /etc/network/ip6tables というファイル名のファイルを作成すれば /usr/sbin/iptables-apply と同様に/usr/sbin/ip6tables-apply が使えて便利だと思います。

ufw を使っている場合は /etc/default/ufw で IPV6=yes に変更してdisable にして enable しなおすことで反映します。一瞬 firewall が無効になって無防備になってしまうのはufw の場合仕方がないようです。

$ sudoedit /etc/default/ufw
IPV6=yes
$ sudo ufw disable && sudo ufw enable

再起動前に ifup で有効にして確認します。

$ sudo ifup tun6to4

「ping6 -c 4 www.kame.net」などで確認します。

ルーターの設定

単独で接続できたら次はルーターとしての設定です。設定したマシンでは eth0 が LAN 側で eth1 が WAN 側になっていたので、 eth0 に inet6 の設定を追加しました。

追加後の /etc/network/interfaces はコメントを除くと以下のようになっています。

次に radvd を設定して RA (Router Advertisement) を流すiface に何らかのアドレス設定は必須のようなので適当に「2002:dcda:36c9:415::1」を設定しています。

「2002:dcda:36c9」の先頭の部分は 6to4 を意味する 2002 とグローバル IPv4 アドレスで tun6to4 の先頭と同じです。

「415」の 415 の部分はhttp://slashdot.jp/it/article.pl?sid=11/04/15/0736252の日付から取っただけで深い意味はありません。別に 1 でも 2 でも何でも良いようです。

最後の「::1」の部分は LAN 側に割り当てることにした「2002:dcda:36c9:415::/64」というサブネットから適当に選んだ IPv6 アドレスになるようにしているだけです。

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
iface eth0 inet6 static
address 2002:dcda:36c9:415::1
netmask 64

allow-hotplug eth1
iface eth1 inet static
address 220.218.54.201
netmask 255.255.255.240
gateway 220.218.54.193

auto tun6to4
iface tun6to4 inet6 v4tunnel
address 2002:dcda:36c9::1
netmask 16
gateway ::192.88.99.1
local 220.218.54.201
endpoint any
ttl 64

次に「sudo aptitude install radvd」などでradvd をインストールします。

インストールしただけだとREADME.Debian を読んで設定するようにメッセージが出るだけで自動起動はしません。

$ sudo /etc/init.d/radvd start
Starting radvd: 
* /etc/radvd.conf does not exist or is empty.
* See /usr/share/doc/radvd/README.Debian
* radvd will *not* be started.
$

まず README.Debian などを参考にして/etc/sysctl.d/ipv6.conf を作成しました。

再起動前に反映させるには「sudo sysctl -p /etc/sysctl.d/ipv6.conf」です。

$ cat /etc/sysctl.d/ipv6.conf
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.forwarding=1

/etc/radvd.conf は/usr/share/doc/radvd/examples/radvd.conf.exampleを参考にして以下のように設定しました。

グローバル IP アドレスから一意に決まるものをわざわざ書くのは嫌だったので、prefix の先頭は「0:0:0」にして「Base6to4Interface eth1;」で自動設定するようにしています。

$ cat /etc/radvd.conf
interface eth0
{
	AdvSendAdvert on;
	MinRtrAdvInterval 3;
	MaxRtrAdvInterval 10;
	AdvDefaultPreference low;
	AdvHomeAgentFlag off;
	prefix 0:0:0:0415::/64
	{
		AdvOnLink on;
		AdvAutonomous on;
		AdvRouterAddr off;
		Base6to4Interface eth1;
		AdvPreferredLifetime 120;
		AdvValidLifetime 300;
	};
};

後は「sudo /etc/init.d/radvd start」してLAN 内のマシンにグローバル IPv6 アドレスが割り振られることを確認したりhttp://ipv6.google.com/が表示できることを確認したりします。

試したクライアント環境では(6to4 の IPv6 接続の場合に)IPv4 と IPv6 の両方に対応しているサーバへの接続にはIPv4 が優先されるようなので、http://www.kame.net/の亀は踊りませんでした。

_ libvirt + KVM 環境での 6to4 による IPv6 対応ルーター設定

ここでは libvirt や KVM の新しいバージョンを使いたかったため、Ubuntu 11.04 (natty) を使用しました。

単独での接続

まず「iface tun6to4 inet6 v4tunnel」を普通に設定します。

ルーター設定

sysctl だけ別途設定します。もしかすると libvirt で自動設定されて不要かもしれませんが、設定しました。

$ cat /etc/sysctl.d/ipv6.conf
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.forwarding=1

libvirt に IPv6 設定

「virsh net-edit default」で network 要素直下に「<ip family='ipv6' address='2002:dcda:36c9:415::1' prefix='64' />」のように設定を追加します。普通は「</network>」の行の直前に追加すれば良いと思います。

試した環境では一度保存すると以下のように2行になってしまいましたが、XML 的にはほぼ同じなので気にしなくても良いと思います。

 <ip family='ipv6' address='2002:dcda:36c9:415::1' prefix='64'>
 </ip>

全体的な例はhttp://libvirt.org/formatnetwork.htmlを参考にしてください。

これだけで自動的に virbr0 に「2002:dcda:36c9:415::1/64」のアドレスが振られたり radvd が起動したりします。

トラブル事例

自分で radvd を起動してしまうとping6 での確認のときに packet loss が 70% 以上になるなどわかりにくいトラブルになりました。

そのときに「radvd[...]: our AdvValidLifetime on eth0 for ... doesn't agree with ...」のようなログが出ていて、調べるとhttp://www.wiggy.net/texts/ipv6-howto/に radvd のようなルータ広告 (RA) するデーモンが複数動いている場合におきる問題だということがわかったので、 libvirt で自動起動されているradvd が存在するのを確認し、手動で起動していた方の radvd を止めることで解決しました。


2010-12-15

_ パスワードの強度チェック

Rails でパスワードの変更機能を作っていて、ある程度弱いパスワードは拒否したかったので、以下のようにしてチェックした。

cracklib-check は debian lenny では cracklib-runtime パッケージを入れれば使えるようになった。

HTML のエスケープは flash の表示部分でしているので、ここではエスケープしていないが、エスケープを忘れるとパスワード候補として「<s>」などを使ったときに変になるので注意。

 def strong?(password)
   require "open3"
 
   result = Open3.popen3("/usr/sbin/cracklib-check") do |sin, sout, _|
     sin.write password
     sin.close
     sout.read
   end
 
   return true if /OK\Z/ =~ result
   flash.now[:error] = "もっと強いパスワードを設定してください: #{result}"
   return false
 end

2010-06-28

_ grub-pc

lucid と sid の grub-pc で確認したことのメモです。

日本語を表示するのに必要な設定は

loadfont /path/to/unicode.pf2
set gfxmode=1024x768
insmod gfxterm
insmod vbe
terminal_output gfxterm

のような感じで、menuentry の後ろの "" の中などで日本語が使える。unicode.pf2 は /usr/share/grub/unicode.pf2 にあるので、 ISO イメージなどを作るときは /boot/grub あたりにコピーしておく。

コマンドラインで使うときのヘルプメッセージやメニューの上下などの文字列の翻訳を表示するには /boot/grub/locale/ja.mo を用意して以下の設定をする。

set locale_dir=/boot/grub/locale
set lang=ja
insmod gettext

2010-06-25

_ Thunderbird 3.1以降の自動設定対応

https://wiki.mozilla.org/Thunderbird:Autoconfiguration とか https://developer.mozilla.org/en/Thunderbird/Autoconfiguration とかに書いてある Configuration server at ISP の設定をサーバ側にしたという話です。

ユーザとしては http://support.mozillamessaging.com/en-US/kb/Automatic+Account+Configuration のように「名前」と「メールアドレス」を入れるだけで受信用サーバと送信用サーバが自動設定されるようになります。

具体的なサーバ側の設定手順ですが、まず Thunderbird 3.1 を用意して、適当な名前とメールアドレス (てきとう@good-day.co.jpとか) を入力して webサーバに /.well-known/autoconfig/mail/config-v1.1.xml?emailaddress=てきとう%2540good-day.co.jp のようなアクセスがあるのを確認しました。good-day.co.jp は www.good-day.co.jp にリダイレクトしているため、今回は www.good-day.co.jp のログにアクセスがあるのを確認できました。

後はそのパスで見えるように xml ファイルを置くだけです。今回は STARTTLS は無しで、 IMAP4 over SSL, POP3 over SSL, SMTP over SSL の設定を並べてみました。認証に使うユーザ名は gmail ようなメールアドレス全体ではなく「@」の左側部分だけなので「%EMAILADDRESS%」ではなく「%EMAILLOCALPART%」にしました。認証方法は SSL 経由なのと、サーバ側に生パスワードを保存していないという理由でパスワードをそのまま送る「plain」にしています。

<?xml version="1.0" encoding="UTF-8"?>
<clientConfig version="1.1">
  <emailProvider id="good-day.co.jp">
    <domain>good-day.co.jp</domain>
    <displayName>Good-Day Inc.</displayName>
    <displayShortName>Good-Day</displayShortName>

    <incomingServer type="imap">
      <hostname>mx3.good-day.co.jp</hostname>
      <port>993</port>
      <socketType>SSL</socketType>
      <authentication>plain</authentication>
      <username>%EMAILLOCALPART%</username>
    </incomingServer>

    <incomingServer type="pop3">
      <hostname>mx3.good-day.co.jp</hostname>
      <port>995</port>
      <socketType>SSL</socketType>
      <authentication>plain</authentication>
      <username>%EMAILLOCALPART%</username>
    </incomingServer>

    <outgoingServer type="smtp">
      <hostname>mx3.good-day.co.jp</hostname>
      <port>465</port>
      <socketType>SSL</socketType>
      <authentication>plain</authentication>
      <username>%EMAILLOCALPART%</username>

    </outgoingServer>
  </emailProvider>
</clientConfig>

このファイルをおいた後、Thunderbird 3.1 でもう一度試したところ、IMAP にするか POP にするのかの選択肢が出てきました。incomingServer が複数あるとそういう挙動になるようです。


2010-04-15

_ BitTorrent

BitTorrent での ISO イメージの配布にちょっとでも協力しようと思って、 dist.good-day.co.jp で BitTornado を動かしている。

その BitTornado が使っている場所を dist.good-day.co.jp/bt/ で http でもみえるようにしてみた。


2010-04-02

_ redmine のアップデート

redmine を 0.8.7 から 0.9.3 にあげた。

  • config/initializers/fix-q-encode.rb でモンキーパッチをしていたが ActionMailer が新しくなっているので不要になった。
  • vendor/plugins/redmine_importer.0.0.3 は使われてなさそうだったのと、 redmine 0.9 で動くかどうかが不明だったので外した。
  • vendor/plugins/redmine_send_schedules は locale 周りの YAML ファイルの修正が必要だった。
  • lang/ja.yml の general_pdf_encoding の変更はファイルがなくなっていたので、とりあえず何もしなかったが、PDF の文字化けはしなくなっていた。

2010-01-21

_ blog.good-day.net 移動

etch のサーバで動いていた blog.good-day.net を lenny に上げる代わりに、別の lenny のサーバに移動した。

それにともない他にもディレクトリ構成などが代わっているので、何か問題が起きているかもしれません。何か気付いた点があれば連絡してください。

本日のツッコミ(全1件) [ツッコミを入れる]

_ z [ツッコミもちゃんと動いているかどうかテストです。]


2009-12-09

_ [postfix] milter-manager

インストール

まず http://milter-manager.sourceforge.net/reference/ja/install-to-debian.html の手順を参考にして

  • milter-manager
  • clamav-milter
  • milter-greylist

をインストール。

initgroups の修正が入ったものが 11/29 にリリースされることを期待していたけど、リリースされなかったので、パッチをあてたパッケージを作成。patch は git svn で取得しているもの。

  • apt-get source milter-manager
  • cd milter-manager-1.4.1
  • r3442 の差分を patch で適用
  • rm ChangeLog.rej ChangeLog.orig (rejectされたので削除)
  • dch -i x
  • vi debian/changelog
  • sudo apt-get build-dep milter-manager
  • debuild -uc -us -rfakeroot

ビルドして出来た *.deb のうち、インストールされていた 2 個 (libmilter-toolkit と milter-manager) だけをコピーしてインストールした。

設定

milter-manager のプロセス自体は uid も gid も milter-manager で、所属グループとして postfix と greylist に入るという権限分離に設定した。

sudo vi のところは追加や変更した部分のみ。

  • manager.connection_spec,security.effective_group,manager.unix_socket_group に設定が反映されていない。
    • /etc/default/milter-manager での設定だから?
  • milter-test-server での結果が「status: pass」ではなく「status: accept」になる。
$ sudo vi /etc/default/clamav-milter
SOCKET_RWGROUP=milter-manager
$ sudo vi /etc/default/milter-greylist
ENABLED=1
mkdir -p /var/run/milter-greylist
chmod 755 /var/run/milter-greylist
chown greylist:greylist /var/run/milter-greylist
umask 007
$ sudo vi /etc/milter-greylist/greylist.conf
#acl whitelist default
acl greylist default
$ sudo /etc/init.d/clamav-milter restart
Stopping Sendmail milter plugin for ClamAV: clamav-milter.
Starting Sendmail milter plugin for ClamAV: clamav-milter.
$ sudo /etc/init.d/milter-greylist restart
Restarting Greylist Mail Filter Daemon: No milter-greylist found running; none killed.
greylist.
$ sudo /etc/init.d/milter-greylist restart
Restarting Greylist Mail Filter Daemon: greylist.
$ id milter-manager
uid=107(milter-manager) gid=111(milter-manager) 所属グループ=111(milter-manager)
$ sudo adduser milter-manager postfix
Adding user `milter-manager' to group `postfix' ...
ユーザ milter-manager をグループ postfix に追加
終了。
$ sudo adduser milter-manager greylist
Adding user `milter-manager' to group `greylist' ...
ユーザ milter-manager をグループ greylist に追加
終了。
$ sudo vi /etc/default/milter-manager
GROUP=milter-manager
SOCKET_GROUP=postfix
CONNECTION_SPEC=unix:/var/spool/postfix/milter-manager/milter-manager.sock
$ sudo /etc/init.d/milter-manager restart
Restarting flexible milter management daemon: milter-manager.
$ sudo /usr/sbin/milter-manager -u milter-manager --show-config
package.platform = "debian" 
package.options = nil

security.privilege_mode = false
security.effective_user = "milter-manager" 
security.effective_group = "mail" 

manager.connection_spec = "unix:/var/run/milter-manager/milter-manager.sock" 
manager.unix_socket_mode = 0660
manager.unix_socket_group = "mail" 
manager.remove_unix_socket_on_create = true
manager.remove_unix_socket_on_close = true
manager.daemon = false
manager.pid_file = "/var/run/milter-manager/milter-manager.pid" 
manager.maintenance_interval = 100
manager.suspend_time_on_unacceptable = 5
manager.max_connections = 0
manager.max_file_descriptors = 0
manager.custom_configuration_directory = nil

controller.connection_spec = "unix:/var/run/milter-manager/milter-manager-controller.sock" 
controller.unix_socket_mode = 0660
controller.unix_socket_group = nil
controller.remove_unix_socket_on_create = true
controller.remove_unix_socket_on_close = true

define_applicable_condition("Sendmail Compatible") do |condition|
  condition.description = "Make a milter depends on Sendmail workable with Postfix" 
end

define_applicable_condition("Remote Network") do |condition|
  condition.description = "Apply milter only if connected from remote network" 
end

define_applicable_condition("S25R") do |condition|
  condition.description = "Selective SMTP Rejection" 
end

define_applicable_condition("Authenticated") do |condition|
  condition.description = "Apply a milter only when sender is authorized" 
end

define_applicable_condition("Unauthenticated") do |condition|
  condition.description = "Apply a milter only when sender is not authorized" 
end

define_milter("milter-greylist") do |milter|
  milter.connection_spec = "unix:/var/run/milter-greylist/milter-greylist.sock" 
  milter.description = "another spam-defense service" 
  milter.enabled = true
  milter.fallback_status = "accept" 
  milter.evaluation_mode = false
  milter.applicable_conditions = ["Sendmail Compatible", "Remote Network", "S25R", "Unauthenticated"]
  milter.command = "/etc/init.d/milter-greylist" 
  milter.command_options = "start" 
  milter.user_name = nil
  milter.connection_timeout = 300.0
  milter.writing_timeout = 10.0
  milter.reading_timeout = 10.0
  milter.end_of_message_timeout = 300.0
end

define_milter("clamav-milter") do |milter|
  milter.connection_spec = "unix:/var/run/clamav/clamav-milter.ctl" 
  milter.description = "Clam AntiVirus milter interface" 
  milter.enabled = true
  milter.fallback_status = "accept" 
  milter.evaluation_mode = false
  milter.applicable_conditions = []
  milter.command = "/etc/init.d/clamav-milter" 
  milter.command_options = "start" 
  milter.user_name = nil
  milter.connection_timeout = 300.0
  milter.writing_timeout = 10.0
  milter.reading_timeout = 10.0
  milter.end_of_message_timeout = 300.0
end
$ sudo -u postfix milter-test-server -s unix:/var/spool/postfix/milter-manager/milter-manager.sock
status: accept
elapsed-time: 0.048 seconds
$ 

postfix と接続

$ sudo vi /etc/postfix/main.cf
# milter-manager
milter_protocol = 6
milter_default_action = accept
milter_mail_macros = {auth_author} {auth_type} {auth_authen}
smtpd_milters = unix:/milter-manager/milter-manager.sock
$ sudo /etc/init.d/postfix reload
Reloading Postfix configuration...done.
$

動作確認

外部から送信テストして、

X-Virus-Scanned: clamav-milter 0.95.3 at (略).jp
X-Virus-Status: Clean

というヘッダがついていること確認。


2009-10-28

_ OpenType の 'post' テーブルの isFixedPitch

ORCAフォントの変更点として、post の isFixedPitch を 0 に変えたという点がある。

この理由として GNOME端末でカーソルが半角文字の上でも全角幅になる、 freetype2-demos パッケージに入っている ftdiff の表示で半角文字が全角幅になるなど、日医標準レセプトソフト関連以外でも問題が確認できていて、 OpenType の仕様をじっくり眺めてあやしそうなところを探したら isFixedPitch を見つけたからだった。

ORCA フォントとしては問題が解決したが、複数のアプリケーションでの問題が改善したからといって、即フォント側が悪いというわけにはいかないので、さらに調べていた。

昨日 IRC で文字コード周りにも詳しい成瀬さんと話をしてみたところ、Glyph Name and PostScript Font Table という Apple の URL を教えてもらった。英語版 Wikipedia の OpenType の External links からしかたどっていなかったので、 Apple にもあるというのは知らなかった。Apple の post テーブルについてのページには isFixedPitch についての説明が表の下にもはっきり書いてあったので、これを根拠として IPA に連絡しておいた。


2009-10-14

_ kinput2 の閉じるボタンを消す (未完)

kinput2 で変換候補や off the spot 変換の window の右上の閉じるボタンを押すと kinput2 が終了してしまうという問題が ORCA 方面で知られていて、etch の sun-java6 を使ったアプリケーションでそれをやってしまうとアプリケーションが SEGV で死んでしまうことがある。(再現する環境と操作の組み合わせでは再現率100%)

とりあえず window 装飾丸ごと消してしまうのは devilspie で簡単にできる。変換候補の window まで消してしまうと kinput2 の状態表示と重なってしまって見えなくなってしまうことがあるようなので、off the spot 変換の window だけに限定するなら以下のファイルを ~/.devilspie/kinput2.ds などの名前でおいて devilspie を起動しておけば良い。

; Window Title: 'Kana-Kanji Conversion'; Application Name: 'kinput2'; Class: 'Kinput2';
(if (and
      (is (application_name) "kinput2")
      (is (window_name) "Kana-Kanji Conversion"))
  (begin
    ;(debug)
    (above)
    (undecorate)))

もう少しまともな解決策として kinput2 の閉じるボタンを消せないかと思って、 xprop コマンドで _NET_WM_ALLOWED_ACTIONS から _NET_WM_ACTION_CLOSE を消せないかと思ってがんばってみたが、xprop コマンドの -set で複数 ATOM の設定が出来なくて困ってしまった。

結局 (kinput2 で使われている) X Toolkit のサンプルアプリを元にがんばってみたところ、 http://gist.github.com/210010 のように _NET_WM_ALLOWED_ACTIONS から _NET_WM_ACTION_CLOSE を消せば期待通り閉じるボタンが消えることがわかった。(window manager の閉じるボタンや左上のところをクリックしたときのメニューから閉じるが出来なくなるだけで Alt+F4 では閉じることが出来る)(XtAppMainLoop の前だと _NET_WM_ALLOWED_ACTIONS が設定されてなくて、設定しても何かに上書きされてしまったので、 XtAppAddTimeOut で後からいじっている。)

しかし、 etch の devilspie には spawn_ で始まる別コマンドを起動するコマンドがなかったり、 _NET_WM_ACTION_CLOSE を消すのは単独のプログラムで実験しただけだったりという状態なので、 etch の kinput2 では現状は上のように window 装飾を消すだけで対処するしかないかもしれない。

そもそも kinput2 を改造するという方針にするのなら、閉じるボタンで終了してしまわないようにした方が良さそうに思う。