先週アメリカ合衆国のトランプ大統領が来日しましたね。そこで今回はトランプ大統領のツイートを
そもそも「biff」とは
「biff」
- comsatデーモンは定期的に
/var/
からログインユーザーのリストを取得しておくrun/ utmp - MTAがメールを受け取る
- MTAがcomsatデーモンに
「受信者」 「メールボックスファイル名」 「受信したメールのファイル上のオフセット」 をUDPで通知する - comsatデーモンは
「受信者」 がログインしているか確認する - comsatデーモンは受信者が使用している端末ファイル
( /dev/
やttyX /dev/
)pts/ X のbiffビットが立っているか確認する - biffビットが立っている端末ファイルに対して,
メールの 「From:」 と 「Subject:」, さらに本文の一部を書き込む - 先頭7行もしくは560文字の小さいサイズに到達した時点で書き込みを終了する
要するに
- ※1
- 512/
UDPはcomsatデーモン用にwell-knownポートとして登録されているため, 他のサービスに使われることも基本的にはありません。ちなみに512/ TCPはリモートマシンでコマンドを実行するrexec (Remote Process Execution) で使われるポートのようです。こちらもセキュリティな観点から, 現在では使われなくなっています。
しかしながら
ところでこのオリジナルのbiffコマンドとcomsatデーモンそのものはパッケージリポジトリに残っています。そこで今回はあえてこのbiffコマンドを使うことで,
正直に言うと
- ※2
- トランプ大統領とbiffの関係性がわからないよいこのみんなは
「ビフ・ タネン 」で 「ググって」 ください。
biffのインストール
biffとcomsatデーモンはともにbiffパッケージに含まれています。よってインストールは簡単です。
$ sudo apt install biff (中略) biff (1:0.17.pre20000412-5) を設定しています ... grep: /etc/inetd.conf: そのようなファイルやディレクトリはありません grep: /etc/inetd.conf: そのようなファイルやディレクトリはありません
最後にエラーが出ていますが,/etc/
の中身を確認した上でupdate-inetd
コマンドを実行しようとするものの,/etc/
が存在しないために上記のようなgrepコマンドのエラーが出ています。本来はbiffパッケージがxinetdなどに依存しておくべきですが,
inetdとsystemd
そう,
biff dgram udp wait root.tty usr/sbin/in.comsat comsat
/etc/
ファイルを確認するとbiffサービスについて記載されていることがわかります。
$ grep biff /etc/services biff 512/udp comsat
inetd経由で起動するサービスの特徴のひとつが,
cc = recv(0, msgbuf, sizeof(msgbuf) - 1, 0);
if (cc <= 0) {
if (errno != EINTR) sleep(1);
continue;
}
このためinetd用のサービスをそのまま実行してもうまく動きません。comsatデーモンを動かすためにはinetdサービスが必要になります。ここで素直にxinetdをインストールしてもいいのですが,
まずsocket unitを作成します。/etc/
」
[Unit]
Description=Biff Comsat
[Socket]
ListenDatagram=[::1]:512
[Install]
WantedBy=sockets.target
内容はごくごくシンプルで,
ListenDatagramのアドレス部分には[::1]:512
」
- ※3
- 詳細はman systemd.
socket を参照してください。
- 「/」
で始まる場合はUnixドメインソケットのパスとして使われます - 「@」
で始まる場合はLinuxの抽象ソケットアドレスとして扱います - 単一の数字の場合はポート番号として扱い,
システム上のすべてのインターフェースをlistenします - 「A.
B.C. D:PORT」 の場合はIPv4アドレスとポート番号として指定したアドレスでlistenします - IPv6表記の場合はIPv6でlistenしますが,
設定によってはIPv4アドレスも同時にlistenします
上記の例ではIPv6表記のループバックアドレスを指定しているため,
次にこのsocket unitにパケットが届いたときにアクティベートする本体のサービスファイルを/etc/
」
[Unit]
Description=Biff Service
Requires=biff.socket
[Service]
Type=simple
ExecStart=/usr/sbin/in.comsat
StandardInput=socket
StandardError=journal
TimeoutStopSec=5
[Install]
WantedBy=multi-user.target
見た目はごくごく普通のサービスファイルですね。comsatデーモン自身はforkしないのでサービスタイプはType=simple
」Requires
には先程作成したbiff.
を指定しています。
inetdライクなサービスにするためにStandardInput=socket
」send()
やwrite()
を呼びません)。よってStandardOutput
は設定していません。一般的なinetdサービスであれば,StandardOutput
も設定する必要があるでしょう。
biff.
$ sudo systemctl daemon-reload $ sudo systemctl start biff.socket
これで512番ポートにパケットが届くとcomsatが起動するようになりました。