Oracle CloudのOracle Linux 8で標準選択されているesmtpでメールを送信する

Oracle Cloud上のOralce Linux 8インスタンスでは、postfixやsendmailではなく、esmtpがインストールされている。

esmtpはRHEL8やCentOS8でも用意されているが、実際に使用している情報があまりない。

esmtp公式ページを見ると「THIS PROJECT IS NO LONGER BEING MAINTAINED. IF IT DOESN’T WORK FOR YOU SEE THESE LINKS.」と書いてあり、本来は利用推奨ではないようだ。

ざっと見たところ日本語情報としてまとまっているのは2010年に書かれた 本を読む の「軽量MTA「esmtp」を試してみた」だった。

esmtpはデーモンではなく、ポート25での待受もせず、/usr/lib/sendmailや/usr/bin/mail を実行する形でのメール送信が実行できるようにするためのソフトウェアです。

ローカルのUNIXユーザ宛にメールを届けたい場合は別途 procmailパッケージをインストールする必要があります。

他のサーバ宛にメールを送りたい場合は、外部のSMTPサーバのアカウント情報を登録し、SMTP AUTHを利用したメール送信が可能です。

難点は、メール送信に関するログがどこにも保存されない、ということ。

設定に失敗してメールが送信できなかった場合でもどう調べればいいのか分からない、という問題点も・・・

また、SMTP AUTHに使うパスワードを平文で設定ファイルに書く必要があるというのも、なかなかな問題点です。

とはいえ、期待通りに動けば簡単に外部SMTPを使用してメール送信ができるし、各サーバに同じ設定を入れておくとシステム系メールの送信元メールアドレスを全て同じにする、ということも容易な感じです。

設定

esmtpの設定は、システム全体に適用される /etc/esmtprc と、各UNIXユーザごとの~/.esmtprc で行います。

とりあえずシステム系メールを送りたいだけであれば /etc/esmtprc を設定しておけばいい感じです。

/etc/esmtprc は用意されていないので /usr/share/doc/esmtp/sample.esmtprc にあるサンプルをコピーして使うか、必要なものだけを書きます。

sample.esmtprcの内容

# Sample configuration file for ESMTP.
#
#       Jose Fonseca

# Set SMTP host and service (port)
#
hostname = localhost:25

# Set the user name
#
username = "USERNAME"

# Set the password
password = "PASSWORD"

# Use the Starttls
#
#starttls = disabled
#
# It can be one of "enabled", "disabled" or "required". It defaults to
# disabled.

# Set the certificate passphrase
#
#certificate_passphrase = "CERTIFICATE_PASSPHRASE"

# Command to run before contacting the SMTP server
#
#preconnect = "ssh -f -L 2025:mail.isp.com:25 user@shell.isp.com 'sleep 5'"


# Same as above but for a different identity which can be selected with the
# '-f' flag. You can have as many you like.
#
identity = myself@somewhere.com
        hostname = smtp.somewhere.com:25
        username = "myself"
        password = "secret"
        #starttls = disabled
#
# NOTE: the default indentity settings aren't shared by the other identities.
# Everything (username, password, etc.) must be specified for every identity
# even if they don't differ from the default identity.


# Set the Mail Delivery Agent (MDA)
#
mda = "/usr/bin/procmail -d %T"
#
# Some possible MDAs are "/usr/bin/procmail -d %T", "/usr/bin/deliver" or
# "/usr/lib/mail.local %T".

これを使ってもいいのですが、必要なものだけを書いた方が簡単ですね。

外部のSMTPサーバを使って送信する設定例

Net@ddressというかれこれ20年以上使っているメールサービスのアカウントを使用してメール送信する設定です。

hostname=smtp.postoffice.net:25
username="ユーザ名@usa.net"
password="パスワード"

mda "/usr/bin/procmail -d %T"

これを /etc/esmtprc に書いたサーバから mailコマンドを使って送信したメールは全て「ユーザ名@usa.net」が発信元となって送られることになります。

また、「mda “/usr/bin/procmail -d %T”」という設定を入れているので、ローカルユーザ宛のメールであれば /var/spool/mail/ に配送されるようにしています。

SMTP送信時にstarttlsが必要な場合は「starttls=enabled」を追加すればいいようなのですが、下記の手順でやったのですが、送信されませんでした。

