WordPressでリバースプロキシを介すると301ループする/X-Forwarded-Forが反映されない

301ループ

リバースプロキシ(DeleGate)の向こうにあるWordPressが301ループするという問題だ。

これはWordPressのサイトアドレスをDeleGateがアクセスするものにしておけば問題は発生しない。 ただし、リバースプロキシを置く以上、バックエンドのアドレスは隠蔽したいわけで、これは望ましくない。

一見、MOUNTオプションとしてvhostでなくnvhostを使用することで解決できるかに思えたが、実際は解決しない。 問題がHostヘッダにあるのは間違いない。

調べると、requested_urlredirect_urlが異なる場合に301でリダイレクトする、ということがわかる。 DeleGateはどうしてもHostヘッダは自分で生成してしまう(スルーしてくれない)ため、Hostを元に生成されるrequested_urlと、サイトアドレスを元に生成されるredirect_urlが一致しない。

そこで、起動設定に以下を加えた

HTTPCONF="add-qhead:X-Forwarded-Host:%I"

だが、WordPressがX-Forwarded-Hostを拾ってくれないのか、それともjournal.reasonset.net:80とポートを含めるためなのか、これだけでは動作しない。

そこで、wpconfig.phpに以下の記述を加えた

$_SERVER['HTTP_HOST'] = "journal.reasonset.net";

Hostが違う場合は無視することになってしまうが、まぁ良いとしよう。 ちなみに、X-Forwarded-Hostの値を代入しても、やはりポートを含むためなのか、動作しない。

X-Forwarded-For

DeleGateでX-Forwarded-Forを設定する方法は

HTTPCONF="add-qhead:X-Forwarded-For:%a"

であるが、これで正しく動作しない。 X-Forwarded-Forの値をとるとどうしてもDeleGateの値になってしまう。

どうも、ブログを設置しているXDomain側もリバースプロキシをもっていて、そこでX-Forwarded-Forを設定しているようだ。

仕方ないので、別の値も与えておく

HTTPCONF="add-qhead:X-Forwarded-Delegate-For:%a"

wpconfig.phpでこちらを使わせる

$_SERVER['HTTP_X_FORWAREDED_FOR'] = $_SERVER['HTTP_X_FORWARDED_DELEGATE_FOR'];

これで実際のアドレスを拾わせることができるようになった。

サーバーをManjaro i3に

サーバー(ProLiant Microserver, Manjaro Linux LXQt)が、起動中にコケるようになっていたので、Manjaro i3で作りなおしてみた。

バックアップ作業

単純にsystemdユニット、そこから呼ばれるスクリプトと設定ファイルをバックアップした。
後にfstabもバックアップする必要があったことに気づく。

i3 Window Manager

i3 window managerは、タイル型ウィンドウマネージャだ。

タイル型ウィンドウマネージャというと、AwesomeやXMonadが有名だが、Manjaroで最も活発なのはi3だ。i3, XMonad, bspwmの比較を見ても、最も人気があるのはi3であるようだ。

Awesomeと比べると利点は多い。マルチディスプレイに対応しているというのが大きいのではないか。

bspwmもManjaroではCommunity buildのあるウィンドウマネージャだ。bspwmのほうが、ウィンドウに隙間があってスタイリッシュだが、i3のほうがとっつきやすい。ちなみに、Gnome3をi3で使っている人もいるようだ。なかなか変態的だ。けれど結構使いやすいのではないかという気もする。
ここまでカスタマイズすれば作業環境は快適だろう。

机でちゃんとした作業スペースがあるわけでもなく、膝の上の小さなキーボードの上でも扱いやすい、また複数のモニタープログラムを並べ、状況を把握したい場合にGUIを立ち上げてコンソールを叩くようなケースも考えられるのだし、サーバーにi3というのはベストな選択なのではないか。

i3やbspwmというとArchばかり出てくるが、それはArchであれば環境構築が楽なGUIとしての選択肢にもなりうるし、そもそもArchでもなければなかなかパッケージもないからだろう。

非常に機能的で使いやすいウィンドウマネージャだ。

Manjaro i3

Community buildではあるが、Manjaroにはi3 Editionが存在する。
ウィンドウマネージャの操作感こそ違うが、全体的な印象としては変わらない。Thusインストーラもそのままだ。インストール手順も、LUKSやbtrfsに関するソフトウェアも変わらない。

Manjaro Welcomeはいきなりフローティングウィンドウで表示される。
フローティングウィンドウはタイルとは完全に独立として表示され、マウスでフォーカスすることになる。ちなみに、クリックフォーカスではなく、オーバーフォーカスである。

