V-antena and Tanimoto's page

谷本の備忘録・雑記帳・work

>

カテゴリー: Raspberry pi

CATEGORY ARCHIVE

LAN内専用のメールサーバーは構築していたが、LAN外からメールを受信できれば、用途が広がる。
そこで、sslをサポートし、また帰宅後も再度PCでメールを見れるようにIMAP形式のメールサーバーを構築する。  なお、外部からメール受信には外部メールサービスを使うpush方式と、自ら見に行くpull方式があるが、まずはpull方式とした(gmailサーバー等をリレーしない)

※まだ、おかしいところがあるかも。いったんメモとして公開する。

構築イメージ

参考としたサイト

How to set up a mail server on your Raspberry Pi?

 (Roundcubeを使う部分は実装せずにすました。 また、ENNABLE IMAPSの箇所で一部設定変更)

OpenSSL で SSL 自己証明書を発行する手順
先の参考サイトではdovecot.pemを使うとなっていたが、それだとエラーになったため。自己証明書ではなく本当はletsencryptを使うのが良いが、別のサーバーでテストしていたため自己証明書で行った。 

インストールとテンプレート準備

sudo apt install postfix
sudo nano /etc/postfix/main.cf
sudo apt install mailutils
sudo apt install dovecot-imapd

sudo maildirmake.dovecot /etc/skel/Maildir
sudo maildirmake.dovecot /etc/skel/Maildir/.Drafts
sudo maildirmake.dovecot /etc/skel/Maildir/.Sent
sudo maildirmake.dovecot /etc/skel/Maildir/.Spam
sudo maildirmake.dovecot /etc/skel/Maildir/.Trash
sudo maildirmake.dovecot /etc/skel/Maildir/.Templates

ssl用自己証明書作成

makedir ssls
sudo openssl genrsa 4096 > ssls/server.key
openssl req -new -key ssls/server.key > ssls/server.csr
openssl x509 -req -days 365 -signkey ssls/server.key < ssls/server.csr >ssls/server.crt

3つ目のserver.csrを作成するところで出てくる質問には例えば以下の様に答える
JP
都道府県名
区名/市名/郡名 など
組織名等
  単に改行
ドメイン名(例: example.com)
その後の質問は改行でかまわない

