postfixの勉強 #4

以下の続き.
postfixの勉強 #1 - NK5のノート
postfixの勉強 #2 - NK5のノート
postfixの勉強 #3 - NK5のノート

Postfixが受け取ったメールはcleanup(8)の正規化を経て,
incomingキューに投入され,それをqmgr(8)が拾う,という話だった.

qmgr(8)は,incomingキューに届いたメールを
「このメールは自分宛?それとも他所宛?」
と仕分けしてくれる.
仕分け自体はtrival-rewrite(8)というデーモンが代行するようだ.

Postfix manual - qmgr(8)
Postfix manual - trivial-rewrite(8)

自分宛だったら,自分の然るべきディレクトリにメールを格納するし,
他所宛だったら,別のメールサーバに転送する.

さて,今までの記事では他所宛,すなわち「送信」しかしてこなかったが,
どうせならここで「受信」も出来るようにしてみようと思う.

そもそも,何もせずに,Postfixにメールを送ろうとしたらどうなるか?
試しに外部からpostfixサーバ(172.17.0.2)の25番ポートにtelnetしてみる.

# telnet 172.17.0.2 25
Trying 172.17.0.2...
telnet: Unable to connect to remote host: Connection refused

このように,残念ながら拒否される.
Postfixは,main.cfにinet_interfacesというパラメータを有しており,
ここに書かれている者以外の利用を認めないからである.

Postfix設定パラメータ

なので,これを以下のように修正する.

# vi /etc/postfix/main.cf
(編集作業,中略)
# grep "inet_interfaces =" /etc/postfix/main.cf
inet_interfaces = all

# postfix stop
postfix/postfix-script: stopping the Postfix mail system
# postfix start
postfix/postfix-script: starting the Postfix mail system

allというのは,「全部許容しますよ」という意味.
上記まで実施したら,改めて外部からtelnet.今度はうまく繋がる.

# telnet 172.17.0.2 25
Trying 172.17.0.2...
Connected to 172.17.0.2.
Escape character is '^]'.
220 3832cc77bd2d.localdomain ESMTP Postfix
quit
221 2.0.0 Bye
Connection closed by foreign host.

さらに,メールを受信できるように,以下のように設定しておく,

# vi /etc/postfix/main.cf
(色々と編集,中略)
# grep "mydomain =" /etc/postfix/main.cf
mydomain = oreore.com
# grep "mydestination =" /etc/postfix/main.cf
mydestination = $mydomain
# grep "home_mailbox =" /etc/postfix/main.cf
home_mailbox = Mailbox

# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

それぞれ,
・自分のドメイン名はoreore.comです
・自分宛のメールはmydomain(先ほど設定したoreore.com)です
・メールは各ホームディレクトリの「Mailbox」というファイルに格納します
という意味となる.

試しに外部からtelnetでroot@oreore.com宛でメールを送ってみる.

# telnet 172.17.0.2 25
Trying 172.17.0.2...
Connected to 172.17.0.2.
Escape character is '^]'.
220 3832cc77bd2d.oreore.com ESMTP Postfix
HELO hogehoge
250 3832cc77bd2d.oreore.com
MAIL FROM:<tekitou@tekitou.com>
250 2.1.0 Ok
RCPT TO:<root@oreore.com>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
FROM:tekitou@tekitou.com
TO:root@oreore.com
SUBJECT:Test Mail
test mail
.
250 2.0.0 Ok: queued as D62D860138FD
quit
221 2.0.0 Bye
Connection closed by foreign host.

送れたっぽいメッセージが表示されている.
さっそく,Postfix側のログとディレクトリを確認してみる.