ModはSUPER(Windows)に設定されている。Mod+Enterでターミナルエミュレータを開くことができる。基本的な操作方法は画面に表示されているし、mod+Shift+hでヘルプを表示できる。

なお、フリードライバで起動する必要があった。

アップデート

キーリングがおかしなことになってしまうので

# pacman-key --init
# pacman-key --populate archlinux manjaro
# pcaman-key --refresh
# pacman -Syuu

その間にavahi-daemonとsshdをenableしておく。mdns_minimalは既にエントリに記載されており、問題ない。

さらに、/etc/default/grub にデフォルトオプションとしてsystemd.unit=multiuser.targerを追加しておく。
グラフィカル起動する時は、Grubでオプションを編集して削る。

再起動したら、

# mhwd-kernel -i linux45

Linux 4.5はまだRC1だが、問題なく動作した。

設定

退避したファイルを戻すのだが、tarパイプでファイルとして保存したものを、tarパイプで戻そうとするとパーミッションを書き換えられてしまうので要注意。一度これでやり直しになった。

/etc/fstabを書いて完成だ。

i3は良いけれど

Synapticsによる設定をちゃんとしていれば結構快適だったりするし、Cinnamon/Plasma/XFceはタイリングもでき、便利なアプレットもあったりするので、実際に選択する機会は少ないかも。

自前PostfixサーバーとGMail

自前のメールサーバーからGMailにメールを送ると

<*.com>: host
gmail-smtp-in.l.google.com[2404:6800:4008:c02::1b] said: 550-5.7.1
[2001:2e8:649:0:2:1:0:11 12] Our system has detected that this
550-5.7.1 message is likely unsolicited mail. To reduce the amount of spam
sent 550-5.7.1 to Gmail, this message has been blocked. Please visit 550
5.7.1 https://support.google.com/mail/answer/188131 for more information.
kt7si2092671igb.13 – gsmtp (in reply to end of DATA command)

のように言われてしまう。

迷惑メールとしてブロックされてしまうのだ。されない場合もあるが、その原因がよくわからなかった。

色々と調べた結果、どうもDNSレコード内にSPFの記述が欠如していると配送されない、ということのようだ。

SPFは、メール配送においてそのドメインから贈られたメールとして受け取るべきサーバーのアドレスを示すものだ。そのアドレス以外からは当該ドメインのメールを受け取らない、というポリシーにすることによって、なりすましを防ぐ、らしい。

SMTPがちゃんとリレーしてくれない昨今、ローカルSMTPが使えなくなる原因ともなり、ひたすらやりにくい気がするが、まぁなりすましメールを防ごうというわけだ。

SPFはTXTレコードとして存在し、うちの場合

v=spf1 +ip4:27.120.84.145 +ip6:2001:2e8:649:0:2:1:0:11 ~all

となっている。これによって、@reasonset.netからのメールは、このアドレス以外のサーバーから配送された場合はなりすましメールとみなし、排除してよい、という情報を与えることとなる。
GmailはSPFを必須とするようだ。

SPFレコードを追加したが、それでもGMailに拒否される。
どうやら、AAAAレコードも必要なようだ。AAAAレコードを追加したところ、拒否されなくなった。
ただし、失敗を繰り返したアドレスに対してはいばらく送ることができなかった。

Pureminder (リマインダ)とZsh socket programming

Tasqueにはリマインダ機能がない。

Taskcoachということも考えはするが、残念ながらTaskcoachは私の環境ではSystem trayに収まってくれないため、非常に邪魔である。

そこで、リマインダを作ってみた。GitHubで公開している。今回はどちらかというとNoddy寄りだが、きちんとした形で公開している。

PureminderはZshで書かれている、クライアント/サーバーである。
サーバーはメッセージを受け取り、SOX(play)で音を再生し、Zenityで画面に表示する。

わざわざクライアントサーバーモデルをとっているのは、atでの利用に問題があるためだ。

単にatでcallすると、Zenityは表示すべきディスプレイサーバーを見つけられない。
$DISPLAY変数によって指定することはできるが、マルチユーザー環境での動作が信用できない。

そこで、確実に機能させるため、現在のデスクトップ上で起動し、ユーザー別に作られるUNIXドメインソケットでメッセージを受け取る、という仕様とした。

だが、PureminderはZshだ。
一般にはなかなか見かけることのない、Zsh socket programmingをちょっと紹介しよう。

まず、モジュールをロードする。

zmodload zsh/net/socket

次にzsocket -lでソケットを作成する。

zsocket -l "$sockfile"

$REPLYにファイルデスクリプタ(Integer)が入るので、とっておく。

typeset -g sock=$REPLY

zsocket -aで接続を待ち受ける。引数はソケットのファイルデスクリプタ。

zsocket -va $sock