場所移動
sudo cp ssls/* /etc/dovecot/private

postfixの設定

ポート番号の設定、ドメイン名の設定、ネットワークの指定等を行う

sudo nano /etc/postfix/main.cf
myhostname = example.com
mydomain = example.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/24
inet_protocols = ipv4
home_mailbox = Maildir/

#  以下追加
mailbox_command =
smtpd_helo_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_invalid_helo_hostname,
        reject_non_fqdn_helo_hostname,
        reject_unknown_helo_hostname,
        check_helo_access hash:/etc/postfix/helo_access
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

sudo nano /etc/postfix/helo_access
aaa.bb.cc.ddd  REJECT        # aaa.bb.cc.ddd はexample.comのIPアドレス
# example.com   REJECT
smtp.example.com   REJECT
mail.example.com   REJECT
sudo nano /etc/postfix/master.cf
587      inet  n       -       y       -       -       smtpd     #smtpを587にした

sudo service postfix restart で、postfixを起動

dovecotの設定

sudo nano /etc/dovecot/dovecot.conf
listen = *
sudo nano /etc/dovecot/conf.d/10-mail.conf
mail_location = ~/Maildir
sudo nano /etc/dovecot/conf.d/10-master.conf
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }

service auth {
        unix_listener /var/spool/postfix/private/auth {
                mode = 0660
                user = postfix
                group = postfix
        }
}
sudo nano /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain login
sudo nano /etc/dovecot/conf.d/10-ssl.conf

ssl = yes
ssl_cert = </etc/dovecot/private/server.crt
ssl_key = </etc/dovecot/private/server.key
ssl_min_protocols = TLSv1.2

ssl = yes

ssl_cert = </etc/dovecot/dovecot.pem       #  private/ を消すことに注意
ssl_key = </etc/dovecot/private/dovecot.pem  # .keyを.pemにすることに注意

ssl_min_protocols = TLSv1.2

sudo service dovecot restart でdovecotを再起動

自分証明書だとおこられるかも。letsencryptので行う必要ありか。

テスト及び実行

sudo adduser testuser

※ 下記部分は「自己証明書作成」部分を行った場合は不要

printf '\0%s\0%s' 'testuser' 'password' | openssl base64
cd /etc/dovecot
sudo openssl req -new -x509 -nodes -config /usr/share/dovecot/dovecot-openssl.cnf -out dovecot.pem -keyout private/dovecot.pem -days 365

メーラー側の設定

protocol imap4
smtp認証 しない
ssl imap4 sslを使用
smtp sslを使用しない
smtp ポート番号 587
IMAP ポート番号 993
コードはutf-8にする。(文字化けするので) 2021/3/31追記

自己証明書なので信頼できないといわれるが、許可して受け入れると受信可能となる。

※ smtp側を開けていないとほとんどのメーラが使えない。 windowsだとSylpheedは使えた。 androidだとOpen Mailが使えた(おそらくK-9 Mailも)。 2021/3/31 追記

その他エラー対策

/var/log/mail.err や /var/log/syslogにエラーが出ているのでうまくいかないとき、コマンドでの直接のエラーメッセージの他にここをみてチェック

もし、 key too smallの様なメッセージが出た場合は /etc/ssl/openssl.cnf 中の
CipherString = DEFAULT@SECLEVEL=2 の値を1にしてみる

もし、 /dev/urandomでエラーになった場合は、 /usr/share/dovecot/dovecot-openssl.cnf 中のRANDFILE = /dev/urandom部分をコメントアウトしてみる。 ついでにkey長を4096にするのが良い

Raspberry pi 2B v1.1で、SDHCでブートし、以降HDDを使う設定にしたが、何かの拍子で(おそらくrebootで)sudoが無効になってしまった。 例えば、sudoで行っているのに読み込み専用ファイルですとかのエラーが出る。

対応

sudo mount -o remount,rw /  を実行すると、(一部エラーの表示がでるが)復活した。

SDHCで立ち上がっている?

※ /etc/rc.localに記述してもダメ
 また、systemctl --failed で見てみると、xrdpやpostfix, dovecot 他 が立ち上がっていない。
 /etc/fstabに書いたがそこが読まれなかったのか?

背景

raspberry piのサーバーを変更したので、それまでサーバー用として使用してraspberry piを別用途で再利用しようとした。 ただ、OSがwheezyと旧かったのでOSも一新しようとした。raspberry pi 4でHDD起動ができたので、HDD起動しようとした(それまでは HDDは/varの配下用にしていた)。 トライしたが失敗した。 いろいろ調べると、2Bのv1.2以上、3A+、3B、3B+、4Bでないと無理な様で、手持ちのものはver1.1であった。

※v1.2のものもあった(涙)2021/3/23

それで、SHDCカードでブートだけ行い、それ以降はHDDを使うようにした(/var から進化)。

参考にしたサイト

このサイト https://jyn.jp/raspberrypi-usb-boot/ が非常に有効だった。 ほとんど、そのままでできた。 

そのままではできなかった部分は、「データをコピー (rsync)」のところで、/ を /mntにコピーする様になっていたので、 /の下にmntがあるため再帰的にmntが作られ止まらなくなってしまった。 また、/sys の配下が多数エラーになってしまった。 

最終的には、それらの部分を除外して実行し、それらの部分はディレクトリ作成だけ行った。

実際のコマンドイメージ(rsync部分だけ)

sudo rsync -aHAX --progress /bin /mnt
sudo rsync -aHAX --progress /dev /mnt
sudo rsync -aHAX --progress /home /mnt
sudo rsync -aHAX --progress /opt /mnt
sudo rsync -aHAX --progress /bin /mnt
sudo rsync -aHAX --progress /root /mnt
sudo rsync -aHAX --progress /bin /mnt
sudo rsync -aHAX --progress /sbin /mnt
sudo rsync -aHAX --progress /usr /mnt
sudo rsync -aHAX --progress /boot /mnt
sudo rsync -aHAX --progress /etc /mnt
sudo rsync -aHAX --progress /lib /mnt
sudo rsync -aHAX --progress /srv /mnt
sudo rsync -aHAX --progress /var /mnt

###  下記は不要かも ##### 
sudo mkdir /mnt/lost+found
sudo mkdir /mnt/media
sudo mkdir /mnt/proc
sudo mkdir /mnt/sys
sudo mkdir /mnt/sys/block
sudo mkdir /mnt/sys/bus
sudo mkdir /mnt/sys/class
sudo mkdir /mnt/sys/dev
sudo mkdir /mnt/sys/devices
sudo mkdir /mnt/sys/firmware
sudo mkdir /mnt/sys/fs
sudo mkdir /mnt/sys/kernel
sudo mkdir /mnt/sys/module
sudo mkdir /mnt/sys/power

WordPressを運用しているとどこにアクセスが多いか気になる。一方、スパムが多い。 それで、アクセスログ解析を行いたいが、関係ないアクセスログも多い。 そこで、アクセスログの削減を行うとともに、アクセスのトップ10をメール通知する様にした。

前提条件

  • apacheをweb serverとして使っている
  • lan内メールサーバーが構築済み
  • (raspberry pi OS : ubuntuやdebianでも同じと思う)

ログ削減

lan内からのアクセスやcssファイル等の読み込みはログに残さないようにする。

/etc/apache2/sites-enabled/000-default.conf 及び /etc/apache2/sites-enabled/default-ssl.conf のCustomlog 部分を以下の様に編集する。

#       CustomLog ${APACHE_LOG_DIR}/access.log combined
        SetEnvIf Remote_Addr 127.0.0.1 nolog
        SetEnvIf Remote_Addr 192.168.0. nolog
        SetEnvIf Remote_Addr 192.168.2. nolog
        SetEnvIf Request_URI "\.(gif|jpg|png|css|js|ico)$" nolog

        CustomLog ${APACHE_LOG_DIR}/access.log combined env=!nolog

もし、JPG等大文字のものがログに現れた場合は、SetEnvIF部分をSetEnvIfNoCaseに換える。

注:スペルミスがありましたので修正しました(no_log => nolog) 2021/03/20

再起動 
sudo systemctl restart apache2

top10作成及びメール文作成用のシェルの準備

以下のシェルスクリプト(mytools/webtop10.sh)を作成

#!/bin/bash

echo from: wp_server@ktanimoto.net
echo to: wp_server@ktanimoto.net
echo subject: raspi web server accecc top10
echo Content-Type: text/plain;charset="UTF-8"
echo
echo ------  access IP top 10 ----------
cat /var/log/apache2/access.log |cut -f 1 -d ' ' | sort |uniq -c|sort -nr|head -10
echo

echo ----- access page top10  -----------
cat /var/log/apache2/access.log |cut -f 7 -d ' ' | sort |uniq -c|sort -nr|head -10
echo

echo  ------- actual access top 10 -----------
cat /var/log/apache2/access.log |grep 200 |cut -f 7 -d ' ' | sort |uniq -c|sort -nr|head -10

echo

cronの設定

rootが所有者になる様にしてcron設定ファイルを作成する(webtop10とここではする)

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/home/pi

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,$
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

 50 7 * * * pi /home/pi/mytools/webtop10.sh | sendmail -i -t

あるraspberry piにpostfixとdovecotで簡易的なメールサーバーを構築した。 それで、別のraspberry piマシンからも定期連絡等のメールを送れるようにする。

手法

メールを送るだけなので軽量な方法で行う。 簡単な調査だと、ssmtpを使うのが簡単そうであり、これをインストールして実現する。

インストールと設定

sudo apt install ssmtp

メールサーバーとポート番号の指定を、sudo nano /etc/ssmtp/ssmtp.conf にて行う

mailhub=192.168.0.232:587

メール送信テスト

以下のテスト用ファイルを作成する。 testmail.txt とする。

from: pi@localhost
to: receiver_name@mydomain
subject: hello-test-from-ssmtp
Content-Type: text/plain;charset="UTF-8"

this is test mail by ssmtp

次のコマンドでテストする。

cat testmail.txt | sendmail -i -t

メーラーで受信を確認。受信できていた。

あとは、シェル作成とcron設定

(2021/03/19 追記)
以下のファイル myhealth.sh を作成する

echo from: pi@localhost
echo to: wp_server@ktanimoto.net
echo subject: dns vpn daily report
echo Content-Type: text/plain;charset="UTF-8"
echo
date
echo
echo ------  memory usage -------
free -h
echo
echo ----- device usage --------
df -h
echo

/etc/cron.d/myhealth をsudo nanoで作成する(rootが所有者になるようにする)

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/home/pi

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,$
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

 15 */12 * * * pi  bash /home/pi/mytools/myhealth.sh | sendmail -i -t