# journalctl -n 7
-- Logs begin at Sat 2017-03-25 08:35:13 UTC, end at Sat 2017-03-25 10:16:50 UTC. --
Mar 25 10:15:41 3832cc77bd2d postfix/smtpd[429]: connect from (telnetしたマシンのホスト名)[172.17.0.1]
Mar 25 10:16:12 3832cc77bd2d postfix/smtpd[429]: D62D860138FD: client=(telnetしたマシンのホスト名)[172.17.0.1]
Mar 25 10:16:49 3832cc77bd2d postfix/cleanup[432]: D62D860138FD: message-id=<>
Mar 25 10:16:49 3832cc77bd2d postfix/qmgr[428]: D62D860138FD: from=<tekitou@tekitou.com>, size=292, nrcpt=1 (queue active)
Mar 25 10:16:49 3832cc77bd2d postfix/local[433]: D62D860138FD: to=<root@oreore.com>, relay=local, delay=48, delays=48/0.12/0/0.08, dsn=2.0.0, status=sent (delivered to mailbox)
Mar 25 10:16:49 3832cc77bd2d postfix/qmgr[428]: D62D860138FD: removed
Mar 25 10:16:50 3832cc77bd2d postfix/smtpd[429]: disconnect from (telnetしたマシンのホスト名)[172.17.0.1]

# ll /root
total 8
-rw------- 1 root root  432 Mar 25 10:16 Mailbox
-rw------- 1 root root 3354 Dec 14 14:59 anaconda-ks.cfg

# cat /root/Mailbox
From tekitou@tekitou.com  Sat Mar 25 10:16:49 2017
Return-Path: <tekitou@tekitou.com>
X-Original-To: root@oreore.com
Delivered-To: root@oreore.com
Received: from hogehoge ((telnetしたマシンのホスト名) [172.17.0.1])
        by 3832cc77bd2d.oreore.com (Postfix) with SMTP id D62D860138FD
        for <root@oreore.com>; Sat, 25 Mar 2017 10:16:01 +0000 (UTC)
FROM:tekitou@tekitou.com
TO:root@oreore.com
SUBJECT:Test Mail

test mail

無事,メールを受信できていることを確認した.

※なお,言うまでもなく,oreore.comなんてドメインは存在しない.
 正しく活用するためには,ドメインを然るべき場所で取得した上で
 DNSサーバにMXレコードを登録する必要があるが,今回は省略.

さて,ログをよく見ると,qmgrの後の登場人物が「local」になっている.
今までは「smtp」だったが,何が違うのか?


以外と長くなったので次回に.今度こそ次で終わり.

postfixの勉強 #3

以下の続き.
postfixの勉強 #1 - NK5のノート
postfixの勉強 #2 - NK5のノート

postfixは受け取ったメールをcleanup(8)デーモンでキレイにするが,
そのときにcanonical(5)に基づいて送信元/送信先を変換できる,
というところまでが,前回の確認事項.

変換手段としてもう1つ,virtual(5)も用意されている.

Postfix manual - virtual(5)

気を付けてほしいのは,同名のvirtual(8)というデーモンが存在すること.
最初それに気づいていなくて混乱した.
前回から(1)とか(5)とか(8)とか明記するようにしたのはそのため.

話を戻すと,virtual(5)の使い方は,canonical(5)とほぼ同様.
以下,設定からメール送付までの操作.
捕捉として,前回設定したcanonical(5)は無効化してます.

# ll /etc/postfix/
total 148
-rw-r--r-- 1 root root 20876 Jun 10  2014 access
-rw-r--r-- 1 root root 11681 Jun 10  2014 canonical
-rw-r--r-- 1 root root  9904 Jun 10  2014 generic
-rw-r--r-- 1 root root 21545 Jun 10  2014 header_checks
-rw-r--r-- 1 root root 27195 Mar 23 18:25 main.cf
-rw-r--r-- 1 root root  6105 Jun 10  2014 master.cf
-rw-r--r-- 1 root root  6816 Jun 10  2014 relocated
-rw-r--r-- 1 root root 12549 Jun 10  2014 transport
-rw-r--r-- 1 root root 12494 Jun 10  2014 virtual

# vi /etc/postfix/virtualtest
(ファイル作成,中略)
# cat /etc/postfix/virtualtest
■■■@gmail.com  〇〇@yahoo.co.jp
root    oreore@oreore.com
# postmap /etc/postfix/virtualtest