$REPLYに接続のファイルデスクリプタが入る。この接続は全二重。
閉じる時は次のようにする。

exec {fd}>& -

ストレージワーク:btrfs+EncFS / dm-crypt+ZFSでのリモートミラー

Btrfs上にEncFSを構成したマスターから、dm-crypt上にZFSを構築したスレーブへとミラーする、しかもそれらのホストはシャットダウンされる。これはかなり厳しい条件だった。

やはりシャットダウンされるためにHA(高可用)システムは使えない。シャットダウンする時点で障害発生とみなされるし、切り離された状態で単独でスタートアップして動けない。

さらに、EncFSはrootであってもアクセスを許さないため、非常にセキュアではあるが、GlusterFS GeoReplicationも使えないなど障害になった。

やはり無理な要求である、というのは

LinuxQuestionで聞いてみても
明らかになるだけだった。だが、ここでrsyncが大規模システムに耐えるということが分かったため、rsync(1)at(1)でいこうと決意を固めることができた。

rsync+sshはごくごく単純だ。

rsync -e ssh fromdir user@host:destdir

でいける。だが、まずはZeroconfでアクセスしたい。

Manjaroで/etc/nsswitch.confmdns_minimalを指定しても解決できない。これでホスト名を解決しようと思うと、nss-mdnsパッケージをインストールし、avahi-daemonを動かさなくてはいけない。

さらに、CentOS側が受け入れてくれない。これは、NICがひとつだとそのNICをpublicなゾーンのインターフェイスとみなすが、Avahiはhomeインターフェイスにしか許されていない。そのため、firewall-cmd --add-service=avahi --zone=public --permanentとしてAvahi-daemonへのアクセスを透過する。

これでZeroconfでのアクセスに成功、.localのホスト名でsshアクセスできる。ssh-keygenでパスフレーズなしのキーを作り、アクセスしようとする。ところが、ssh-copy-idしようとした段階でToo many authentication failures for …となり、sshアクセスできない。これは、sshの管理下にある鍵が多すぎる場合に生じるようだ。その数はsshdが登録、管理している鍵とファイルとして~/.ssh以下にある鍵の総数。とりあえずの方法としては、鍵ファイルがあるものだけを鍵として扱うため、~/.ssh/config

IdentitiesOnly yes

と書くと改善される。ただし、ファイル自体が多くなるとこれでもダメだろう。

これで鍵によるアクセスまでできるようになった。

鍵による実際のアクセスの前に、atとrsyncについて確認する。rsyncについては前述の通りで大丈夫。atは

$ <kbd>at now + 1 minutes &lt;&lt;&lt; ‘zsh -c "notify-send \"$(id)\""'</kbd>

すると自身のuidになっているので、atを実行したユーザーで実行されることが分かる。EncFSに対してアクセスするためにはこれは絶対条件だ。

そしてこのままrsyncするとうまくいく。だが、パスフレーズなしで自由にアクセスできる鍵というのは危険だ。

コマンドで制限すべきなのだが、rsyncのコマンドを受ける側がどうなっているのか、というのは非常にわかりにくい。rsync -vvv -au --delete-after -e ssh from destして、パスワードの前に表示されたconnectionの中からrsyncより前を削り、互いにvを削って設定する。

ただし、このままでは外部からファイルを消されるリスクがあるため、ホストも限定したほうがいいかもしれない。ただし、鍵がなければできないのだから、その時はバックアップ側は仕方がない、とも見れる。

今回の成果物も

GitHub
にて公開。

hp ProLiant MicroServerとCentOS 7とZFSonLinuxの話

ProLiant MicroServerにHDD組み込み

先週秋葉原で買ったHDDが、初期不良対象期間が土曜日までだったので、金曜日にProLiant MicroServerにHDDの組み込みを行った。

実際に開けたり調べた限りで分かるのは次のことだ。

  • HDD搭載個数は4個。ホットプラグではない
  • eSATA端子を装備。
  • 5インチベイ用はSATAでケーブルは付属せず。ただし、ここはIDEとして動作し、低速

とりあえず開けてみる。これが非常によくできていて、扉は鍵で開ける。工具は不要、付属の鍵を使うのだ。ちなみに、上部の5インチベイ部分については、扉を開けた上で後方のボルトヘッドを手で回し(ダイアル状になっていて、工具は完全に不要)スライドする。ボルトは外れるようにはなっていない。

扉は開くが、横倒しにしていると外れることがある。外れると横倒しのままではなかなか正しくはまらないので注意。正しく置いた時に上下とも下側に突起があり、穴に突起がはまるようになっている。なかなか考えられた構造だ。簡易でコストが安く、扱いやすく、壊れにくい。