$ mkdir ~/.authenticate
$ chmod 0700 ~/.authenticate
$ wget http://curl.haxx.se/ca/cacert.pem
$ mv cacert.pem ~/.authenticate/ca.pem
$ chmod 0600 ~/.authenticate/ca.pem
$ mailx メール送り先@ドメイン名
Subject: test mail 5
test mail 5
.
EOT
$ 0 (null)
メール送り先@ドメイン名: 0 (null)
0 (null)
メール送り先@ドメイン名: 0 (null)
メール送り先@ドメイン名: 0 (null)
procmail: Unknown user "-r"
0 (null)
メール送り先@ドメイン名: 0 (null)
メール送り先@ドメイン名: 0 (null)
procmail: Unknown user "-r"

とりあえずstarttls対応は保留ですね。

なお、 /etc/esmtprcでは、下記の様な書式を使うこともできます。

identity ユーザ名@usa.net
        hostname smtp.postoffice.net:25
        username "ユーザ名@usa.net"
        password "パスワード"
        default

mda "/usr/bin/procmail -d %T"

ユーザによってアカウントを変える場合はこれを使うようです。


2021/07/02追記

さて、Oracle Linux 7環境でesmtpを設定してみたところ、cronで送られてくるメールが送信できていないようだ。

/etc/cron.daily/0logwatch:

You have old files in your logwatch tmpdir (/var/cache/logwatch):
        logwatch.idrC25J0
        logwatch.Hb7DUNNO
The directories listed above were most likely created by a
logwatch run that failed to complete successfully.  If so, you
may delete these directories.

/bin/mktemp: failed to create directory via template '/root/.esmtp_queue/XXXXXXX
X': Permission denied
unable to create tempdir inside /root/.esmtp_queue
/etc/cron.daily/0yum-daily.cron:

root宛に上記のような一時ファイルが作れないというエラーメールが届いていた。

/var/log/audit/audit.log 内を esmtp で検索してみると、下記の様にSELinuxの権限問題で書き込みが阻止されていた。

# grep esmt /var/log/audit/audit.log
type=AVC msg=audit(1623953887.619:18168): avc:  denied  { write } for  pid=23636 comm="mktemp" name=".esmtp_queue" dev="sda3" ino=2567447 scontext=system_u:system_r:logwatch_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mail_home_rw_t:s0 tclass=dir permissive=0
#

/root/.esmtp_queue のSELinuxコンテキストを確認すると、mail_home_rw_tとなっている。要求はlogwatch

# ls -ldZ /root/.esmtp_queue
drwxr-xr-x. root root unconfined_u:object_r:mail_home_rw_t:s0 /root/.esmtp_queue
#

関係しそうな事例を発見
Bug 1366173 – /root/.esmtp_queue has bad context when created from a cron job
Bug 1592083 – SELinux is preventing touch from ‘create’ accesses on the archivo mail.
Bug 1295923 – SELinux is preventing sendmail from ‘read’ accesses on the directory .esmtp_queue.
Bug 1303305 – errors from esmtp in /var/log/messages every time my cron job runs
Bug 1149164 – SELinux is preventing esmtp from ‘read’ accesses on the file /.esmtp_queue/4PVJsKZY/mail.

ただ、上記は調査方法や解決方法に関して直接の記載がない。

また、Bug 1303305 には、esmtpはローカル配送にのみ使え、なんて書かれている。

Fedora MaillingList「Trying to use mailx for logwatch」に確認してくヒントがあった。

まず、「logwatch_t」で設定されている内容の確認してみる

# sesearch -T -s logwatch_t
Found 12 semantic te rules:
   type_transition logwatch_t postfix_postdrop_t : process logwatch_mail_t;
   type_transition logwatch_t abrt_helper_exec_t : process abrt_helper_t;
   type_transition logwatch_t ntpd_exec_t : process ntpd_t;
   type_transition logwatch_t postfix_postqueue_exec_t : process postfix_postqueue_t;
   type_transition logwatch_t sendmail_exec_t : process logwatch_mail_t;
   type_transition logwatch_t var_lock_t : file logwatch_lock_t;
   type_transition logwatch_t courier_exec_t : process logwatch_mail_t;
   type_transition logwatch_t mdadm_exec_t : process mdadm_t;
   type_transition logwatch_t tmp_t : dir logwatch_tmp_t;
   type_transition logwatch_t tmp_t : file logwatch_tmp_t;
   type_transition logwatch_t exim_exec_t : process logwatch_mail_t;
   type_transition logwatch_t var_run_t : file logwatch_var_run_t;