# ll /etc/postfix/
total 164
-rw-r--r-- 1 root root 20876 Jun 10  2014 access
-rw-r--r-- 1 root root 11681 Jun 10  2014 canonical
-rw-r--r-- 1 root root  9904 Jun 10  2014 generic
-rw-r--r-- 1 root root 21545 Jun 10  2014 header_checks
-rw-r--r-- 1 root root 27195 Mar 23 18:25 main.cf
-rw-r--r-- 1 root root  6105 Jun 10  2014 master.cf
-rw-r--r-- 1 root root  6816 Jun 10  2014 relocated
-rw-r--r-- 1 root root 12549 Jun 10  2014 transport
-rw-r--r-- 1 root root 12494 Jun 10  2014 virtual
-rw-r--r-- 1 root root    69 Mar 23 18:29 virtualtest
-rw-r--r-- 1 root root 12288 Mar 23 18:31 virtualtest.db

# vi /etc/postfix/main.cf
(ファイル編集,中略)
# grep "virtual_alias_maps =" /etc/postfix/main.cf
virtual_alias_maps = hash:/etc/postfix/virtualtest
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

# sendmail ■■■@gmail.com
From:oreore@oreore.com
To:■■■@gmail.com
Subject:this is test mail
This is virtual test mail.
.

# journalctl -n 5
Mar 23 18:50:18 100eec03ccac postfix/pickup[586]: 20DE060138FB: uid=0 from=<root>
Mar 23 18:50:18 100eec03ccac postfix/cleanup[590]: 20DE060138FB: message-id=<20170323185018.20DE060138FB@100eec03ccac.localdomain>
Mar 23 18:50:18 100eec03ccac postfix/qmgr[587]: 20DE060138FB: from=<root@100eec03ccac.localdomain>, size=342, nrcpt=1 (queue active)
Mar 23 18:50:18 100eec03ccac postfix/smtp[592]: 20DE060138FB: to=<〇〇@yahoo.co.jp>, orig_to=<■■■@gmail.com>, relay=mx2.mail.yahoo.co.jp[182.22.12.117]:25, delay=27, delays=26/0.16/0.21/0.28, dsn=2.0.0, status=sent (250 ok dirdel)
Mar 23 18:50:18 100eec03ccac postfix/qmgr[587]: 20DE060138FB: removed

流れ的には,
・virtual(5)テーブルの文法に沿った変換テーブルを作成し,dbを作成
・main.cfのvirtual_alias_mapsにテーブルを紐づけ
Postfixをreload
sendmail(1)でメールをお試し送信
・journaldのログチェック
という感じ.
Gmail宛としたにも関わらず,yahooメールのMTAにリレーしているのがわかると思う.

canonical(5)とvirtual(5)の違いは,変換対象にある.
canonical(5)は,変換対象を柔軟に設定できるのに対し,
(対象はmain.cfのcanonical_classesで設定できる)
virtual(5)は,エンベロープの受信者(送信先)だけを変換対象とする.

エンベロープって何ぞ?」という人は,以下を見てもらった方が早い.

f:id:bob_l_s:20170324040549p:plain

実際に受信したYahooアカウント側から見えるメール.
注目すべきところはメールのTo:の部分.
sendmail(1)で指定したGmailアドレスのままであることがわかると思う.

メールには,乱暴に言えば宛先を2つ書く欄があって,
それが「エンベロープ」と「メールヘッダ」.
普段,俺たちがThunderbirdOutlookで見ているToは後者なんだけど,
メールサーバがやり取りで使用する真のToは前者となる.

つまり,virtual(5)とは,
「メールヘッダ(ユーザから見える世界の宛先)に手を加えることなく,
 メールの送信先をコントロールしたい」
という要求に答えてくれる機能,と思えば良いと思う.

他にもcleanup(8)は色々やってくれているようだけど,
とりあえず今回の勉強で触れるのはここまでとする.

cleanup(8)は,整形したメールをincomingキューに放り込む.
で,それを拾い上げるのがqmgr(8)デーモンとなる.


で,ここから先はまた次回.たぶん次で終わり.

postfixの勉強 #2

以下の続き.
postfixの勉強 #1 - NK5のノート

postfixでメールを送る際に
pickup→cleanup→qmgr→smtp→qmgr
というキャッチボールが行われているらしい,という話だったけど,
そもそもトリガとして使った「sendmail」自体が
postfixの提供するコマンドの1つだったりする.

Postfix manual - sendmail(1)

Sendmail」という,別のメール転送エージェントとの同じコマンドで
メール送れますよ,ということらしい.
ともあれ,アプリケーションからPostfixをキックするときは,
このsendmail(1)コマンドを用いることになる.