最後の行でbashの後に空白がなかったので追加(2021/3/20)

ufwを設定する際/var/log/ufw.logに大量に現れるログの抑制するのに、毎回手間取るので、設定値をメモとして残しておく

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere         # ssh
3389                       ALLOW       Anywhere         # xrdp
# for ftp
20                         ALLOW       Anywhere         # ftp
21                         ALLOW       Anywhere         # ftp
aaaaa:bbbbb/tcp            ALLOW       Anywhere         # ftp
(aaaaa, bbbbbはvsftpdの設定による)

# against bunch of ufw.log
224.0.0.1                  ALLOW       192.168.2.1      # ufw log
224.0.0.1                  ALLOW       192.168.0.0/24   # ufw log
224.0.0.251                ALLOW       Anywhere         # ufw log
# for no secure web server
80                         allow        Anywhere         # http
# for web server
443/tcp                    ALLOW       Anywhere         # https

#  for smtp/dovecot mail server
110                        ALLOW       Anywhere         # pop3
587                        ALLOW       Anywhere         # smtp
993                        ALLOW       Anywhere         # smtps

#  for dnsmasq
53                         ALLOW       Anywhere         # dns

#  for vpn server
1293                       ALLOW       Anywhere         # ipsec
500/udp                    ALLOW       Anywhere         # ISAKMP
4500/udp                   ALLOW       Anywhere         # IPSec NAT Traversal
1701/udp                   ALLOW       Anywhere         # l2tp