ハードディスクはホルダーを介して止まっている。リリースボタンを押してレバーを解除し、レバーを引く。レバーが押しこみ防止になっているもので、若干この動作が恐い感触があるが、精度はしっかりしていてブレる心配はない。封印された4台が備えられ、左に500GBのハードディスクが収まる。このハードディスクは裏面がカバーされたサーバー向けのタイプ。具体的にはWD5003ABYX。7200rpmのエンタープライズ、イエローだ。

今回は4TBx1,3TBx3に換装する。ホルダーについては特殊なネジで止められているが、扉の裏側にホルダー用のネジと工具がある。ちょっと探してしまったが、上手いものだと思う。紛失の心配もなく、コンパクトで、面倒もない。また、ホルダーのネジは予備もある。5インチベイ用のネジもここにある。こちらは六角。

順次固定していく。非常に簡単な作業だ。若干ネジまわしが疲れるくらいか。特にケース側はしっかり入っているのと、ネジを落とさないようにしなくてはいけないのが疲れる。数も多いし。

固定したらこれらを閉めて各種インターフェイスを接続、USB光学ドライブを接続しSystemRescueCDで起動。for i in /dev/sd[a-d]; do smartctl --all "$i"; done | lessとして問題がないことを確認した。

ProLiant MicroServerについて

15000円ほどの安価な、いわゆる安鯖、廉価サーバーだ。非常に安価でありながら現代的な性能を持つコンピュータであり、特にまともなコンピュータを持つもたない人にとってはとりあえず購入しておいてもいいというような代物といっていい。

ただし、普通のデスクトップコンピュータ、今の感覚で言うと普通ではないが、とは差異があることを理解しておかなくてはならない。つまり:

  • サスペンドはできない。ハードウェア的にサポートされていない
  • グラフィックスは非力であり、出力はVGA(D-Sub15)である
  • 基本的に枯れたハードウェアを採用。また、CPUは低速で消費電力が低いものを使用
  • OSなし
  • このモデルについては光学ドライブもない
  • ハードウェアがサーバー向けであるため、Windowsではサポートされない可能性がある

だが、サーバーだからこそのメリットもある

  • 24時間稼働に対応
  • ECCメモリーを使用
  • 低消費電力
  • 高信頼性

だが、このProLiant MicroServer Turion II NEO N5 F1F35A0-AAAEに関して言えば、PCI-E x16をロープロファイルながらサポートするため、普通にデスクトップとして使用できる。電源が200Wなのでハイパワータイプはとてもではないが使えないが、ローエンドモデルの接続は可能だ。ただし、ディスクを最大5台積める仕様なので、それだけでいっぱいいっぱいではあるだろう。

とはいえ、別に高性能を目指すようなものではないし、VGAで十分だと私は思う。CPUの性能も高くないし、デスクトップとしてバリバリ使うものではないだろう。だが、ちょっとした用途には十分事足りる。

サーバーとして見ると、この小さな筐体にHDDを4台搭載した上にeSATAディスクも搭載可能、というのは非常に大きい。ただし、eSATAの使いどころはかなり難しい。台数が多いケースは高いし、内蔵に使うにしても引き込めない。予備インターフェイスと考えたほうが良さそうだ。

しかし単純に考えて、筐体自体はHDD6台がCapableであるというのはすごい。しかも、小型の筐体だけに中に手を突っ込めるようにはなっていないが、上部パネルと同じく手回しボルトをゆるめることでMB全体を引き出すことができる、と非常に考えられた設計だ。

さらにECCメモリを搭載するということもあるが、それ以外を見ても非常に安定している。自作機とは比べるべくもないが、厳しく検証を重ねて安定したものと比べても非常に安定している。

さらにBIOS画面の待ち時間はやや長く、しかも入力のためのステップを複数用意する。もしブートデバイスがみつからなくても、そこでブータブルメディアを挿入すると自動的に認識して起動してくれる。つまり、とりあえず起動してからディスクを挿入することが可能。さらに、起動や終了のタイミングでのトレイオープンも可能。デスクトップだと起動時に起動される前にトレイオープンができないため、メディアの挿入/排除が結構大変だ。しかも、ProLiantならゆっくりメディアを入れても大丈夫。

いくつかの問題も発生しているが、ハード自体は極めて安定しており、信頼性も高い。

その上に扉、トレイ、固定方法など非常に心配りのされたつくり。hpが好きになった。

CentOS7

一方、なかなか手ごわいのがCentOS 7だ。

Linuxはサーバー向け、という人がいるが、実際にLinuxのサーバー向けディストリビューションというのは多くない。どちらかといえばEnterprise Server向けだ。