ちなみに末尾の(1)は「ユーザコマンド」の意だそうだ.
(5)が「ファイル書式」で(8)が「デーモン」なんだと.

メールはmaildropキューに投入される.
キューのパスはmain.cfのqueue_directoryで定義される.

# grep "queue_directory =" /etc/postfix/main.cf
queue_directory = /var/spool/postfix
# ll /var/spool/postfix/
total 0
drwx------ 2 postfix root       6 Mar 19 18:30 active
drwx------ 2 postfix root       6 Mar 19 18:30 bounce
drwx------ 2 postfix root       6 Jun 10  2014 corrupt
drwx------ 2 postfix root       6 Jun 10  2014 defer
drwx------ 2 postfix root       6 Jun 10  2014 deferred
drwx------ 2 postfix root       6 Jun 10  2014 flush
drwx------ 2 postfix root       6 Jun 10  2014 hold
drwx------ 2 postfix root       6 Mar 19 18:30 incoming
drwx-wx--- 2 postfix postdrop   6 Mar 19 18:30 maildrop
drwxr-xr-x 2 root    root     134 Mar 19 18:11 pid
drwx------ 2 postfix root     256 Mar 19 17:47 private
drwx--x--- 2 postfix postdrop  73 Mar 19 17:47 public
drwx------ 2 postfix root       6 Jun 10  2014 saved
drwx------ 2 postfix root       6 Jun 10  2014 trace

これを拾い上げるのが,pickup(8)デーモンなんだそうだ.

Postfix manual - pickup(8)

pickup(8)デーモンは,メールをcleanup(8)デーモンに引き渡す.
これは名前のとおり,メッセージを規約に沿った形に整形してくれる.
前回の俺の適当なsendmail(1)でもメールを送信できたのは,こいつのおかげ.

Postfix manual - cleanup(8)

また,ここでアドレスの置換なんかも出来るらしい.
とりあえず/etc/postfix配下に以下のようなものを作ってみた.

# cat /etc/postfix/canonicaltest
root 〇〇@yahoo.co.jp
oreore@oreore.com 〇〇@yahoo.co.jp

〇〇@yahoo.co.jpは,実在するyahooメールアドレスとなる.
で,main.cfに「canonical_maps」の設定を追加する.

# grep canonical_maps /etc/postfix/main.cf
canonical_maps = hash:/etc/postfix/canonicaltest

設定を読み込ませるために以下も実施.

# postmap /etc/postfix/canonicaltest
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system
# postconf | grep canonical_maps
canonical_maps = hash:/etc/postfix/canonicaltest

さっそく,sendmail(1)でメールを送信し,確認.
確かに〇〇@yahoo.co.jp名義で送付されていたが,さすがに
送信サーバがおかしいよ,気を付けてね」
という旨の警告が表示されていた.まあ,そうだよね.

アドレスの置換には,もう1つ,virtual(5)という手段もあるらしいけど,
疲れてきたので今回はここまで.

postfixの勉強 #1

仕事上,ちょっと触る機会があったんだけど,
イマイチ仕組みがよく分からなかったので,勉強することにした.
ちなみにメールサーバは今まで一度も構築したことがない.

postfixというのは,メール転送用のサーバアプリケーションのこと.
言うまでもないことだけど,メールというのは
SMTPというプロトコル(ルール)に基づきながら
サーバ間で次々とバトンリレーすることで宛先まで転送される.
SMTPの規約としては以下.真面目に読んだことはないけど.

https://www.ietf.org/rfc/rfc5321.txt

とりあえず詳しい仕組みは後回しとして,インストールしてみる.
Dockerfileは以下の超最低限なものを用意.

from centos
RUN yum install -y postfix

ビルドしたイメージからコンテナを起動し,さっそく入ってみる.
/etc/配下にpostfixというディレクトリが新設されていた.
以下はその中身の確認と,プロセスのチェック.