#

ターゲット側が mail_home_rw_t なものを調べて見ると

# sesearch -T | grep mail_home_rw_t
type_transition cups_pdf_t user_home_dir_t : dir mail_home_rw_t "Maildir";
type_transition cinder_backup_t user_home_dir_t : dir mail_home_rw_t "Maildir";
type_transition conman_unconfined_script_t admin_home_t : file mail_home_rw_t ".esmtp_queue";
<略>
type_transition samba_unconfined_script_t user_home_dir_t : dir mail_home_rw_t ".esmtp_queue";
type_transition vmtools_unconfined_t admin_home_t : dir mail_home_rw_t ".maildir";
# sesearch -T |grep mail_home_rw_t |wc
    886    6202   72157
#

886個設定されているようだ。

「logwatch」が関連しているものに限定してみると

# sesearch -T |grep mail_home_rw_t |grep logwatch
type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".esmtp_queue";
type_transition logwatch_mail_t user_home_dir_t : file mail_home_rw_t ".esmtp_queue";
type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".maildir";
type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".maildir";
type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t "Maildir";
type_transition logwatch_mail_t admin_home_t : file mail_home_rw_t ".esmtp_queue";
type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".esmtp_queue";
type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t "Maildir";
#

ソースターゲットが logwatch_mail_t でいろいろ設定されているようなので、「logwatch_mail_t」で調べて見る

# sesearch -T -s logwatch_mail_t
Found 15 semantic te rules:
   type_transition logwatch_mail_t postfix_etc_t : file etc_aliases_t;
   type_transition logwatch_mail_t postfix_postqueue_exec_t : process postfix_postqueue_t;
   type_transition logwatch_mail_t abrt_helper_exec_t : process abrt_helper_t;
   type_transition logwatch_mail_t tmp_t : file logwatch_mail_tmp_t;
   type_transition logwatch_mail_t postfix_etc_t : lnk_file etc_aliases_t;
   type_transition logwatch_mail_t tmp_t : dir logwatch_mail_tmp_t;
   type_transition logwatch_mail_t var_log_t : file sendmail_log_t;
   type_transition logwatch_mail_t postfix_showq_exec_t : process postfix_showq_t;
   type_transition logwatch_mail_t postfix_etc_t : sock_file etc_aliases_t;
   type_transition logwatch_mail_t qmail_inject_exec_t : process qmail_inject_t;
   type_transition logwatch_mail_t exim_exec_t : process exim_t;
   type_transition logwatch_mail_t postfix_postdrop_exec_t : process postfix_postdrop_t;
   type_transition logwatch_mail_t postfix_etc_t : dir etc_aliases_t;
   type_transition logwatch_mail_t qmail_queue_exec_t : process qmail_queue_t;
   type_transition logwatch_mail_t postfix_etc_t : fifo_file etc_aliases_t;

Found 14 named file transition filename_trans:
type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".esmtp_queue";
type_transition logwatch_mail_t user_home_dir_t : file mail_home_rw_t ".esmtp_queue";
type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".maildir";
type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".maildir";
type_transition logwatch_mail_t user_home_dir_t : file mail_home_t "dead.letter";
type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t "Maildir";
type_transition logwatch_mail_t user_home_dir_t : file mail_home_t ".mailrc";
type_transition logwatch_mail_t admin_home_t : file mail_home_t "dead.letter";
type_transition logwatch_mail_t admin_home_t : file mail_home_rw_t ".esmtp_queue";
type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".esmtp_queue";
type_transition logwatch_mail_t admin_home_t : file mail_home_t ".forward";
type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t "Maildir";
type_transition logwatch_mail_t admin_home_t : file mail_home_t ".mailrc";
type_transition logwatch_mail_t user_home_dir_t : file mail_home_t ".forward";
#

最初に実行した sesearch -T -s logwatch_t の結果内にいくつか logwatch_mail_t への定義が描かれているがcronからのメール送信には適用されていない?

仕方がないので /var/log/audit/audit.log* の出力結果から書き込みなどの操作エラーの発生対象である mail_home_rw_t について抜き出す