一般的な選択肢は、まず最大シェアのRHEL/CentOS/Scientific Linux/Oracle Linux/Whitebox Enterprise Linux。その対抗馬はSLES、あるいは無償のUbuntu Server、サーバーユースにも耐えるとされるDebian/GNU Linux、あとは枯れた仕様・原始的なシステムのSlackware Linuxくらいのものだ。

この中でフリーというと、RHELクローンか、Ubuntu Serverか…と選択肢は非常に少ない。別にサーバーユースにはできるが、サーバー向けにはなっていないため、長期の安定運用には不安が残るし、実績の問題もある。

CentOSがダメだとは全く思っていないのだが、やはりFirewalldとNetwork Managerという新しいシステムの導入が厳しい。その設定について覚えなくてはならないからだ。

それになんだか動作がおかしい。設定したLUKSロングパスフレーズが、有効に働かないのだ。調べてみると

ディスク選択時に「データを暗号化」+LVMでPVを暗号化
Dracut内で復号できない。他システムでならば復号可能
ディスク選択時に「データを暗号化」+パーティションを暗号化
正しいはずのLUKSパスフレーズを受け付けない
ディスク選択時に暗号化を選択せず、パーティションを暗号化
正常に動作する

openSUSEでもLUKSが突然パスフレーズを受け付けなくなることがあり、正直「LUKSっていまいち」と感じている。もしくはcryptsetupがいまいちなのかもしれない。今回もなんども再起動し、SystemRescueCDと入れ替え、インストールし直し、と繰り返すこととなった。

かなり疲れてしまった。また、インストーラがかなり扱いにくく、自由にパーティションが切れない。予めパーティションを切っておき、ディスクを選択してから、その他を選択して進めるのがよさそうだ。ちなみに、GPT用パーティションを切っていないと警告される。openSUSEのインストーラはそこが不完全だったので嬉しいところ。

まずはdm-cryptの直接暗号化を使ったスーパーディスクが使えるかを試してみる。

$ <kbd>dd if=/dev/urandom of=keyfile bs=512 count=1</kbd>
$ <kbd>sudo cryptsetup –hash=sha512 –cipher=twofish-xts-plain –offset=0 –key-file=/home/aki/keyfile –key-size=512 open –type=plain /dev/sdb enc</kbd>
$ <kbd>sudo mkfs.ext4 /dev/mapper/enc</kbd>
$ <kbd>sudo mount /dev/mapper/enc /mnt</kbd>
$ <kbd>su -c ‘echo Hello, world &gt; /mnt/hello'</kbd>
$ <kbd>less /mnt/hello</kbd>

問題なし。次にZFS環境のセットアップに入る。


zfsonlinux.org/epel.html
を参考にするが、既にバージョンが進み、ファイル名は2015-02-06時点でepel-release-7-5.noarch.rpmとなっていた。

また、

Qiita
ではインストールしただけではダメというようにあるが、実際はインストールしただけで大丈夫だった。

以下はZFSの作成作業。

# <kbd>zfsmount.zsh</kbd> #各デバイスをループで暗号化。zfs_*という名前。オープンしていたものは事前にclose
# <kbd>zpool create ReasonZpool /dev/mapper/zfs_*</kbd> #Zpoolを作成
# #ここでプールをテスト。問題なし
# <kbd>zfs create ReasonZpool/world</kbd> #worldファイルシステムを作成。マウントポイントは<tt class="puredoc_pathname">/ReasonZpool/world</tt>
# <kbd>zfs get all ReasonZpool/world</kbd> #プロパティの確認
# <kbd>zfs set compress=gzip-9 ReasonZpool/world</kbd> #Gzip最高レベルでの圧縮。低速。
# <kbd>zfs set primarycache=metadata ReasonZpool/world</kbd> #キャッシュはメタデータのみ。メモリ消費量を削減。
# <kbd>zfs set acltype=posixacl ReasonZpool/world</kbd> #POSIX ACLを有効に
# <kbd>zfs set relatime=on ReasonZpool/world</kbd> #Relatime(atimeの記録を遅延させる)
# <kbd>#zfs set dedup=on ReasonZpool/world</kbd> #重複排除機能をON。メモリを大ぐらいするらしい。全域に使えるだけのメモリはない。1TBで32GBのメモリを必要とし、操作できないほどの状態になるとのことで今回は諦める。
# <kbd>zfs set setuid=off ReasonZpool/world</kbd> #nosuid+nodev

dedupの難しさについてはこんな記述がある。

しかし,この機能,ディスクは節約されるが,メモリをたくさん使うのだ.なぜかというと,メモリ上に DeDuplicationTable (DDT) と呼ばれるテーブルを準備することによって,重複を見つけているのである. 計算手順は省略するが,1TBを利用している場合に最大で約32GBのメモリを必要とし.メモリから溢れた分はディスク上のキャッシュに退避され,検索パフォーマンスが劇的に低下する.