# ll
total 148
-rw-r--r-- 1 root root 20876 Jun 10  2014 access
-rw-r--r-- 1 root root 11681 Jun 10  2014 canonical
-rw-r--r-- 1 root root  9904 Jun 10  2014 generic
-rw-r--r-- 1 root root 21545 Jun 10  2014 header_checks
-rw-r--r-- 1 root root 27176 Jun 10  2014 main.cf
-rw-r--r-- 1 root root  6105 Jun 10  2014 master.cf
-rw-r--r-- 1 root root  6816 Jun 10  2014 relocated
-rw-r--r-- 1 root root 12549 Jun 10  2014 transport
-rw-r--r-- 1 root root 12494 Jun 10  2014 virtual
# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
postfix    137  0.0  0.6  89092  6412 ?        S    06:50   0:00 pickup -l -t unix -u
postfix    138  0.0  0.6  89160  6416 ?        S    06:50   0:00 qmgr -l -t unix -u

とりあえず何かしらインストールされているようである.
論より証拠ということで,メールを送って,ログを覗いてみる.

# sendmail ■■■@gmail.com
From:oreore@oreore.com
To:■■■@gmail.com
Subject:Test Mail

This is test mail.

.
# journalctl | tail
Mar 18 07:51:44 ec4adde595ab postfix/pickup[252]: 0531460138FB: uid=0 from=<root>
Mar 18 07:51:44 ec4adde595ab postfix/cleanup[326]: 0531460138FB: message-id=<20170318075144.0531460138FB@ec4adde595ab.localdomain>
Mar 18 07:51:44 ec4adde595ab postfix/qmgr[253]: 0531460138FB: from=<root@ec4adde595ab.localdomain>, size=328, nrcpt=1 (queue active)
Mar 18 07:51:44 ec4adde595ab postfix/smtp[328]: connect to gmail-smtp-in.l.google.com[2404:6800:4008:c06::1a]:25: Network is unreachable
Mar 18 07:51:45 ec4adde595ab postfix/smtp[328]: 0531460138FB: to=<■■■@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.23.27]:25, delay=27, delays=26/0/0.44/0.53, dsn=2.0.0, status=sent (250 2.0.0 OK 1489823504 t10si10983459plh.196 - gsmtp)
Mar 18 07:51:45 ec4adde595ab postfix/qmgr[253]: 0531460138FB: removed

送信元のoreore@oreore.comは適当につけた存在しないメールアドレスで,
送信先の■■■@gmail.comは実在するメールアドレスとなる.

journaldのログを見る限り,内部的には
pickup→cleanup→qmgr→smtp→qmgr
というキャッチボールの末にメールが送られているようである.
Gmailの当該アカウントを確認したところ,確かにメールは送られていた.

それぞれのプロセスの意味は次回確認するとして,今回はここまで.

サバイバルファミリー 感想


「サバイバルファミリー」予告

時間が空いたので見に行ってきた.

ある日突然,大規模な停電が首都圏に襲い掛かる.
何日経っても状況は改善せず,原因が説明される様子もない.
食糧が徐々に枯渇し,治安も悪化する一方となっていた.
そんな中,とある4人家族は,東京での生活に見切りをつけ,
母方の祖父が暮らす鹿児島への移住を決意する.

停電とは言ったけれど,厳密に言えば
「電気」自体が世界から消失して,乾電池すら使えないという状況.
主人公達は本当にただの平凡な一家なので,
状況を解決したりするわけではなく,
ただひたすらに西へ西へと無力な逃避行を続けていく形となる.

設定自体はありきたりなので,
どこでオリジナリティを出すか……という点に期待したんだけど,
正直そういった要素は最後まで見えてこなかった.
コメディにしたいのかシリアスにしたいのか,
そのあたりの指針が監督の中でもブレてたんじゃないかなと.

小日向文世のダメ親父演技は流石.
CGやスタントは基本的に使っていないらしいので,
そういった事前知識つきで見ると,また違った感想を抱くかも.

駄作とは言わないけれど,
光るところがあったかというと疑問符がついてしまう,そんな作品.


ちなみにカツラは小日向の自前らしいです.

新幹線の途中下車

「JRは途中下車可能」
という話を聞いたので,実践してきた.
結論としては,あっけなく成功.

今回は「広島→東京」というルートで,新大阪で途中下車.
購入した切符としては,
・広島→東京23区の乗車券
・広島→新大阪の指定席特急券
・新大阪→東京の指定席特急券
の3つ.
ちなみに乗車券については往復割での購入.

