それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

LXC で ppp デバイスが使えない

LXC 内部で l2tp を使おうとしたら、つながらなかったので、色々調べた。

LXC で ppp デバイスが使えない

LXC で作ったコンテナで PPPが使えない。L2TPを使おうと思ったら、以下のようにエラーになる。

Oct 24 11:12:51 a01 pppd[739]: Couldn't open the /dev/ppp device: No such file or directory
Oct 24 11:12:51 a01 pppd[739]: Kernel doesn't support ppp_generic - needed for PPPoL2TP

対策

調べたら、対策があった。

PPP はデバイスだから、config 経由で追加する。

lxc config device add <ctname> dev_ppp unix-char path=/dev/ppp

参考資料

https://github.com/lxc/lxd/issues/1436

スプラトゥーン3の通信相手を見ながらプレイする

スプラトゥーン3の通信相手を見ながらプレイする

スプラトゥーンの対戦相手のIPアドレスを見ながらプレイする。

マッチングしたタイミングや、相手のISPをみる、地域を見るなどで、ラグが予想できたり、テザリング勢が混じってると、回線切断の危険性が高い・ラグが多い、スプラトゥーン3で不快なPlayerとマッチングしないように工夫する礎石になりそうなのでログを見ることにする。

#!/usr/bin/env bash
MAC_ADDR='18:c2:bf:xx:xx:XX'

if [[ $( ip neigh | grep $MAC_ADDR )  =~ 192.168.[0-9]+.[0-9]+ ]];  then
  addr=$BASH_REMATCH;
  echo $addr
  TCP_DUMP='tcpdump -i br-lan  -s 0  'dst $addr ' 2>/dev/null'
  cmd="timeout 2 $TCP_DUMP | cut -d ' ' -f 3 | sort | uniq  "
  echo $cmd
  watch -dc -n 3 "$cmd"
fi

利用した各種コマンドについて。

上記のスクリプトで利用したコマンドについて

動作の仕組みとしては、timeout で tcpdump を指定秒間取り出し、その結果をsort uniq で通信相手を絞る。このコマンドをwatch コマンドで定期実行する。って感じですね。

MACアドレスからIPを取り出す

ip neigh | grep $MAC_ADDR =~ 192.168.[0-9]+.[0-9]+ ; 
echo $BASH_REMATCH

IPアドレス宛のパケットを表示する

tcpdump -i br-lan  -s 0  'dst $addr ' 2>/dev/null

2秒経ったら終了させて、sort/uniq する

timeout 2 $TCP_DUMP | cut -d ' ' -f 3 | sort | uniq  

3秒に一回実行する

watch -dc -n 3 "$cmd"

指定時間をキャプチャする

tcpdump -i eth0 -s 0 -w /tmp/01.pcap -G 30 dst 192.168.2.109 and udp 

pcap は packet capture の略だ思う

スプラトゥーン3のパケットをキャプチャする。

UDPでゲームしているはずなのでUDPで絞ると少なくて良いかもしれない。

tcpdump -i eth0  dst 192.168.2.109 and udp

ただ、443でGCPAWSと通信しているのでtcpdumpの中身をフィルタリングしてもいいと思う。

nvme コマンドでNVMEの状態をチェックする

nvme コマンド

SSdの状態チェックしようとおもたら、nvmeのコマンドがあった。

root@:~# apt install nvme-cli
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  nvme-cli
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 100 個。
327 kB のアーカイブを取得する必要があります。
この操作後に追加で 798 kB のディスク容量が消費されます。
取得:1 http://debian-mirror.sakura.ne.jp/debian bullseye/main amd64 nvme-cli amd64 1.12-5 [327 kB]
327 kB を 0秒 で取得しました (1,286 kB/s)
以前に未選択のパッケージ nvme-cli を選択しています。
(データベースを読み込んでいます ... 現在 389870 個のファイルとディレクトリがインストールされています。)
.../nvme-cli_1.12-5_amd64.deb を展開する準備をしています ...
nvme-cli (1.12-5) を展開しています...
nvme-cli (1.12-5) を設定しています ...
man-db (2.9.4-2) のトリガを処理しています ...
root@acid:~#

https://wiki.archlinux.org/title/Solid_state_drive/NVMe#Controller_failure_due_to_broken_APST_support

nvme get-feature /dev/nvme0 -f 0x0c -H

状態見るだけならsmartctl でイイ気もする。

細かい機能を設定してチューニングするようでした。

ワード・エクセルでバックステージを表示しない。

ワード・エクセルでバックステージを表示しない。

Ctrl-Sでいちいち、リッチな画面を出されるのがうざったたくて仕方がない。

設定からCtrl-Sを無効にしておく

  • クラウドに保存される、自動保存ファイル←なくてもいい
  • キーボード・ショートカット(Ctrl-S)時に保存ダイアログを開く←絶対必要
  • サインインが必要な場合でも、その場所を候補に出す←いらねぇ
  • 既定でコンピュータに保存する ← 必要

OneDriveやOffice365推しはわかるんだけど、ノートPCを使ってたら特に問題なく持ち歩いてるので、クラウド機能っていりますか?

こういう、OSにクラウド機能を統合するのは、厳しく規制してほしいところである。

Yahoo Japan のフリーメールアドレスとISP(ybb)のメアドについて調べておいた。

Yahoo のメールアドレス(ISP)仕様の調査

フリーメールアドレスといえば、昔はヤフーでした。

が、いまは、あれこれ制限がかかっているので調べておいた。

yahoo のメールはIMAP/SMTPが使えない。

利用できるのは、いくつかの条件を満たしたときだけ。

  • yahoo bb /ybb ユーザー
  • 広告受信(ダイレクト・オファー)をしているとき。 なおかつ、IMAP/SMTPを有効にする必要がある。

送信者アドレスの限定

  • メール本文FROM はyahoo メールに登録したメアドのみ
  • ドメインは使えない。

スパムの学習はしない。