# grep deni /var/log/audit/audit.log*|grep mail_home_rw_t
<略>
/var/log/audit/audit.log.4:type=AVC msg=audit(1623953887.619:18168): avc:  denied  { write } for  pid=23636 comm="mktemp" name=".esmtp_queue" dev="sda3" ino=2567447 scontext=system_u:system_r:logwatch_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mail_home_rw_t:s0 tclass=dir permissive=0
/var/log/audit/audit.log.4:type=AVC msg=audit(1624041848.311:27261): avc:  denied  { add_name } for  pid=5082 comm="mktemp" name="PcKUa8QZ" scontext=system_u:system_r:logwatch_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mail_home_rw_t:s0 tclass=dir permissive=0
/var/log/audit/audit.log.4:type=AVC msg=audit(1624126686.899:34916): avc:  denied  { add_name } for  pid=15196 comm="mktemp" name="jiIjNaug" scontext=system_u:system_r:logwatch_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mail_home_rw_t:s0 tclass=dir permissive=0
#

これをaudit2allowコマンドでSELinuxのモジュール化して、読み込む。

# grep deni /var/log/audit/audit.log*|grep mail_home_rw_t

#============= logwatch_t ==============

#!!!! This avc is allowed in the current policy
allow logwatch_t mail_home_rw_t:dir create;
allow logwatch_t mail_home_rw_t:file create;
# grep deni /var/log/audit/audit.log*|grep mail_home_rw_t | audit2allow -M mktemp

******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i mktemp.pp

# semodule -i mktemp.pp
# semodule -l | mktemp
mktemp  1.0
#

ただ、1回だけではだめで、何回か追加を繰り替えすことになった。

最終的に作成された mktemp.te ファイルは下記となった。

module mktemp 1.0.8;

require {
        type logwatch_t;
        type mail_home_rw_t;
        class file { create link open read setattr unlink write };
        class dir { add_name create read remove_name rmdir write };
}

#============= logwatch_t ==============

#!!!! This avc is allowed in the current policy
allow logwatch_t mail_home_rw_t:dir { add_name create read remove_name rmdir write };

#!!!! This avc is allowed in the current policy
allow logwatch_t mail_home_rw_t:file { create link open read setattr unlink write };

こうやって作成したテキストのteファイルを modファイル経由で pp形式に出力

# checkmodule -M -m -o mktemp.mod mktemp.te
checkmodule:  loading policy configuration from mktemp.te
checkmodule:  policy configuration loaded
checkmodule:  writing binary representation (version 19) to mktemp.mod
# semodule_package -o mktemp.pp -m mktemp.mod
#

現在のモジュール状況を確認して、読み込み

# semodule -l | grep mktemp
mktemp  1.0.7
# semodule -i mktemp.pp
# semodule -l | grep mktemp
mktemp  1.0.8
#

モジュールのバージョンが変更されたことを確認。

なお、不要になったモジュールは「semodule -r モジュール名」で削除できる。

バッファローWSR-1800AX4をEasyMesh対応にしてみた

うちの環境ではバッファローのWSR-1800AX4を2台使用している。

1台は無線AP(物理スイッチ:AP設定)として、もう1台は離れた場所にある有線LANを無線接続するためのブリッジ(物理スイッチ:WB設定)として使っている。(ルーターは別にある)

そんなWSR-1800AX4にfirmware version 1.02が提供された。

今回の売りは「EasyMesh機能追加」

画像

よし、アップデートするか!と思いつつ、ver 1.02の変更点にある「IPアドレスを手動設定していてもDHCPになる」に心当たりが・・・

WB設定側のWSR-1800AX4は確かにWiFi接続されるまでは固定IPアドレスで動いているけど、WiFi接続されたあとはアクセスできなくなってたんですよね・・・

画像

まさか、こんなバグだったとは・・・

まあ、それはさておき両方をアップデートしてみました。

AP側はこんな感じ

画像

WB側はこんな感じです。

画像

この状態で、AP側「プッシュボタンによるWPSを開始する」WB側「WiFiルーターとのWPSを開始する」をクリックすると接続処理が開始されます。

このとき、WB側の2.4GHz/5GHz WiFi設定で無線機能を無効に設定していると、EasyMeshではなく通常のブリッジ(WB)接続としてつながってしまいます。

EasyMeshはWB側もAPとして動く必要があるので無線機能を有効にしておく必要があります。(SSID名の指定などはWPSボタンによる自働EasyMesh設定により行われます)

EasyMeshの接続処理が終わると、AP側ではこんな表示になります。

コントローラが「AP」で、エージェントが「WB」です。

WB側はこんな感じです。

画像