懸念として,
JR西日本の自動改札機は,一部,途中下車に対応していない」
という情報がネット上に転がっていたけれど,
駅員に一応聞いてみたら「大丈夫ですよ」とお墨付きを受領.
改札を通したら,あっさり通過出来て,乗車券も戻ってきた.
新大阪駅以外だとどうなるか不明.

新大阪から再乗車するときは,その乗車券を使えばOK,という寸法.

以下はネットで調べていたときに得た追加情報.
どこまで正しいかは不明.

・片道100キロ未満の乗車券の場合,途中下車は不可能
・自動改札を使わずに途中下車した場合,再乗車時に自動改札は使えない
・途中下車は複数回可能だけど,逆走は不可.
 例えば俺のケースだと,「新大阪で再乗車後に新神戸で再下車」とかはNG.

長距離の電車旅行をするときは,この戦法を使えば捗るかもね.

Bリーグの試合を観戦してきた

仕事がようやく一区切りついたので,北海道に旅行してきました.
そのついでとして観戦してきたので,その感想.

皆さんは「B.League(Bリーグ)」ってご存知だろうか.
昨年の秋くらいに,フジテレビが隙あらば宣伝していたので
多少なりとも目にした人はいると思う.

Bリーグとは,日本におけるバスケットボールのプロリーグ.
以前より日本では2つのリーグが並立して睨み合っていたんだけど,
国際バスケ連盟から
「お前ら,いい加減1つにまとまらんと連盟から追い出すぞ」
と脅されて,渋々結託……という,割と恥ずかしい経緯で誕生.

で,どうせなら一度見に行こうと思い,今回の話に至る.
ちなみに,バスケの試合を生で見るのはリーグ問わず初めて.


対象としたのは「レバンガ北海道 VS 滋賀レイクスターズ」.
先述のとおり,あくまで北海道旅行ありきだったので,
特にこの2チームに思い入れがあるというわけではない.

チケットはインターネットで購入.
受取は紙 or 電子(アプリ)の二択だったので,今回は電子を選択.
受付でそのアプリのチケット画面を提示すると,
入場証明の電子スタンプを貰える,という方式.

会場は「北海きたえーる」という体育館.
札幌駅から地下鉄1本で行ける上に駅から直通路があるので,
アクセスはかなり良かった.
会場内は,まあ,かなりこじんまりしていた印象で,
スタジアムグルメも最低限という感じ.
そもそも目まぐるしく攻守が入れ替わる競技なので,
「何かを食べながら/飲みながら」という観戦には向いてない.

座席は,大ハズレだった.
チケット価格・座席図 - レバンガ北海道
上ページ内の図で言うところの「BCブロック」に座っていたんだけど,
あらゆるパフォーマンスが,BE~BGブロック側を向いて行われるので,
なんというか「蚊帳の外」という気分.
たぶん,バスケの観戦ではこういうの常識なんだろうし,
ちゃんと調査しなかった俺が悪いんだけど.

試合前には,オフェンス/ディフェンスコールのレクチャタイム.
全く無知なので,この辺はありがたいと思った.
ハーフタイム中の参加型のイベントといい,
運営側の「皆で盛り上がろう」という気概は
十分に感じた.
まあ,盛り上がっていたかといわれると,正直微妙だけど,
こういうのは地道に定着させてナンボなので,今は仕方ないと思う.

試合は北海道が勝利.
内容は,まあ,こんなもんかぁという感じ.
追いかける滋賀の攻撃が素人目に見ても強引になっていき,
結果傷口を広げて自滅,という形だった.
両チームとも下位だし,1試合で全てを知ったつもりでは毛頭ないけど,
「すげぇ!プロすげぇ!!」
というプレーにはあまり無かったかなぁ.

まとめると,現状では入場料金に見合う内容ではないと思う.
当面,見る側は「お布施」「先行投資」と割り切るくらいの覚悟が必要かなぁ.
まあ,課題は大量にあるとはいえ,
冬季スポーツ不足な日本のスポーツ観戦事情を考えると,
今後も定着に向けて頑張って欲しいとは思う.


なお,帰りは新千歳空港で缶詰になりかけました.辛うじてセーフ.