ICMPv6のログが残るのでこれも消す(2021/3/20)

Mar 20 21:22:23 raspberrypi kernel: [466373.695815] [UFW BLOCK] IN=eth0 OUT= MAC=33:33:00:00:00:01:00:19:66:cb:8b:11:86:dd SRC=0000:0000:0000:0000:0000:0000:0000:0000 DST=ff02:0000:0000:0000:0000:0000:0000:0001 LEN=68 TC=0 HOPLIMIT=64 FLOWLBL=0 PROTO=ICMPv6 TYPE=130 CODE=0

上記のようなログがufw.logに多量に出てくる。いろいろ検索したところ
https://ubuntuforums.org/showthread.php?t=2247250 で、解決策があった。
/etc/ufw/before6.rules の下記の下に、

# MLD query
-A ufw6-before-input -p icmpv6 --icmpv6-type 130 -s fe80::/10 -j ACCEPT

下記のコードを追加する。

# MLD query
-A ufw6-before-input -p icmpv6 --icmpv6-type 130 -s fe80::/10 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type 130 -s 0000:0000:0000:0000:0000:0000:0000:0000/64 -j ACCEPT
# above line was inserted by K.tanimoto on 2021/3/20

その後、 sudo systemctl restart ufw で再起動する。
なお、0000が並んでいる部分は、src= の部分を記述する。

V-antena and Tanimoto's page

あなたはIPv4でアクセスしています