ここで表示されている「SSID」は「Backhaul SSID」というもので、これを使ってWSR-1800AX4間を結んでいる感じになっています。

さて、EasyMeshを使うと、端末に近い方にあるWSR-1800AX4に接続されるようになります。

どちらに接続されているかは、コントローラ(AP)になっている方の接続機器一覧を開いて確認します。

画像

デバイスの「接続先」の数字が、コントローラ/エージェントにあるアクセスポイントのNoになります。

上記の場合、赤枠で囲った2台がエージェントのアクセスポイント(WB)につながっている、ということになります。

というわけで、WSR-1800AX4をEasyMesh対応にできる、というのは非常に有用なアップデートでした。


2021/07/12追記

1ヶ月EasyMeshとして使って見ましたが、よくわからない条件で接続できない機械が多くて難儀です。

・realme 7 5G: 最初は接続できるけど、急に接続出来なくなる。スマホ再起動で再接続できるように戻る
・Intel WiFi AX200 搭載ノート: 接続を拒否される
・Kobo nia: 接続を拒否される。 Kobo gloは接続できるのに
・Huawei nova lite 3: 接続を拒否される。

・・・よくわかりません。

うちの場合、もう1つゲーム機向けにPPPoE接続用WiFiがあるので、そちらを使うことで回避できていますが、はやめに修正してもらいたいところですね。


2021/11/30追記

WSR-1800AX4 version 1.04で上記問題は解消されました。

変更履歴にあった高速ローミング(802.11r)周りの動作が関係していたようです。

また、Linksys E8450がEasyMeshに対応したとのことで、バッファローの子機にできないかなぁ・・・と思って買ってみたところ、子機として動作はしましたが、設定画面にアクセスできなくなるし、5GHz帯がW52チャンネルの4つしか使えないクソ仕様だし、ということで、ゴミでした。

詳しくは→「Linksys E8450 AX3200はEasyMeshでバッファローの子機にもできるけど5GHzが4チャンネルしか使えない

Linux上からIPv6アドレス指定でsshするときにはインタフェース名をつける

Linux上からIPv6アドレスを指定してsshしようとしたら「port 22: Invalid argument」と言われてしまった。

[root@centos8 ~]# ssh root@fe80::250:56ff:fe8f:aba9
ssh: connect to host fe80::250:56ff:fe8f:aba9 port 22: Invalid argument
[root@centos8 ~]#

きちんとpingでは応答あるのに

[root@centos8 ~]# ping -6 fe80::250:56ff:fe8f:aba9 -c 5
PING fe80::250:56ff:fe8f:aba9(fe80::250:56ff:fe8f:aba9) 56 data bytes
64 bytes from fe80::250:56ff:fe8f:aba9%ens192: icmp_seq=1 ttl=255 time=0.246 ms
64 bytes from fe80::250:56ff:fe8f:aba9%ens192: icmp_seq=2 ttl=255 time=0.269 ms
64 bytes from fe80::250:56ff:fe8f:aba9%ens192: icmp_seq=3 ttl=255 time=0.250 ms
64 bytes from fe80::250:56ff:fe8f:aba9%ens192: icmp_seq=4 ttl=255 time=0.303 ms
64 bytes from fe80::250:56ff:fe8f:aba9%ens192: icmp_seq=5 ttl=255 time=0.316 ms

--- fe80::250:56ff:fe8f:aba9 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 135ms
rtt min/avg/max/mdev = 0.246/0.276/0.316/0.035 ms
[root@centos8 ~]#

なんでかと思ったら、sshコマンドでは、sshコマンドを実行したホストのどのインタフェースを使ってアクセスするのかを明示的に指定する必要があったようだ。

[root@centos8 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:9c:2a:d1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.44.49/16 brd 172.17.255.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 xxxx:xxx:xxxx:4700:2788:3aad:4bfa:6715/64 scope global dynamic noprefixroute
       valid_lft 2172237sec preferred_lft 185037sec
    inet6 fe80::2c85:a948:cd5:d5e1/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@centos8 ~]#

つかうネットワークインタフェースは「ens192」なので、IPv6アドレスの後ろに「%ens192」をつけて実行

[root@centos8 ~]# ssh  root@fe80::250:56ff:fe8f:aba9%ens192
Password:
Last login: Wed Apr  7 16:24:37 2021 from fe80::2c85:a948
Oracle Corporation      SunOS 5.11      11.3    September 2015
root@solaris11:~# exit
logout
Connection to fe80::250:56ff:fe8f:aba9%ens192 closed.
[root@centos8 ~]#