著者が試したときにはあまりのメモリ不足のために,データセットの削除ができない程の状態となった.(1週間程度経っても完了せず,あきらめてプールごと破壊することにした)

恐らくはおとなしくHDDを増やしていくほうが現状マシだ。

さらに、usersグループを規格に沿って500に変更し、ユーザーのグループをusersに変更する。

あとはお約束。

  • ストレージを使う前にzfsmount.zshを実行する
  • ReasonZpool/worldを使う

サイト/サーバーに関する作業

HTTPSの無効化

HTTPでのアクセスを推奨しつつHTTPSのアクセスを可能にしていたのだが、証明書エラーを気にする方が多いので、そもそもHTTPSアクセスを無効にした。

HTTP推奨、HTTPS対応、SSL証明書無効というのは、実はUFJ銀行と同じなのだが(amakai.netの証明書を使用している。ゆうちょ銀行も似た方法。ちなみに、三井住友とりそなはNot Foundを返すようになっている。みずほはHTTPSが稼働していない)、どうしても警戒するらしい。

問題は、現代的なブラウザはスキームなしだとHTTPSから試してしまう上に、無効な証明書に対してセキュリティソフトが警告を出すこともあるためだ。

私の個人サイトだけなら別にいいのだが、仕事のほうのサイトでは受注に響く可能性が高い。そのため、そもそもHTTPSを無効化するという措置をとった。HTTPSは技術要求的な意味合いが強く有効にしてきたが、証明書の問題はコストの問題となるため、かなり難しい。もちろん、その構築が複雑である、という問題もある。

MozillaとEFFが、無料で簡単にHTTPSを使えるようにするためのものを用意しているらしいので、それに期待するしかない、といったところか。SSL証明書に関する悪質な利権主義が私は大嫌いだ。一部の人たちが「私達が認証局です」と名乗り、その身内か大金を払ったところが認証局となり、認証してほしかったら金を払えという。SSLの認証の仕組み自体が、利権を生むために作ったものだとしか思えないひどいものだ。

だからSSL証明書をとることは、金銭的にだけでなく、心理的にもかなり嫌だ。

PCの基礎知識の講座up-to-date

彼女にPCに関する知識をつけてもらわないといけないので、全然な人が日々覚えていくことで私の実務に使える知識が身につく講座をスタート。

メールで送っているものを転載している。

http://reasonset.net/chienomi/essay/articles/steady-study.html

CSS

CSSを更新したのだが、気づいたことがある。pre-wrapに設定されている場合などで、「折り返した行をインデントする」ということができない。だからおそらくはJavaScriptで論理行に交互に色付けすることが一般的になっているのだろうと思うが、それはあまり好みではない。

wrapされた行を指定するセレクタ、あるいは要素中の論理行を表すセレクタが欲しい。

ケータイのメール、eメール、VPS

ケータイのメールに関する設計がおおよそ固まった。結構複雑な構成なので試行錯誤となったが、いい感じになった。なお、今回は一般ユーザーが真似するのは難しい話になるが、一般ユーザーでも応用可能な方法を最後に紹介する。

やり方

まず、ケータイはWILLCOMのフィーチャーフォン(A)とスマートフォン(B)の2台だ。主にAを使用しており、現在のところBの用途は定まっていない。これは、Bのほうが多様に使うため、バッテリー的な理由だ。

「ケータイアドレス」はA、B共にある。Aはもちろん、Bも届くと直ちに自動で受信される。着メロや振り分けにも対応する。

基本的にケータイのメールをPCで扱いたい。打つのもバックアップもそのほうがずっと楽だ。そのような理由でまずメールの転送を考えるのだが、Aは転送ができるが、WILLCOMのスマートフォンであるBは転送できない。Yahoo Mobile Mailに属するサービスなので、恐らくソフトバンクでもできない。これは困った。

まずVPSのaliasを使ってケータイのバックアップ用のアドレスを作る。単純に共有するには、Aから転送されるそのaliasでPCとBに送るようにすればいい。だがこの場合、Bに送られたメールは孤立する。Bは転送できないため、この問題をこのアプローチで解消できない。

そこで、メール機能の設定でReply-Toヘッダを入れるようにし、返信時に他のアドレスに届くようにする。その受信アドレスはAliasとし、PCとスマホに転送する。

ここまでを実現するには次のことをしなくてはいけない

  • スマホのアドレスを教える時は転送用のアドレスも一緒に教え、送る時はそちらのアドレスに送るように頼む
  • PCからのメールを受信できるようにしてもらう
  • なりすまし防止機能をoffにする。でないとPCからケータイのアドレスで送った時にはじかれる(ソフトバンク、WILLCOMでは必須の設定)