これが自分的にはびっくりだったのですがスパムの学習は基本的にユーザ単位では行えないみたいです。Y!BBの契約者でISP版を使っていてもだめみたいです。

アカウント停止

6ヶ月のアクセスがないとアカウントは停止される

半年のアクセスがないと、アカウントはサスペンドして使えなくなる。怖い https://support.yahoo-net.jp/PccMail/s/article/H000007378

IMAP/SMTP

メアド・受信設定。

サーバー アドレス ポート
imap imap.mail.yahoo.co.jp:993
smtp/ybb ybbsmtp.mail.yahoo.co.jp:465
smtp/free smtp.mail.yahoo.co.jp:465

IMAP/SMTPは初期状態でオフなのでちょっとめんどくさいですよね。

アカウントの維持のためには

アカウントの維持には、SMTPIMAPアクセスが楽ちんだが、そのためにはDM登録か、Y!BBの登録、または月額300円が必要。

ダイレクト・オファーというDMを受けないと使えないのもちょっと不便ですよね・・・

curl コマンドで送信テスト

Yahoo のSMTPをサクッとコマンドラインから使うには、curl コマンドが便利です。

function send_mail_curl(){
  IFS=""
  [ -z $URL ] && URL=smtps://ybbsmtp.mail.yahoo.co.jp:465
  [ -z $ID ] && ID=takuya_XXXXXXXXXXXXXXXX@yahoo.co.jp
  [ -z $FROM ] && FROM=$ID
  [ -z $PW ] && PW=xxxxPASSWxxxx
  [ -z $SUBJECT ] && SUBJECT='aaa empty'
  ##
  LOGIN="$ID:$PW"
  str=$(cat <<<"To: $TO
    From: $ID
    Subject: $SUBJECT

    this is a test
    using smtp
  " | sed -E 's/^\s+//g' | sed 's/$/\r/g' )
  echo $str
  IFS='' echo $str | curl -v --url $URL --user $LOGIN --ssl -k --mail-rcpt $TO -T -
}
SUBJECT="test from yahoo."
TO=takuya@example.tld
send_mail_curl;

TLS暗号化されてない。

上記のコマンドで試験的にGmail宛にメールを送信してみた。

メールヘッダに残ったログを見る限り、Yahoo Japanから「平文」でGmailへ送信された。

SMTPメールのログを見てもTLSで送信された形跡がない。

SPF/DKIM がない。

送信したが、SPFDKIMが見当たらなかった。

古き良きメールの仕様だと思うんだけど、これでは、ヤフーメールををメインに据えるのはちょっとありえないと思う。

メアドは誰のもの?

メールアドレスって「最低一つは必要」だと思うんだけど、メアドすなわちGoogleという、Google独占になってて、わりと不自由だと思うんですよね。

フリーメールアドレスの維持すらもちょっと大変になっていて、メールボックスはたまに意識しておかないとユーザー登録が全部ぶっ飛ぶことになります。

どうせお金使うなら、自ドメインとおもうけど、そうかんたんではないですよね。

とくに、パスワードがメールで送られてくる系の2段階認証のようなものが増えたり、パスワード紛失時にメール送信によりアカウント再開が多くてメールボックスは最底辺の縁の下の力持ちとして必要なのだが、いざというときに使えないメアドは困る。

ISP提供メアドは足りない。

ISPに契約するとついてくるメールアドレスは昨日不足だったりする、YahooBBはYahooのメアドが使えるので、少しはマシだが。それでも色々ときつい。

かといって、家族分のメールアドレスがあるわけでもない。なので結局みんなGmailを使うし、Googleの独占になる。

ISPは、家族分のメールアドレスを提供してユーザを囲い込めばいいのに。。。

Sogoをいれて、WEBメール機能を作り、IMAP/SMTPを使う。

Sogoをいれて、IMAP/SMTPを使う。

Sogoは比較的よくできたグループウェア。ちょっと動作はもっさりしてるけどスマホなどで見ても快適な表示である。大量のメールを捌くのは厳しいが、通常のメール量であれば苦にならない。これをGmailの代替としてインストールしてみる。

インストールは、apt で完了するので素晴らしい。

今回は、さくらメールボックスを相手にSogoを使ってみる。 Sogo を入れて、SakuraメールをIMAP/SMTPで使ったらどうなる。かをインストールをしてみて試す。さくらメールボックスを、Sogo経由で使えばグループウェアになって良いのでは。と思った。

設定ファイル。

設定ファイルは、現在は、/etc になっている。以前はid:sogo の homedir を参照していたが、/etc/に変わっていた。

/etc/sogo/SOGo.conf

インストール

sogo はHTTPサーバーを内蔵しているが。 127.0.0.1/Sogoで動作させることができるので、公式のサンプルはApache2の パスAlias で設定されてる。

Apache2を使う

nginx を使いたいところだが、公式サイトに設定例があるのが、Apacheなのでそれを利用しとにかく動かす。もちろん、サブディレクトリじゃなくても、nginxしてもいいけど、とにかくまず動かすことを目標にする。

MySQLを使う。

postgresql を使うべきところだろうが、mariaDBのほうがユーザー作成など管理コマンドが楽なのでこっちを採用。

apt でインストール

Sogo は aptで入っちゃう。debianのパッケージにあった。apt でインストールすると、Arm64などのバイナリもサクッと入手可能なので、debian のapt を使うことにした。sogo.nu の公式にもパッケージはあったのだが、nightly はめんどくさそうだったのでやめた。

必要なパッケージをインストール

sudo apt install apache2 sogo  mariadb-server -y 

MySQLデータベースの準備

sudo mysql 

MySQLにsogo ユーザーを作成する。 ( id:sogo / pw:password )

GRANT ALL ON sogo.* TO 'sogo'@'localhost' IDENTIFIED BY 'password';
flush privileges;
CREATE DATABASE sogo;

MySQLにデータベースの作成し、テーブル作成、ユーザ作成

USE sogo;
CREATE TABLE sogo_users (c_uid VARCHAR(10) PRIMARY KEY, c_name VARCHAR(10), c_password VARCHAR(32), c_cn VARCHAR(128), mail VARCHAR(128));
INSERT INTO sogo_users VALUES ('admin1', 'admin1', MD5('your-secure-password'), 'SOGouser', 'sogo@example.com');

ログインするユーザーのパスワードはMD5で格納する(このあたりはsogo設定で調整が可能)まず動くことを目指す。

必要なテーブル定義を流し込む。

mysql -hHOST -uUSER -p -D SOGO < Scripts/mysql-utf8mb4.sql

Sogo の設定

postgresql になってる部分をmysqlに書き換えて、先程指定した md5パスワードのカラムがあるテーブルを指定する。

/etc/sogo/sogo.conf

{
  SOGoProfileURL = "mysql://sogo:password@localhost:3306/sogo/sogo_user_profile";
  OCSFolderInfoURL = "mysql://sogo:password@localhost:3306/sogo/sogo_folder_info";
  OCSSessionsFolderURL = "mysql://sogo:password@localhost:3306/sogo/sogo_sessions_folder";
  OCSEMailAlarmsFolderURL = "mysql://sogo:password@localhost:3306/sogo/sogo_alarms_folder";
  SOGoUserSources = (
    {
      type = sql;
      id = users;
      viewURL = "mysql://sogo:password@localhost:3306/sogo/sogo_users";
      canAuthenticate = YES;
      isAddressBook = NO;
      userPasswordAlgorithm = md5;
    }
  );
  # 書き換え前。
  #SOGoProfileURL = "postgresql://sogo:password@127.0.0.1:5432/sogo/sogo_user_profile";
  #OCSFolderInfoURL = "postgresql://sogo:password@127.0.0.1:5432/sogo/sogo_folder_info";
  #OCSSessionsFolderURL = "postgresql://sogo:password@127.0.0.1:5432/sogo/sogo_sessions_folder";
  #OCSEMailAlarmsFolderURL = "postgresql://sogo:password@127.0.0.1:5432/sogo/sogo_alarms_folder";

/etc/sogo/sogo.conf

アドミンユーザーを指定する。

MySQL時に作成したAdminユーザを指定する。複数人いるときは、列挙。

SOGoSuperUsernames = (admin1, admin2);

sogo.conf の記入例

NSDictionary なので厳密に記入する、設定ファイルはなるほどなって感じになる。SogoはGNUStetpのライブラリも使って動いてるし。

{
    key = value; 
    arrays = (
        {
            key = "NAME";
            flag = YES;
        }
    );
}
  • 末尾にはセミコロン;をつける。
  • key = valueはスペースを入れる。
  • boolena は YESNO で記入する。
  • string は ダブルクォーテーション"value"する。
  • YES ; のような無駄なスペースは許されない。

apache2 の設定を記入する

サンプルは次の場所にある。

Apache/SOGo.conf

この中から次の部分を書き換えておく、起動実験なのでHTTPSを使わない。 そのためHTTPSをHTTPに変更する(443ー>80,HTTPSー>HTTP)

sudo touch  /etc/apache2/conf-enabled/SOGo.conf
sudo vim /etc/apache2/conf-enabled/SOGo.conf
# RequestHeader set "x-webobjects-server-port" "443"
RequestHeader set "x-webobjects-server-port" "80"
# RequestHeader set "x-webobjects-server-url" "https://%{HTTP_HOST}e" env=HTTP_HOST
RequestHeader set "x-webobjects-server-url" "http://%{HTTP_HOST}e" env=HTTP_HOST

あとは、サンプルと同じにした。

設定を有効にする

sudo a2enconf SOGo
sudo a2enmod proxy proxy_http headers rewrite

再起動

sudo systemctl restart apache2
sudo systemctl restart sogo

この設定で、 http://localhost/SOGo/ が有効になる。

ログイン画面を出す

http://localhost/SOGo/ にアクセスすると、ログイン画面が出る。

ここで、MySQLのテーブルに登録したユーザー名とパスワード(admin1/your-secure-password) を使ってログインする。

画面が一通り動く

設定画面とかも動くのを確認

imapアカウントが使えない・・・

このままだと、IMAPアカウントがlocalhost:143に固定されるので。

このように、dovecot が同一サーバーで動く前提なので、いくつかの設定を見直さないと、使えない。

sogo.conf の次のあたりを見直す。

SOGoSMTPServer
SOGoSMTPAuthenticationType
SOGoForceExternalLoginWithEmail
SOGoIMAPServer
SOGoForceExternalLoginWithEmail

日本語化

/etc/sogo/sogo.conf

SOGoLanguage = Japanese;
SOGoSupportedLanguages=( English , Japanese  );

ただし、日本語化すると、いくつかの機能がエラーになったので注意。 日本語化ファイルでエラーになる箇所を英語版で置き換えればいいし、Nightlyを使えば修正されていたでの、そのうち治ると思う。

時刻

SOGoTimeZone = Asia/Tokyo;

IMAP/SMTPサーバー自分で用意する

SOGoのパッケージインストールには、IMAPdもSMTPdも含まれてないので、自分で準備する必要がある。サーバーは自分の契約しているメールサーバーを利用すればいい。

sogo の依存ライブラリを確認する。

apt-cache --installed depends sogo
sogo
  PreDepends: init-system-helpers
  Depends: gnustep-base-runtime
  Depends: libc6
  Depends: libcrypt1
  Depends: libcurl4
  Depends: libgcc-s1
  Depends: libglib2.0-0
  Depends: libgnustep-base1.28
  Depends: liblasso3
  Depends: libmemcached11
  Depends: liboath0
  Depends: libobjc4
  Depends: libsbjson2.3
  Depends: libsodium23
  Depends: libsope1
  Depends: libssl3
  Depends: libytnef0
  Depends: libzip4
  Depends: systemd
  Depends: sogo-common
  Depends: adduser
  Depends: zip
  Depends: lsb-base
  Depends: memcached

sogo はIMAPクライアントなので、自分で用意する必要があります。

参考資料

https://wiki.archlinux.jp/index.php/SOGo https://linuxhostsupport.com/blog/how-to-install-sogo-on-ubuntu-20-04/

mailcow の管理者でログインした場合にWebメールボタンがグレイアウトする。

mailcow の管理者でログインした場合、Webメールボタンがグレイアウトして悩んでた。

impersonate ではログインできないだけだった。

「ユーザ」を開いて「WEBメールにログイン」しようとしても、グレーになっていて押せない。なんでこれが gray out ?ってなるんだけど、管理者アカウント(メールアドレスなし)でログインしているからで。各ユーザーでmailcowにログインすれば、ボタンは動く。

admin が imporsonate している場合

通常ユーザーでログインするとちゃんと動くよ

mailcow のUIは、それ自体にユーザーがログインして使うので、「Sogo」だけで動いてるというわけでもない。

ユーザがmailcow自体にログインして使う想定なので「右上メニュー」が編集出来たりする。

Postfix で正規表現(PCRE)を使う。書き方とシンタックスチェック

Postfix正規表現(PCRE)を使う

regexは初期状態で使える。しかし使いやすいPCREはインストールが必要だった。

apt install postfix-pcre

PCRE の指定

mainc.cf などで正規表現を使うときは、ファイルの接頭辞に pcre: を使う。ファイルの拡張子は任意。

pcre:/etc/postfix/mydestinations.pcre

PCRE の書き方

たとえば、header_check の場合は次のように書く。後方参照も利用可能だ。

/Delivered-To: takuya_XX(.+)@example.com/ BCC $1@u01.lxd
/Delivered-To: (.+)_xxx@/ DISCARD 

利用場面によって、記述方法は変わる。aliasなども便利だ。正規表現でaliasするくらいなら別の場所でフィルタしたほうがいいと思うが。

シンタックスとテスト

PCRE が正しく動いているか、メールを配送してテストしていると煩雑なので記述のチェック方法を覚えておく。 テストする方法を調べると、メモ残してる人がいて感謝

REGEXPとPCRE の記述が正しく行われているかどうかのテストを行います。

## pcre
postmap -q takuya@example.com  pcre:/etc/postfix/my_checks.pcre
## regex
postmap -q takuya@example.com  regexp:/etc/postfix/my_checks.pcre
## 
postmap -q example.com  regexp:/etc/postfix/my_distinartions.regex

これで、メールの配送や受信、送信について正規表現であれこれ設定できる。

ちなみに、BCCするなど、メールボックスへ配送する際に処理を入れる場合、Dovecot+Sieveのほうが管理しやすいのでそっちがおすすめ。

参考資料

https://www.magic-object.mydns.jp/fedora26_postfix_pcre/

SMTPリレーがTLSで暗号化通信になっているのを確認

SMTPリレーは、TLSで暗号化通信を使ってるのか?

SMTP のサーバー間の配送って平文だとならったし、Proton Mailなどはアンセキュアだと煽ってくる。

はて?SMTPはサーバー間配送にTLSを使ってないんだろうか。と思い立って調べてみた。サーバー間配送っていまでも平文でしたっけ。protonの主張は疑問である。

受信(SMTP)のログ

オレオレ証明書TLSを使ったことがわかる。

メールのヘッダ

メールのエンベロープをみてヘッダを見てみると、TLSの256ビットで転送されたことがわかる。

暗号化

TLSなので、HTTPSと同じく、証明書を使ってDHでワンタイムなので、暗号化通信であるとは言える。

TLS 証明書とオレオレ

TLS証明書をきっちりやればもう少し確実に届くと思う。 オレオレ証明書なので、中間者攻撃には対応できないだろうが。

postfix の設定

smtp_tls_CAfile = /etc/pki/tls/cert.pem
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_security_level = may
#または
smtp_tls_security_level = encrypt

これは特定の宛先だけencrypt を強制するなどの設定も可能だった。

Gmail の暗号化

Gmailは配送経路で暗号化をできる限り使うようになってて、ちゃんと暗号化されているようですね。

Gmailのセキュリティー!メールサーバー間の暗号化はどうなってるの? | iSchool合同会社

OpenStack をサクッとインストールしようとしたけど断念した

OpenStack をサクッとインストール

openstack のインストールと稼働はめんどくさいし、素でやると何が正しいかわからない。機能が多いので正しく動いてる状態とはなにかを知らなくちゃいけない。

k8s だとか、仮想マシンクラウドのIaaSを自分で用意したら楽だよね。とおもったし、Openstackの範囲を見るには、使ったほうが早いと思って、ずっと前から試したいと思ってたんだけど、なかなかね。

microstack で気軽に試す

記事によると、microstack で openstack が手軽に扱えるようにパッケージされているらしい。

https://qiita.com/rev4t/items/c6f7ba2a5edd910f458f

インストールしてみる。

sudo snap install microstack --classic --beta

仮想マシンのタイプを選択

sudo vi /var/snap/microstack/common/etc/nova/nova.conf.d/hypervisor.conf
sudo systemctl restart snap.microstack.nova-compute.service

初期設定

sudo microstack init --auto --control

お好みで。プレフィックスをコマンドを通常の openstack と同じにする。

sudo snap alias microstack.openstack openstack

動作チェック

sudo microstack.openstack hypervisor list

https://www.canned-catfood.com/2022/04/microstack-installation/ https://tech.virtualtech.jp/entry/2021/08/12/094657

CPU 消費量やっぱりやばいわ

数分待って、ようやくログイン画面。

結論

Raspberry4 8GB では、Microstackは重たかった。別物を使うべきである。

別のものにしよう - OpenNebula - 「OpenStackを簡単に試せる」という幻想

oracle のマシンから外部メールが送信できない。(Oracle Cloud Infrastructure Compute op25b)

25ポートは、有料課金が必要

メールを送信しようとしたら、つながらない。ブロックされている。

ネットを見ると送信を「できている」人たちもいて、何かしらの設定があるのかと調べたが、だめだった。

2021 年 6 月 23 日以降のアカウントは送信できない。

https://docs.oracle.com/en-us/iaas/releasenotes/changes/f7e95770-9844-43db-916c-6ccbaf2cfe24/

Outbound SMTP is blocked Services: Networking Release Date: June 24, 2021 Tenancies made after June 23, 2021 are by default not allowed to send e-mail via outbound TCP port 25 to the internet. Tenancies made prior to June 23, 2021 are unaffected. If you require the ability to send email from your tenancy, open a service limits request to request an exemption.

2021 年 6 月 23 日以降に作成されたテナンシーは、デフォルトで、外向き TCP ポート 25 番経由でインターネットにメールを送信することは許可されていません。2021 年 6 月 23 日より前のテナンシーには影響与えません。 テナンシーからメールを送信する機能が必要とされる場合は、サービス制限要求を開いて、免除を要求してください

2021 年 6 月 23 日以前のアカウントの人は送信25ポートが使えるらしい。羨ましい。とっととアカウントだけでも作っておけばよかった。

日付を境に使える人と使えない人がいるので、ネットを見ると「できている例」がいくつか出てくるわけですね。今後の人は「できない」と思ったほうがいい。

選択肢は2つ。

メールを送信する選択肢は、2つある。

  • Alayws Free Tierのメール送信を使う。
  • ポート25を開放してもらう。

サブミッションポートの外部のサービスを選択肢に入れてもいい、ただ通常のVPSと代わり映えしないため除外した。

外向ポート25の開放をしてもらうには、完全にFree Tierではなく有料課金にクレジットカードを登録して、Free Tierの範囲で利用する方法がある。

プライバシーを保護するにはOracle CloudのE-Mailサービスではオラクルにメールの中身を見られてしまうのでとても恐ろしい。相手はあのオラクルである。

となると、SMTPは自前で処理をしておくべきだともう。なぜなら、リレー先(宛先のMX)がTLS対応していれば経路を暗号化してメールを送信することができるからである。

メール送信1000通まではFreeらしい

OCI技術資料 : Email Deliveryサービス 概要 を見ると、無料のメール送信がある。

電子メール配信 Always Freeリソースの一部として、1か月当たり3100通の電子メールを無料で送信できます。OCIの電子メール配信サービスの詳細はこちらを参照してください。 - https://docs.oracle.com/ja-jp/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm#unique_272622349

  • https://docs.oracle.com/ja-jp/iaas/Content/Email/home.htm#home 「電子メール構成」を開き、SMTP送信情報にアクセスしてシステムに接続を構成します。ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「アプリケーション統合」で、「電子メール配信」をクリックします。「リソース」メニューで、「構成」をクリックします。次の情報が表示されます

OCIの画面からSMTPの専用サブミッションポートを専用のアカウントで使えばすぐ使えるとのこと。

Port25 のリクエストの場合

サービス・リクエストの送信

GoldenGateの操作時に問題を解決するための支援が必要な場合は、My Oracle Supportでサービス・リクエストを発行できます。

サービスリクエストからポート解放をリクエストできる。ただリクエストは課金できるアカウントに限られる。

無料アカウントからやると次のようになり、リクエストができない。

事前に課金チェックを済ませておく。

参考URL

Cloudflare Email ルーティングで受信25ポートを弾幕防御する。

Cloudflare Email ルーティング

cloudflare の Email ルーティングを入れた。

CloudflareのEmailルーティングは、Cloudflareに登録したドメイン宛のメールを任意のメアドに転送してくれるサービス。正直言って使い所がいまいち分からない機能だ。

別になくてもいいじゃん。と思ったのですが、弾幕防御にとても便利なのでは?と気づいたので運用することにした。

設定した。

受信ポート25公開せずに済む。

SMTPを運用したらわかるが、受信25には大量のスパム送信の試行が、それもものすごい量やってくる。それをCloudflareが弾幕防御して被弾代理してくれる。

これが実にありがたい。

Email ルーティング送信元

Cloudflare のEmailルーティングは、特定のIPアドレスだけから配送される。 そのため、受け取る側で、fail2ban を指定しておけば、受信25番ポートを無闇矢鱈に世界に晒す必要がない。

送信元 IP範囲

Cloudflareは「登録したメールアドレス」へ転送するIPアドレスを公開しています。 https://developers.cloudflare.com/email-routing/postmaster/

v4 アドレス範囲。

104.30.0.0/20

v6 は

2405:8100:c000::/38

フォワードされたメールは必ず、上記のIPアドレスからメールが送信される。 これなら、安心してフォワード設定先に自宅サーバーを指定ができそうですよね。

そうなんですね。Cloudflareのメール配送機能は、Cloudflareらしく弾幕防御のためだったんですね。IPアドレス範囲を公開しているということは、そういう意図ですよね。 最初全然気づかなかったよ。

fail2banに設定した。

mailcow の fail2ban と Firewall の 許可リストに追加した。

これが、今回の設定のキモです。受信メール・サーバを運用しなくて済むし、自宅に設置したメールボックス(mailcow/postfix)へ転送する用に指定しておけば、自宅サーバーでもメール運用を気軽に行うことができるです。しかも受信25ポートへの攻撃を意識しなくて済む上に、無駄なリソースを浪費しなくて良い。fail2banで防げるとは言え、攻撃パケットがPostfixまで届くのは嫌だ。望ましくない。CPUリソースの電気の無駄遣いだ。なのでCloudflareにある程度防いでもらった上で、GCPで受け取る側を構成しておこう。そうすれば自宅のルータは静かでいい。

IP指定で相当安全

WEBサイトをCloudflareのCDNでオリジンIPを隠蔽できるように、メールの25番も具体的な接続先を隠蔽することができる。

受信25番ポートは常に何かが設定ミスやゼロデイを調査士に接続に来るので精神衛生上良くない。自宅サーバーで運用しているとほんとうに気持ち悪い。なのでCDNであるCloudflareで一旦受けてておいて、必要なメールだけ自宅サーバーのmailcowに転送すると負担が楽。

Cloudflareは受信だけなので送信SMTPもあれば良いんだけどなぁ・・・

初期登録だけは注意

メールアドレスの初期登録の確認メールは、sparkpostから送信される。

sparkpost はメール送信に特化したサービスなので、、、IPアドレスで絞り込むのが困難だ。 なぜなら、sparkpost の送信アドレスは、SPF用に利用者がログインして使う想定なのでCloudflareが使ってる範囲がわからないのだ。 しかもsparkpostさんはAWSで動的に運用されてるらしくて、IP範囲は想像がつかない。

なので、宛先アドレス登録の確認メールは、fail2banがあるとうまく動作しないので注意。

https://community.cloudflare.com/t/email-routing-verification-email-not-being-delivered/350135

正規表現が使えない。

CloudflareのEmailルーティングは、「正規表現に非対応」です。ですからキャッチオールでまとめて受け取る必要がある。

そこが非常に欠点。カスタム・アドレスに正規表現を使えるようにしてくれると、メインで使える素晴らしい機能になると思う。リクエストのスレッドなども上がっていて他の類似サービスではできるからCloudflareでもやってほしいとかコメントされてるが、Cloudflareは、そこまでの余裕はなさそう。なので自分のPostfixで配送する必要がある。

残念ながら正規表現による振り分けは、EC2/VPS/自宅サーバーのDovecot+SeviveとPostfixのヘッダチェックで運用することになりました。

参考資料

https://community.cloudflare.com/t/wildcard-regex-matching-with-cloudflare-email-routing/331050

SOGo が日本語で返信ボタン・転送ボタンが押せない問題

SOGo が日本語で返信ボタン・転送ボタンが押せない問題

Sogo でメールを返信する際に、「返信ボタンが動かない」問題がずっとある。

SogoのGNUStepがずっとエラーを吐いている。

NAME:NSInvalidArgumentException
 REASON:Can not determine type information for -[NSException setUserInfo:] INFO:{templateURL = 
"file:///usr/lib/GNUstep/SOGo/Mailer.SOGo/Resources/SOGoMailJapaneseForward.wo/"; }

日本語の言語ファイル(返信テンプレート)がうまく読み込めてないと思われる。たぶん文字コードの問題。

quick-fix

日本語の言語ファイルに含まれる返信テンプレートをEnglishで上書きする。

cd /usr/lib/GNUstep/SOGo/Mailer.SOGo/Resources
# reply が動かないのでEnglishをコピーする
sudo mv SOGoMailJapaneseReply.wo/ ~
sudo cp -r SOGoMailEnglishReply.wo/ SOGoMailJapaneseReply.wo/
sudo mv SOGoMailJapaneseReply.wo/SOGoMailEnglishReply.html  SOGoMailJapaneseReply.wo/SOGoMailJapaneseReply.html
sudo mv SOGoMailJapaneseReply.wo/SOGoMailEnglishReply.wod  SOGoMailJapaneseReply.wo/SOGoMailJapaneseReply.wod
# forward が動かないのでEnglishをコピーする
sudo mv SOGoMailJapaneseForward.wo/ ~
sudo cp -r SOGoMailEnglishForward.wo/ SOGoMailJapaneseForward.wo/
sudo mv SOGoMailJapaneseForward.wo/SOGoMailEnglishForward.html  SOGoMailJapaneseForward.wo/SOGoMailJapaneseForward.html
sudo mv SOGoMailJapaneseForward.wo/SOGoMailEnglishForward.wod  SOGoMailJapaneseForward.wo/SOGoMailJapaneseForward.wod
# 再起動
sudo systemctl restart sogo

Sieve で正規表現マッチの後方参照を使う。

Sieve で正規表現マッチの後方参照を使う。

DovecotのSieve正規表現によるマッチングを使ってメールボックスへ配送するまえに処理を挟むことができる。

sieve (Dovecot)の書式を使って、特定のメールをフィルタリングしたり転送したいなと思ったんだけど。 後方参照がうまく取れないので悩んだ。

require "regex";
if anyof ( address :regex ["to"] "([a-z0-9_.-]+)@([a-z0-9.-]+\.[a-z0-9]{2,})") {
redirect "${1}@example.com";
}

後方参照を使うにはvariables が必要

色々調べると、後方参照をするには、require 'variables' が必要だとわかった。

https://stackoverflow.com/questions/45821462/regex-capture-groups-in-sieve-script

Match group variables are not part of the regex capability, but the variables capability. Also require ["variables"]; to be able to use them.

これで動いた。

require ["regex", "variables"];
if anyof ( address :regex "to" "([a-z0-9_.-]+)@([a-z0-9.-]+\.[a-z0-9]{2,})" ) {
redirect "${1}@${2}";
}

後方参照を使えると、メールのマッチングをうまく使うことが出来て、gmail の +フラグが除外されるようなサイトを相手にする際でも、takuya_aaaaa,takuya_aabbb などをメールアドレスに使うことが出来て便利になりそうです。

参考資料

https://stackoverflow.com/questions/45821462/regex-capture-groups-in-sieve-script

https://www.ietf.org/archive/id/draft-ietf-sieve-regex-01.html#rfc.section.7.1

Arm(aarch64)で mailcow-dockernized を動かした。

Arm(aarch64)で mailcow-dockernized を動かした。

mailcow とは

rspamd/virtual hosting メール / imaps / smtp / WEBメール / ip-ban の必要なものがワンセットで、docker compose だけで簡単にメール環境を作ることができる。

arm 版

Raspiやオラククラウド(A1)でARM64のバイナリを動かせるが、mailcow のdocker 版はx86を前提としているので、自分でビルドして、いくつかの設定を見直す必要がある。

Raspi-ubuntuやオラククラウド(A1)でメールサーバーを作って置こうと思い立って稼働させたのでメモ。色々苦労した

docker は qemu に対応しているので、docker だけでもx86バイナリを動かすことができるが、phpがとにかく遅い。メール配送はバックグラウンドになるで気にならないが、WEB-UIはx86バイナリを動かすとモタつきがきになる。そこでphp/sogo/dovecot をarm64で動かすのが良いと思う。Solr と clamv はメモリ食うのでオフにしてもいいと思うんですけどね。

arm で docker を起動したらエラーになる例。

そのまま起動すると exec format エラーになる。

docker の準備

そこで、aarch64(arm 64)バイナリ版をビルドしてみた。

### Docker の準備

sudo curl -sSL https://get.docker.com/ | CHANNEL=stable sh
sudo systemctl enable --now docker
sudo apt update
sudo apt install docker-compose-plugin
sudo usermod -aG docker $USER


## iptables でポートを開放する
sudo iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
sudo iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
sudo iptables-save  | sudo tee /etc/iptables/rules.v4


### ソースコードの準備
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
### docker イメージの取得
docker compose pull

ipv6関連を切っていく。

v6関連があるとデバッグが煩雑になるので切っておく。

## mailcow の設定で、v6を切っていく
## 参考資料:https://docs.mailcow.email/post_installation/firststeps-disable_ipv6/
### docker v6 networkで切る
sed -i 's|enable_ipv6: true|enable_ipv6: false|' docker-compose.yml
## ipv6natを切る。
touch docker-compose.override.yml
cat <<EOF | sudo tee docker-compose.override.yml
version: '2.1'
services:
    ipv6nat-mailcow:
      image: bash:latest
      restart: "no"
      entrypoint: ["echo", "ipv6nat disabled in compose.override.yml"]
EOF

### unboundにv6応答をやめさせる
sed -i 's|do-ip6: yes|do-ip6: no|'  data/conf/unbound/unbound.conf
sed -i '/do-ip6/s/$/\n  prefer-ip6: no/g' data/conf/unbound/unbound.conf
sed -i '/ipsecmod-enabled/s/$/\n  local-zone: ip6.arpa. refuse/g' data/conf/unbound/unbound.conf

### postfix にv6利用をやめさせる
cat <<EOF | sudo tee -a data/conf/postfix/extra.cf
smtp_address_preference = ipv4
inet_protocols = ipv4
EOF
### nginx /devecot / php-fpm にv6リッスンをやめさせる
sed -i '\|\[::\]:8081;|d' data/conf/nginx/dynmaps.conf
sed -i '\|::|d' data/conf/nginx/templates/listen*
sed -i 's/,\[::\]//g' data/conf/dovecot/dovecot.conf
sed -i 's/\[::\]://g' data/conf/phpfpm/php-fpm.d/pools.conf
ホスト側でも念のためにv6を切っておいた

docker ホスト側(Oracleインスタンス=docker ホスト) でもv6はオフにしておいた。

cat <<EOF | sudo tee -a /etc/sysctl.conf
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.eth0.disable_ipv6=1
EOF

cat <<EOF | sudo tee  /etc/rc.local
#!/bin/bash
# /etc/rc.local

/etc/sysctl.d
/etc/init.d/procps restart

exit 0
EOF

sudo chmod 755 /etc/rc.local
sudo /etc/rc.local

arm(aarch64)用にビルドする。

Arm用バイナリがapt/apk提供されているものは、docker buildだけでいける。

apt で済むもの

apk/apt が提供されているものは、docker build を実行すれば良い。

## ビルド
## sogo と dovecot と rspamd は公式レポジトリを使っている。ためビルドできない
#### debianパッケージを使えば動くと思うが未検証
## aarch64用にビルドする
# sed -i '\|rspamd.com/apt-stable|d' data/Dockerfiles/rspamd/Dockerfile

list=("
  acme
  clamd
  dockerapi
  netfilter
  olefy
  phpfpm
  postfix
  solr
  unbound
  watchdog
")
## aarch64用にビルドし直す 5分くらい
for service in $list; do 
  echo $service
  docker build data/Dockerfiles/$service -t mailcow/$service:aarch64_build
done
## aarch64用にビルドしたものを使う用に書き換え
for service in $list; do 
  echo $service
  grep "mailcow/$service" docker-compose.yml
  sed -i -E "s|mailcow/$service:[0-9.]+|mailcow/$service:aarch64_build|" docker-compose.yml
  grep "mailcow/$service" docker-compose.yml
done
sogo/dovecot/rspamd

sogo/dovecot/rspamd は debian/ubuntu の配布パッケージを使っていない。sogoは sogo.nu のnightly を使っているが、sogo.nuがarmバイナリを未提供

パッケージ mailcow指定 Arm版
sogo packages.sogo.nu ???
dovecot repo.dovecot.org なし
rspamd rspamd.com/apt-stable なし

それぞれ、Debian公式なら存在するので大体は出来る |パッケージ| Debian公式 | aarch64バイナリ | 特記事項 | |:---:|---:|:---:|:---| |sogo | debian/sid | あり | sogo-activesync/aarch64はsid のみ| |dovecot| debian/stable | あり |dovecot-lua がない| |rspamd | debian/stable |あり|sa-rulesが動かない。|

これらについては、インストール後に予期せぬ出来事に遭遇するかもしれないが、場当たり的な対応で動いた。

sogo は id:sogo の home ディレクトリが異なるので対応が必要。

dovecotdovecot-lua が無いが、mailcowがluaを未使用なので問題なさそう。

rspamd は、sa-rule がエラーになって起動しなくなるので、消せば動くが、アチコチで segmentation fault がでて面倒くさいのでarmは諦めて、qemu 経由でx86を動かすことにした。

aarch64で動かないものは、qemu経由で動かす準備する。

aarch64でビルドできない、または、動かすのを諦めるときは、qemu 経由して動かせば良い。ユーザー空間でqemu を動かせるbinfmt-support などを入れて上げるとx86バイナリでもArm64で強引に動かせる。

sudo apt-get install qemu binfmt-support qemu-user-static

これでqemu経由で起動する。

たとえば、次のように、プロセスを見るとqemu-binfmt 経由で起動してるのがわかる。

docker compose exec rspamd-mailcow ps s
root@rspamd:/# ps xf
    PID TTY      STAT   TIME COMMAND
    728 pts/0    Ssl    0:00 /usr/libexec/qemu-binfmt/x86_64-binfmt-P /bin/bash bash
    782 ?        Rl+    0:00  \_ ps xf
      1 ?        Ssl    0:00 /usr/libexec/qemu-binfmt/x86_64-binfmt-P /bin/bash /bin/bash /docker-entrypoint.sh /usr/bin/rspamd -f -u _rspamd -g _rspamd
    779 ?        Sl     0:00 /usr/libexec/qemu-binfmt/x86_64-binfmt-P /bin/sleep sleep 3

既存のボリュームを削除する

もし、起動するバイナリを変えたり、ビルドし直したたら、ボリュームも削除しておく。データ自体はホスト側に書かれるので問題がなさそう。ただしmysql のボリュームにメールデータが保存されるので、mysql を消すと完全に初期化される。

docker compose down  --volumes

初期設定する

./generate_config.sh が初期設定コマンドで、DBパスワードやPostfixオレオレ証明書などを作ってくれる。

./generate_config.sh
Found Docker Compose Plugin (native).
Setting the DOCKER_COMPOSE_VERSION Variable to native
Notice: You´ll have to update this Compose Version via your Package Manager manually!
Press enter to confirm the detected value '[value]' where applicable or enter a custom value.
Mail server hostname (FQDN) - this is not your mail domain, but your mail servers hostname:

起動

mailcow を起動する。

初回起動は、順番に初期化しながらで5分くらいかかる。rspamd が無事に起動したら終了。

docker compose up -d
docker compose logs -f 

失敗したりやり直したときは、docker compose down --volumesでやり直す

起動状況のチェック

docker compose logs watchdog-mailcow -f

Rspamd,Postfix,Sogo,Dovecotが起動してたら最低限は動くはず。

rspamd の起動チェック

docker compose logs -f rspamd-mailcow 次がでてたら、無事に起動しているはず。

skip writing pid in no-fork mode

私は、aarch64版のrspamdを使おうとしたとき、起動後に不安定(segmentation fault)だったので、色々苦労した。rspamd が動かない場合→ qemu で動かした。

aarch64版をビルドして使うとき

sed -i '\|rspamd.com/apt-stable|d' data/Dockerfiles/rspamd/Dockerfile
docker build data/Dockerfiles/rspamd -t mailcow/rspamd:aarch64_build

起動時にのエラーに苦しんだので、このあたりを参考にすると動いた。

https://github.com/mailcow/mailcow-dockerized/issues/3106

#45(main) <sfcohf>; lua; spamassassin.lua:1714: loading SA rules from /etc/rspamd/custom/sa-rules
Segmentation fault (core dumped)

動くには動くが気づかない間に再起動を繰り返すなど動作が不安定だったので、x86で良いかとなった。

ログインする

初期パスワードは admin/moohooで固定です。

メール受信テスト

DNSを設定する。

mail.example.com mx 25 vps.example.com
vps.example.com a 192.168.100.5

ローカル実験の例 data/conf/unbound/unbound.conf

ローカルで実験する場合、DNS(名前解決)を上書きしなくちゃいけない。ローカル配送と外部Submissionを使ってメールを送信する。受信25ポートについては任意にやっておく。

ただしunbound-mailcowroot-hint(ルートネームサーバー)から名前解決をするので、上書き設定や通信設定を data/conf/unbound/unbound.conf に記入する

local-data: 'mail.example.com mx 10 vps.example.com'

または、unboundに外部DNSを参照させる。 我が家では、DNS問い合わせは特定デバイスのみ許可している。なのでmailcow が直接root.hint から名前解決が出来ない。そこで名前解決サーバーを指定した。

data/conf/unbound/unbound.conf

  forward-zone:
    name: "."
    forward-addr: 192.168.100.2

設定したら再起動しておく。

docker compose rm unbound-mailcow  --volumes
docker compose up -d unbound-mailcow

Virtual Domain の設定

設定は、次の場所にある。 mailcow -> right top -> configuration -> mailsetup

ドメインを追加して

ユーザを追加する。

追加したユーザ宛にメールを送る。

curl コマンドでサクッとメールを送る。

TO=test-user@example.com
SMTP_SERVER=xxxx.sakura.ne.jp:587
USER=postmaster@xxxxx.sakura.ne.jp
PASS=xxxxx

echo "To: $TO
From: $USER
Subject: this is a test from 587/starttls

this is a test
using smtps
"  | curl -v \
  --url "smtp://$SMTP_SERVER" \
  --user "$USER:$PASS" \
  --ssl -k \
  --mail-rcpt $TO \
  -T -

受信の確認

Sogo でサクッと見る。

Sogoは再起動しないと、ユーザ作成が反映されないので注意。

IMAPやPOPでアクセスしてもいいけどね・・・

送信の確認

送信の確認は、OP25Bがあって面倒くさいので、割愛。

ローカル配送の場合

mailcow のPostfix設定では、a_user@example.comから b_user@example.com へ配送する場合、毎回 mx を参照してしまう。 これは、mailcow のpostfix設定がローカル配送をする際に、いったんMXを経由する用に設定されているためで、ローカルはなく、すべて name virtual でやってるから。

これはNAT環境やクラウド環境(ElasticIP)などがあるときに、ループバック設定が、とてもめんどくさい。

ローカル配送をやらせる。

同一ドメイン内配送(ローカル配送)をする場合、mailcow で設定しても良いんだけど。 data/conf/unbound/unbound.confで postfix を指定してあげると楽だった。

local-data: 'mail.example.com mx 10 postfix'

レポジトリ

mailcow のarm64 のパッチとビルドをできるように、github にメモを残しておいた

https://github.com/takuya/mailcow-dockerized-aarch64

まとめ

mailcow は arm64 でも qemu 経由で動かせる。ただ、ある程度は aarch64でビルドした方が速くて快適。