問題無く接続できました。

プラスメッセージ(+メッセージ)の対応状況 2021/04/26時点

2021/04/26時点ではahamoとpovoのみ対応、という感じですね。

2021/03/19 初版作成
2021/04/26 LINEMOの回答記載

ahamo 「+メッセージ(プラスメッセージ)は使えますか?」→ご利用いただけます。

povo「povoサービスの詳細」→+メッセージ:ご利用いただけます

ワイモバイルについては直接の記述が発見できず、ソフトバンクの「+メッセージ(プラスメッセージ)」に「本サービスはソフトバンク(ワイモバイルを除く)、NTTドコモ、auをお使いの方がご利用いただけます」と記載

LINEMO「「プラスメッセージ」は使えますか?」→いいえ、「プラスメッセージ」は使えません。現状、対応予定はありません。

UQ mobie「UQ mobileで「+メッセージ(プラスメッセージ)」は利用できますか」→UQ mobileでは、現状「+メッセージ(プラスメッセージ)」サービスは提供しておりません。

楽天モバイル「+メッセージ(プラスメッセージ)の利用はできますか?」→+メッセージ(プラスメッセージ)のご利用はいただけません

楽天モバイル回線でForticlientによるSSL-VPNを行うと98%で止まるがエラーもない件の対処

楽天モバイル回線でForticlientによるSSL-VPNを行うと、下記の98%の状態で止まり、しばらく待つとエラーメッセージもなく未接続状態に戻ってしまう。

楽天モバイル回線以外でやってみると正常に接続できる。

2022/02/01追記: 今日からNTTドコモでIPv6シングルスタック化が始まったらしい。もしかして、類似の現象がドコモでテザリングした際に発生する可能性がある。

ちなみに他の回線でも発生する場合はデバイスマネージャのネットワークアダプタにある「WAN Miniport (IP)」をアンインストールし、Windows再起動することで再作成させることで治ることが多いようだ。

楽天モバイルの場合の事例についてぐぐるとIPv6を無効化するといける、という話があるので、そこらへんにヒントがあるな、と調べて見た。

調査方法は SSL-VPN接続先として指定するホスト名の名前解決を調べて見る

C:\> nslookup vpn.domain.local
サーバー: Unknown
Address: 192.168.43.1

権限のない回答:
名前: vpn.domain.local
Address: 64:ff9b::xxxx:xxxx
      xxx.xxx.xxx.xxx
C:\>

IPv6アドレスは設定されていないはずなのにIPv6アドレスの応答があるとは何事???

Google DNSで名前解決を調べて見ると、こちらは想定通りのIPv4アドレスのみの応答となる。

C:\> nslookup vpn.domain.local 8.8.8.8
サーバー: dns.google
Address: 8.8.8.8

権限のない回答:
名前: vpn.domain.local
Address: xxx.xxx.xxx.xxx
C:\>

この設定していないはずのIPv6アドレス「64:ff9b::xxxx:xxxx」が何者なのか調べたところ、NAT64用に予約されているアドレス帯であることが判明。

JPNIC ニュースレターNo.64「NAT64/DNS64

楽天モバイル網ではIPv6ベースで通信を行うため、IPv4のみの接続先についてIPv6に変換したアドレスを用意している、ということになるようだ。

ただ、FortiClientの実装上それでは都合が悪いようだ。

FortiClientのSSL-VPN接続先のサーバ指定を、サーバ名表記から、IPv4アドレス表記に変更し、「無効なサーバ証明書を非表示」に設定することで接続が完了することを確認した。

「無効なサーバ証明書を非表示」に設定する理由は、SSL証明書はホスト名に対して発行されており、IPアドレスに対しては発行されていないためです。(以前はIPアドレスに対しても発行できたが、現在は禁止されている)


2021/10/15追記

BIGLOBEがInfra Study 2nd #3「いまさら聞けないIPv6ネットワーク」というイベントで「DNSの振り分けでNAT64/DNS64の不具合を回避 ~固定回線でIPv4 over IPv6接続するための工夫~」という発表を行った。

BIGLOBEでは固定回線でもNAT64/DNS64を導入しているのですが、IPv6アドレスに変換されると困るサービスなどは、DNS64の名前解決を行わないようにDNSサーバ側で細工をしている、とのこと。