オープンに使うには相手に頼まなくてはいけないことが多く、ややハードルが高い。クローズドなアドレス向きだ。

だが、これではAに送られたメールはAliasによってBとPCに行く。だが、Bで返信してしまうとAにはいかない。もしこれでAに行くようにしてしまうとループする。AのメールをBで扱うことができない。BのメールをAで扱いたいことはさすがにないと思うが、Aの絶望的な入力効率を考えると、バッテリーを気にしなくていい状況ではBで打ちたいところだ。

そこで、Android端末であるBにK-9 Mailを入れた。これはIMAPマルチアカウント対応のMUAである。これがなかなかすぐれもので、アカウント設定に加えて送信メールアカウントを設定できる。Aliasを使っている場合、ひとつのIMAPメールボックスに配送されるが、アドレスはひとつでないという状況になるわけだが、IMAPメールボックスのみを設定し、その上でそのメールボックスに追加のメールアドレスを設定するだけで対応できるのだ。

送信アドレスごとの署名、SSL/STARTTLSの設定、ポート設定など結構細やかにできる。複数のIMAPアカウントにも対応し、扱いやすい。K-9 Mailのアドレス帳はスマホのものをそのまま使用する。

だが当然ながらこのメールボックスPCで扱っている時もあるし、同期してほしくない時がある。なぜか「同期しない」設定にしているとリアルタイムに同期されてしまう。これは結構困る。同期設定はアカウントごとに可能だ。

方法としては、同期して欲しい時はグローバル設定で同期設定を「常に」、してほしくない時は「しない」に切り替えることでそれをコントロールできる。これでかなりいい感じになる。

そしてIMAPアカウントとしてAから転送されるアカウントを設定し、送信アカウントとしてAのメールアドレスを設定すれば完了だ。標準でストアする送信済みメールは自動で消されてしまうので、フォルダの設定でIMAPフォルダを指定しておく(普通はsentだろう)。

BからAのメールを扱う時はK-9 Mailを起動する。この方法の欠点は、K-9 Mailができる通知は通知だけなので、誰からメールがきたかによって通知方法を変えることができない。ランプ色や着信音などだ。もちろん、Bに直接送られたメールについては問題ない。

VPSを用いない応用

柔軟かつ簡単に設定でき、管理もできるということでVPSのアドレスを使っているが、それが嫌なら方法はある。

転送ができるアドレスと、IMAPアクセスができるアドレスを用意する。転送ができるアドレスは複数アドレスへの転送ができなくてはいけない。転送用アドレスは1つでいい。BとPCに転送されるようにすれば、Aのほうは転送設定ができるので、転送設定でその転送アドレスを指定すれば両方に、PCだけを設定すればAとPCに届くようになる。Bは転送アドレスをそのまま使う。

あとはIMAPアクセスすれば良い。Yahooは猛烈にレスポンスが悪いのでオススメしない。IMAPメールボックスはかなり遅いところが多い。VPSのものとは雲泥の差だ。

早いのはGMailだが、GMailはあまり好きでない。GMailを使えばK-9 MailでなくGMailの純正クライアントを使うこともできる。

DeleGateでHTTPSリバースプロキシ

私のサイトはずっとhttpsで接続できなかったのだけれど、ようやく手を入れることにした。

HTTPSによる接続自体はできるのでサーバーは動いているし、ファイアウォールも阻害していない。証明書関連の問題だと判断できる。

DeleGate + SSLについての情報は大概が古く、SSLwayについてしか言及されていない。DeleGateの最新マニュアルを見ると、STLSというビルトインTLSフィルタを持ち、またビルトイン匿名証明書を持つため証明書も不要であるように思える。ではどう使うのか??

jfuruyaのブログに答があった。DelegateのパラメータとしてSTLS=”fcl,fsv:https”を渡す必要があるのだ。しかしこれだとHTTPでアクセスするとはじかれる。ちなみに、SERVER=httpではhttpsで接続しろと言われる。マニュアルを確認、どうもSTLS=”-fcl,-fsv:https”であるべきであるということが分かった。

しかしそのままでいくとスタイルシートが表示されない。どうやら、httpsでページを表示しているのにhttpでスタイルシートをロードしているのが問題らしい。つまり、リンクはhref=”http://…”ではなく、一般には説明されない書式でスキームを維持するhref=”//…”形式にしなくてはいけないようだ。

とりあえずこのような特殊な接続をする人はいないと思うので、全体は修正していないが、ビルド時にテンプレートを変更するので、サイト全体をビルドする時には直る、はずである。

Mail Virtual Alias @ CentOS 6

