設定したことを忘れないように書いてあります。
Shuriken 2018ならShuriken TLS設定ツールで対応できるのだが、2016なので繋がらない。 なので、stunnelで、rocky linuxのサーバにproxyを立てて、TLS 1.0 <-->TLS 1.2のバージョン変換をすることにした。 stunnelはwindows版もあるので、サーバーではなくPCそのものにインストール・設定してもつかえるかもしれない。
参考にしたのは、このページ。
stunnelはパッケージがあるので、dnf install -y stunnelでインストール。 設定ファイルは、/etc/stunnelにおけば名前はなんでも良いようだが、慣例にしたがってstunnel.confとした。記述内容は以下のとおり。
# /etc/stunnel/stunnel.conf # Log settings output=/var/log/stunnel.log service=stunnel # connect to sonet [TLS_proxy_connector] client = yes accept = 127.0.0.1:2525 protocol = smtp connect = mail.so-net.ne.jp:587 sslVersion = TLSv1.2 # connect from shuriken [TLS_proxy_listener] accept = 9025 protocol = smtp key = /etc/letsencrypt/live/jp-oota.net/privkey.pem cert = /etc/letsencrypt/live/jp-oota.net/cert.pem CAFile = /etc/letsencrypt/live/jp-oota.net/fullchain.pem connect = 2525
[TLS_proxy_connector]のセクションは、so-netへ接続させるためのもの。参考にしたページは証明書のverifyをしていたが、ルート証明書の指定と管理が面倒なのでverifyは行わないこととした。
sslVersionの設定は最初はしていなかったが、接続できなかったので追加した。 しかしながら、接続できなかったのは後述の「STARTTLSを使用」の設定の問題かもしれず、不要の可能性もあるが未検証。現時点では実害はないはずなので、そのまま。
[TLS_proxy_listener]のセクションは、shurikenからの接続を受けるためのもの。9025ポートでlistenして、2525ポートにforwardしている。 このポート番号は[TLS_proxy_connector]セクションのAcceptで受けているポートと合わせる必要がある。
証明書ファイル類は、letsenvryptでwebサーバ用に作成したものを指定した。 なので本当のファイル名はちょっと違し、メールサーバらしからぬFQDN。
また、firewallで不要なポートは閉じていたので、/usr/lib/firewalld/serviceに、9025ポートのservice定義を書いてfirewall-cmdでポートを開けた。
これで、shurikenのアカウント登録設定の「送信(SMTP)サーバの名前」にstunnelが動作しているサーバ名(SSL証明書と一致するもの)、「送信サーバのポート番号」に9025を指定し、「SSLを使用」を「する」に、「STARTTLSを使用」を「しない」にすることで、メール送信が可能になった。
Aug 12 21:32:42 XXXXXX named[1488]: REFUSED unexpected RCODE resolving 'p.adsymptotic.com/A/IN': 172.64.32.241#53
などというログが大量に/var/log/messagesに残るので対処した。 といってもキャッシュをクリアしただけ。 コマンドは,以下。
ちなみに、rndc ユーティリティーは、ローカルとリモートマシンの両方から named サービスの管理を可能にするコマンドラインツール。 参考にしたページは、rndcをrdncと記述していてしばらく悩んだ。
# rndc flush # rndc reload
作業メモなどは、すべてMarkDownで記述し、保管しているディレクトリをApacheで公開している。 この文書をブラウザで開くと単なるテキスト表示されてしまうが、これを成形した形で表示したい。
同じようなことを考えている人はおり、それを参考にして実施したが,全く同じでは動作しなかったので修正点などをメモとしてする。
markdown文書を成形するために、php-markdonwをインストールする。 インストールにあたって、依存性管理のために、まずはcomposerをインストール。
https://getcomposer.org/download/ に従い、以下のコマンドを実施。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" $ php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
composer-setup.phpを実施するとphpのjson拡張が無いといわれる。 当方、CentOS-8なので、以下のパッケージをインストールした。
$ sudo dnf install -y php-json
composerを/var/lib/php/composerにインストール。
$sudo php composer-setup.php --install-dir=/var/lib/php/composer All settings correct for using Composer Downloading... Composer (version 2.0.13) successfully installed to: /var/lib/php/composer/composer.phar Use it: php /var/lib/php/composer/composer.phar
グローバルで使えるように/usr/binにシンボリックリンクを張る。これは直パスで打つなら必要のない作業。
$ sudo ln -sf /var/lib/php/composer/composer.phar /usr/bin/composer
いくつか種類はあるようだが、参考にしたページにあるphp-markdownをインストール。 インストール先は/var/lib/php/composerとした。
$ cd /var/lib/php/composer $ sudo composer require michelf/php-markdown Using version ^1.9 for michelf/php-markdown ./composer.json has been updated Running composer update michelf/php-markdown Loading composer repositories with package information Updating dependencies Lock file operations: 1 install, 0 updates, 0 removals - Locking michelf/php-markdown (1.9.0) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Downloading michelf/php-markdown (1.9.0) - Installing michelf/php-markdown (1.9.0): Extracting archive Generating autoload files
markdownを保存しているディレクトリの.htaccessに以下を追加する。
AddTypeにより、拡張子".md"の場合に、コンテンツタイプとして"text/markdown"を追加し、 Actionディレクティブにより、"text/markdown"に対して、指定したファイルを実行する。
Actionで指定したmd.phpは、phpが動作するディレクトリに置き、ドキュメントルートからのパスで指定する。
AddType text/markdown md Action text/markdown /Memo/md.php
md.phpを上記の場所に設置する。内容は以下のとおり。
<?php set_include_path(get_include_path().PATH_SEPARATOR."/var/lib/php/composer/vendor/"); require 'autoload.php'; use Michelf\MarkdownExtra; if ( isset($_SERVER['PATH_TRANSLATED']) ) { $file = realpath($_SERVER['PATH_TRANSLATED']); $ext = substr($file, strrpos($file, '.') + 1); $title = $_SERVER['REQUEST_URI']; } if ( $file and is_readable($file) and strtolower($ext) === 'md') $body = MarkdownExtra::defaultTransform(file_get_contents($file)); else $body = '<p>cannot read file</p>'; header('Content-Type: text/html;'); echo '<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="/css/markdown.css" title="MarkDown Style" /> <title>'.$title.'</title> </head> <body> ' . $body . ' </body> </html>'; ?>
include_pathは、php.iniに記述しても良いが、md.phpに記述することとした。 include_pathは、composerのautoload.phpがある場所を、URLではなくローカルディレクトリのパスで指定する。 composerでインストールしたパッケージは、autoload.phpをrequireすることで使用できる。
useでMarkdownExtraではなく、Markdownとすると、TraditionalなMarkdown記法となる。 あえてTraditionalなフォーマットを指定する理由がないので、MarkdownExtraを使用した。
MarkdownExtraでは、テーブルタグも利用できる。
stylesheetをlinkタグで指定しておき、自分の見やすいようにcssで成形する。
dockerをインストールできたので、smokepingをdocker上に構築してみる
dockerのイメージを取得する。-pオプションにより、smokepingの内部ポート80に対して、外部のポート番号1888を接続している。
$ sudo docker run -it --name smokeping -p 1880:80 -e TZ=Asia/Tokyo -d dperson/smokeping fa9d04d50cb41fe7886f1ae03b3239074df5a94319237965029f168584c7e45c
コンテナに対する操作は、コンテナIDを使用する。コンテナIDを確認するためには以下のコマンドを使用。
$ sudo docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa9d04d50cb4 dperson/smokeping "smokeping.sh" 17 minutes ago Up 17 minutes 0.0.0.0:1880->80/tcp smokeping
監視ターゲットとして、googleのDNSを設定してみる。
$ sudo docker exec -it smokeping smokeping.sh -t "Google;DNS1;8.8.8.8" Service already running, reloading configuration HUP signal sent to the running SmokePing process, exiting.
ターゲットファイルを直接編集する場合は、一度ホスト側にファイルを持ってきてから編集する。
$ sudo docker cp fa9d04d50cb4:/etc/smokeping/config.d/Targets ~
$ sudo docker cp ~/Targets fa9d04d50cb4:/etc/smokeping/config.d/
$ sudo docker exec -it fa9d04d50cb4 /bin/cat /etc/smokeping/config.d/Targets
設定を反映させるために、コンテナを再起動する
$sudo docker restart fa9d04d50cb4
サーバ再起動時等にコンテナを再起動するように設定する。alwaysはコンテナが停止した場合は自動再起動。その他のオプションは以下の通り。
sudo docker update --restart=always smokeping
オプション | 意味 |
---|---|
no | コンテナを自動的に再起動しない |
on-failure | エラー発生時にコンテナを再起動する |
always | コンテナが停止すると常に再起動 |
unless-stopped | 手動でコンテナを停止した場合は再起動しない |
設定がされたことを確認するには、docker inspectを使用する。
sudo docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' fa9d04d50cb4 always