メールサーバーの本運用は通常virtualであるはずだ。メールアカウントの数だけユーザーアカウントがあるというのは考えられない。

ただし、私の場合はサブドメインをバーチャルエイリアスにするため、バーチャルドメインが必要になる。

新しいDovecotに関する情報がなく苦労したが、http://vogel.at.webry.info/201312/article_10.htmlの通りにやってみた。大体これでうまくいったのだが、私の場合はいくつかひっかかった点があった。

まず、hown -R mailuser ~mailuserをちゃんと実行しておかなくてはいけないこと。vmailboxファイルは最後に/をつけ忘れるとmbox形式になってしまうこと。

しかしこれではPOPの認証がfailedとなる。調べてみると、このサイトにはデフォルトでコメントアウトしているauth-passwdfile.conf.extのロードをしていない。

[root@server ~]# grep -R auth-passwd /etc/dovecot
/etc/dovecot/conf.d/10-auth.conf:#!include auth-passwdfile.conf.ext

さらに、パスワードファイル認証も無効化されている。

[root@server ~]# grep disable /etc/dovecot/conf.d/10-auth.conf
#disable_plaintext_auth = no
# Authentication cache size (e.g. 10M). 0 means it’s disabled. Note that
# 0 disables caching them completely.
# NOTE: See also disable_plaintext_auth setting.

この2点を修正したが、それでもエラーになる。原因はパスワードファイルのファイル名(設定ではなくファイル自体)が間違っていたためのNo such file or directoryだった。

さらにPostfixからのDovecot認証の利用は情報が錯綜してよくわからない状態だったが、結局のところ/etc/dovecot/conf.d/10-master.confのPostfixから利用するコメントアウトをはずすだけでエラーは出なくなった。しかしながら、認証自体がうまくいかない。userとgroupの設定を追加したが、元々666なのだから、効果はなかった。明らかに問題はPostfixにあり、Dovecotはこれでいいだろう。

telnetを打ってみると25番ポートが反応しない。ここでOP25Bによるものだと気付いた。

submissionの設定を探してみると、master.cfにsubmissionの項目があり、このコメントアウトをはずせばsubmissionは機能する。しかしながら

submission inet n – n – – smtpd
# -o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING

TLSを強制するとTLSが機能しない。とりあえず、TLSは要求しないことにした(encryptでなくmayにしておく)。

しかし、それでも544 host access deniedという応答で送ることができない。調べてみると、さらに別のパラメータを設定する必要があるようだ。main.cfに記述する。

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_relay_restricions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
broken_sasl_auth_clients = yes

さらにスペルミスにもひっかかってしまったが、これでうまく通った。TLSが上手く動かない以外は正常だ。

TLSについて調べてみると、どうも鍵にパスフレーズがかかっていると使えない、ということだ。そこで、次のようにして問題の解決を図る。

[root@sesrver]# openssl genrsa -aes128 1024 server.key
Generating RSA private key, 1024 bit long modulus
.++++++
…………………….++++++
e is 65537 (0x10001)
Enter pass phrase: #ここでは普通にパスフレーズを入力する
Verifying – Enter pass phrase:
[root@dti-vps-srv71 certs]# openssl rsa -in server.key -out server.key #これによってパスフレーズを消滅させる
Enter pass phrase for server.key:
writing RSA key
[root@dti-vps-srv71 certs]# openssl req -new -x509 -key server.key -days 3650 -out server.crt # certファイルを作る
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [XX]:JP #カントリーコード
State or Province Name (full name) []:Kanagawa #神奈川
Locality Name (eg, city) [Default City]:Yokohama #横浜
p {[
“さらにスペルミスにもひっかかってしまったが、これでうまく通った。TLSが上手く動かない以外は正常だ。”,
“TLSについて調べてみると、どうも鍵にパスフレーズがかかっていると使えない、ということだ。そこで、次のようにして問題の解決を図る。”
]}

sb { -END
[root@sesrver]# openssl genrsa -aes128 1024 server.key
Organization Name (eg, company) [Default Company Ltd]:HarukaSound #組織名
Organizational Unit Name (eg, section) []: #部署はない
Common Name (eg, your name or your server’s hostname) []:reasonset.net #FQDN
Email Address []:master@reasonset.net #メールアドレス
[root@dti-vps-srv71 certs]# openssl x509 -in server.crt -outform der -out server.der # derファイルの生成

これで鍵の生成は完了。ファイル名が若干変わったので、main.cfを修正。さらに、DovecotのSSLが設定されていなかったので、/etc/dovecot/conf.d/10-ssl.confを修正(ssl = yesのコメントアウトをはずし、ファイル名を修正)。

そしてmaster.cfencryptに戻して完了。STARTTLSが正しく働くようになった。