カテゴリー: サーバー管理

  • WSLを使ってメーリングリストを作成(外部からの受信)

     現状ではmydomain.com宛の電子メールをmail.mydomain.comという仮想ホストにより受信しドメイン内部に転送している。

     新たにml.mydomain.comという仮想ホストを作成し、@ml.mydomanin.com宛のメールをfetchmailを通してpostfixに渡し、mailmanでメーリングリストの処理をさせる。

    ・DNSの設定

    DNSに以下のレコードを追加する

    @       IN TXT  v=spf1 ip4:xx.xx.xx.xx include:outgoing.com -all
    _dmarc  IN TXT v=DMARC1; p=none; rua=mailto:dmarc_rua@mydomain.com; ruf=mailto:dmarc_ruf@mydomain.com
            IN MX  10 mail.mydomain.com.
    mail    IN A   mydomain.com
    ml      IN A   mydomain.com

     外部へのメールを外部のメールサーバー経由で送っているなら、SPFレコードにそのサーバーを追加しておく。

     メーリングリストはml.mydomain.comのアドレスを使用しているため、サブドメインにもSPFレコードを追加しておく。MAIL FROM:で指定したエンベロープFromのホストのSPFレコードをチェックされるため。

     Amazon SES経由で送る場合は、SPFレコードは必要ないらしい。DMARCのレポートで、policy_evaluatedセクションが<spf>=failとなっていたため気になって調べたが、問題ないらしい。

    https://qiita.com/Moo_Moo_Farm/items/656826526b340694a9d8

    外部向けapache(xampp)の設定変更

     後述のサーバー証明書を更新するために仮想ホストml.mydomain.com を追加する。
     ただし、/.well-knownだけは、win-acmeがチェック時にこのサーバー内を書き換えるため、除外する。

    C:\xampp\apache\conf\extra\httpd-vhost.conf
    ServerAlias ${DOMAIN} ftp.${DOMAIN} mail.${DOMAIN}
     ↓
    ServerAlias ${DOMAIN} ftp.${DOMAIN} mail.${DOMAIN} ml.${DOMAIN}
    
        RewriteCond %{REQUEST_URI} !^/\.well-known
     ↓
        RewriteCond %{REQUEST_URI} !^/\.well-known
        RewriteCond %{HTTPS} off

    ml.mydomain.comは別のapacheで動いているので、リバースプロキシーで飛ばす。

    C:\xampp\apache\conf\extra\httpd-ssd.conf
    <VirtualHost *:443>
        ServerAdmin postmaster@${DOMAIN}
    	ServerName ml.${DOMAIN}
        ErrorLog  "| bin/rotatelogs.exe logs/ml.${DOMAIN}-SSL-error_%Y-%m.log  86400 540"
        CustomLog "| bin/rotatelogs.exe logs/ml.${DOMAIN}-SSL-access_%Y-%m.log 86400 540" combined
        SSLEngine on
        SSLCertificateFile "conf/certs/${DOMAIN}-chain.pem"
        SSLCertificateKeyFile "conf/certs/${DOMAIN}-key.pem"
    	ProxyRequests Off
    	ProxyPass / http://ml.${DOMAIN}:9080/
    	ProxyPassReverse / http://ml.${DOMAIN}:9080/
    </VirtualHost>
    

    サーバー証明書の更新

    既存のサーバー証明書ににml.mydomain.comを追加する

      > win-acme.exe
         A: Manage renewals (1 total)
      Please choose from the menu: a
        D: Show details for the renewal
      Choose an action or type numbers to select renewals: d
        E: Edit renewal
      Choose an action or type numbers to select renewals: e
        2: Source
      Which step do you want to edit?: 2
        2: Manual input
      How shall we determine the domain(s) to include in the certificate?: 2
      Host: mydomanin.com,ftp.mydomanin.com,mail.mydomanin.com,ml.mydomanin.com,www.mydomanin.com
      Friendly name '[Manual] mydomanin.com'. <Enter> to accept or type desired name: mydomanin.com

     追加されたホストのみが確認され新しい証明書が作成される。有効期限は変わらない。

    ・MercuryMailの設定

    全メーリングリストで使用するメールアカウントを作成する
    ユーザー名:mailman
    このメールアカウントを、Configurationー”Mercury Core Module Configuration”ー”Local Domains” にドメインメールボックスとして追加する

    Core ModuleーFiles
    Internet name for this system: mail.mydomain.com
      ↓
    Internet name for this system: mydomain.com
    Core ModuleーLocal Domains
    追加
      ↓
    localhost mail.mydomain.com
    DM=mailman ml.mydomain.com

    ・postfixの設定

     SMTP サーバによる知らないローカル受信者拒否を無効にする(要は知らない名前でも受け付ける)

      $ sudo vi /etc/postfix/main.cf
    #local_recipient_maps =
      ↓
    local_recipient_maps =

    ・mailmanの設定

    なし

    ・farchmailの設定

    なし

  • WSLを使ってメーリングリストを作成(fetchmail編)

     前回までのpostfix+mailmanでUbuntu内、ローカルWindows、および同じネットワーク内の別PCからメーリングリストへの送受信が可能になった。

     ただし、インターネットからのメールは受け付けることはできない。メーリングリスト用のサーバーが外部に露出して無く、MercuryMailも特定のMTAに転送する設定がないせいらしい。

     そこで5日ほど悩んで、何とか実現できそうな方法にたどり着いた。

     外部とはWindowsにxamppを入れて、MercuryMailで通信している。そのMercuryMailにはドメインメールボックスという機能があり、特定のホスト宛てのメールを全て単一のメールボックスに入れることができる。

     そして、fetchmailにはマルチドロップモードという機能があり、1か所に届いたメールを本来の宛先などを読み取って配送する機能がある。

     この二つの機能を組み合わせることで、外部から届いたメールを適切なmailmanの仮想アドレスに届けることができる。

    ・インストール

      $ sudo apt install fetchmail

    ・設定
     rootユーザーでの動作は推奨されていないが、システム上のアプリなのでrootで実行させる。

      $ sudo vi /root/.fetchmailrc
    # ログファイルの指定
    set logfile "/var/log/fetchmail.log"
    # エラーの送信先
    set postmaster postmaster@mydomain.com
    set no bouncemail
    # メールのチェック間隔(秒)
    set daemon 300
    
    # デフォルト設定
    defaults
    # 既読のチェックを行う
      uidl
      # 未読メールの取り込み(ex.全て取り込む場合[fetchall])
      no fetchall
      # サーバ上にメールを残す(ex.削除する場合[no keep])
      keep
      # mimed ecode(8ビットデータに変換しない)
      no mimedecode
      # RFC-822 のアドレスヘッダ (To, From, Cc, Bcc, Reply-To) を書き換えない
      no rewrite
    
    # 外部メールサーバの設定(取り込み元) localdomainsではenvelopeが必要
    poll mail.mydomain.com with proto imap envelope "X-Envelope-To"
      localdomains ml.mydomain.com
      # アカウント名、パスワード、宛先ユーザー
      user "mailman" with pass "mailパスワード" to * here

    設定ファイルを所有者のみRead/Writeにする

      $ sudo chmod 600 /root/.fetchmailrc

    ログファイルはあらかじめ作成しておかないとエラーになるので作成しておく。

      $ sudo touch /var/log/fetchmail.log
      $ sudo chown root:root /var/log/fetchmail.log
      $ sudo chmod 600 /var/log/fetchmail.log

    ・fetchmailの起動
    起動と停止はfetchmail設定ファイルを作成したユーザー(つまりsudo )で起動する

    $ sudo /usr/bin/fetchmail --nosslcertck -f /root/.fetchmailrc

    起動時にはsslを使用しないオプション(–nosslcertck)を指定しないとSTARTTLSで以下のエラーとなる
    fetchmail: POP3< -ERR SSL/TLS services unavailable.
    このオプションはコマンドラインでしか指定できないようなので、起動時は毎回指定する。

    ・fetchmailの停止

      $ sudo fetchmail --quit
    or sudo fetchmail -q

    ・fetchmailの強制フェッチ
    set daemonの設定にかかわらず即座にメールボックスのチェックを行う。

      $ sudo fetchmail

    ・テスト実行

      $ sudo fetchmail --nosslcertck -f /root/.fetchmailrc -v -c

    ・ログの確認

      $ sudo less +F /var/log/fetchmail.log

    ・logrotateの設定

      $ sudo vi /etc/logrotate.d/fetchmail
    /var/log/fetchmail.log {
        su root root
        weekly
        rotate 10
        notifempty
        create 600 root root
        prerotate
            /usr/bin/fetchmail --quit > /dev/null 2>&1
        endscript
        postrotate
            /usr/bin/fetchmail --nosslcertck -f /root/.fetchmailrc > /dev/null 2>&1
        endscript
    
    }

    apache2のlogrotate設定
     postrotate部分でinvoke-rc.dを使うようになっていたが、WSLでは動作しないらしいため置き換える。

      $ sudo vi /etc/logrotate.d/apache2
    -----
    	postrotate
                    if  ps -ef | grep -vw "^`whoami`" | grep -w apache2 > /dev/null 2>&1; then \
                        apache2ctl graceful > /dev/null 2>&1; \
                    fi;
    	endscript
    -----

    cronのログを有効にする

      $ sudo vi /etc/rsyslog.d/50-default.conf
    #cron. /var/log/cron.log
    ↓
    cron.* /var/log/cron.log

    rsyslogを再起動する

      $ sudo /etc/init.d/rsyslog restart

    logrotateは以下のファイル内の日付を見て処理しているので、無理矢理実行させるなら日付を書き換える

    /var/lib/logrotate/status

    おまけ

     新しいメッセージがない時のfatchmailのログにはタイムスタンプがないので、ログを見ただけでは動いているかどうかわかりにくい。

     定期的にタイムスタンプを挿入するスクリプトを動かす。

      $ sudo vi /root/fetchmail_time.sh
    -----
    #!/bin/bash
    sleep 60
    while true
    do
      if [ -w /var/log/fetchmail.log ]; then
        echo '          ' `date '+%Y/%m/%d %H:%M:%S'`>> /var/log/fetchmail.log
      fi
      sleep 3600
    done
    -----
      $ sudo chown root.root /root/fetchmail_time.sh
    
      $ sudo chmod 700 /root/fetchmail_time.sh
    
      $ sudo vi /etc/sudoers.d/auto-start
    %sudo ALL=NOPASSWD: /root/fetchmail_time.sh
    
      $ vi ~/.bash_aliases
        ps -ef | grep -vw "^`whoami`" | grep -w fetchmail_time  || sudo /root/fetchmail_time.sh &
  • WSLを使ってメーリングリストを作成(mailman編)

    ・インストール

      $ sudo apt install mailman
    ja(Japanese) をスペースで選択、OKを押す

    ・ファイル属性をチェックする

      $ sudo /usr/lib/mailman/bin/check_perms
    問題が報告されなくなるまで -f オプションをつけて繰り返し実行する
      $ sudo /usr/lib/mailman/bin/check_perms -f
    シンボリックリンクの先ではなくて、シンボリックリンクのの所有者、グループをチェックしているらしい。chown -h root:list などでシンボリックリンク自体を修正するとエラーは出なくなる。
      $ sudo chmod g+s /var/lib/mailman/logs
      $ sudo chown -h root:list /var/lib/mailman/bin
      $ sudo chown -h root:list /var/lib/mailman/cgi-bin
      $ sudo chown -h root:list /var/lib/mailman/cron
      $ sudo chown -h root:list /var/lib/mailman/icons
      $ sudo chown -h root:list /var/lib/mailman/locks
      $ sudo chown -h root:list /var/lib/mailman/logs
      $ sudo chown -h root:list /var/lib/mailman/mail
      $ sudo chown -h root:list /var/lib/mailman/Mailman
      $ sudo chown -h root:list /var/lib/mailman/scripts
      $ sudo chown -h root:list /var/lib/mailman/templates

    ・管理用メーリングリスト「mailman」を作る
    これがないと、Webインターフェースが利用できない

      $ sudo /usr/lib/mailman/bin/newlist --language=ja mailman
    Enter the email of the person running the list: postmaster@mydomain.com
    Initial mailman password:xxxxx
    To finish creating your mailing list, you must edit your /etc/aliases (or
    equivalent) file by adding the following lines, and possibly running the
    `newaliases' program:
    aliasデータベースを更新する
      $ sudo newaliases

    ・設定

    /usr/lib/mailman/Mailman/Defaults.py を参考に、mm_cfg.pyを修正する

      $ sudo vi /etc/mailman/mm_cfg.py
    
    DEFAULT_URL_PATTERN = 'https://%s/mailman/'
    DEFAULT_EMAIL_HOST = 'ml.mydomain.com'
    DEFAULT_URL_HOST   = 'ml.mydomain.com'
    
    
    #####
    # Archive defaults
    #####
    # Are archives on or off by default?
    DEFAULT_ARCHIVE = Off
    
    # Are archives public or private by default?
    # 0=public, 1=private
    DEFAULT_ARCHIVE_PRIVATE = 1
    
    #####
    # Delivery defaults
    #####
    MTA='Postfix'
    POSTFIX_STYLE_VIRTUAL_DOMAINS = [DEFAULT_EMAIL_HOST ]
    add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
    
    #####
    # General defaults
    #####
    DEFAULT_SERVER_LANGUAGE = 'ja'
    OWNERS_CAN_DELETE_THEIR_OWN_LISTS = Yes
    DEFAULT_NEW_MEMBER_OPTIONS = 256  # Default see Bitfield for user options
    
    #####
    # List defaults.  NOTE: Changing these values does NOT change the
    # configuration of an existing list.  It only defines the default for new
    # lists you subsequently create.
    #####
    DEFAULT_LIST_ADVERTISED = No
    DEFAULT_SUBJECT_PREFIX = '[%(real_name)s:%%05d] '
    # What should happen to non-member posts which are do not match explicit
    # non-member actions?
    # 0 = Accept
    # 1 = Hold
    # 2 = Reject
    # 3 = Discard
    DEFAULT_GENERIC_NONMEMBER_ACTION = 2
    DEFAULT_SEND_REMINDERS = 0
    DEFAULT_SEND_WELCOME_MSG = No
    DEFAULT_SEND_GOODBYE_MSG = No
    
    # Mailman can be configured to "munge" Reply-To: headers for any passing
    # messages.  One the one hand, there are a lot of good reasons not to munge
    # Reply-To: but on the other, people really seem to want this feature.  See
    # the help for reply_goes_to_list in the web UI for links discussing the
    # issue.
    # 0 - Reply-To: not munged
    # 1 - Reply-To: set back to the list
    # 2 - Reply-To: set to an explicit value (reply_to_address)
    DEFAULT_REPLY_GOES_TO_LIST = 1
    
    # SUBSCRIBE POLICY
    # 0 - open list (only when ALLOW_OPEN_SUBSCRIBE is set to 1) **
    # 1 - confirmation required for subscribes
    # 2 - admin approval required for subscribes
    # 3 - both confirmation and admin approval required
    #
    # ** please do not choose option 0 if you are not allowing open
    # subscribes (next variable)
    DEFAULT_SUBSCRIBE_POLICY = 2
    
    #####
    # Digestification defaults.  Same caveat applies here as with list defaults.
    #####
    DEFAULT_DIGESTABLE = No

    ・ Postfixに読み込ませるaliasesファイルを生成する
    /var/lib/mailman/data に作成される。

      $ sudo /usr/lib/mailman/bin/genaliases

    ・サイトパスワードの設定
    サイトパスワードはメーリングリスト作成時などにリスト作成者の認証パスワード項目として入力する

      $ sudo /usr/lib/mailman/bin/mmsitepass

    ・実行するのに必要なリンクを張る

      $ sudo ln -s /usr/lib/mailman/bin/mailmanctl /usr/sbin/

    ・mailmanを実行する

      $ sudo mailmanctl start
    以下のエラーが出たらディレクトリを作成する
    IOError: [Errno 2] No such file or directory: '/var/lib/mailman/locks/master-qrunner.domain.com.1909.1'
      $ sudo mkdir /var/lock/mailman
      $ sudo chown www-data:list /var/lock/mailman
      $ sudo chmod g+w /var/lock/mailman
      $ sudo ls -laH /var/lib/mailman/locks
    drwxrwxr-x 1 www-data list 512 Feb 8 10:33 .
      $ sudo mailmanctl start
    まだ出るときは同じくディレクトリを作成する
    IOError: [Errno 2] No such file or directory: '/var/run/mailman/mailman.pid'
    IOError: [Errno 13] Permission denied: '/var/run/mailman/mailman.pid'
      $ sudo mkdir /var/run/mailman
      $ sudo chown list /var/run/mailman
      $ sudo chmod g+w /var/run/mailman
      $ sudo ls -laH /var/run/mailman
    drwxrwxr-x 1 list root 512 Feb 8 10:33 .
    これはWSLの起動ごとに必要らしい

    ・postfixの設定

    postfixは/etc/aliasや/etc/mailman/virtual-mailmanにある名前にメールが届いた場合、aliasなどに書かれたmailmanのスクリプトを実行する

      $ sudo vi /etc/postfix/main.cf
    # Postfix は -owner と -request 宛のアドレスのメールは拒否するので許可する。
    recipient_delimiter = +
    owner_request_special = no
    # mailmanのaliasを追加
    alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases
    alias_database = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases
    virtual_alias_maps = hash:/var/lib/mailman/data/virtual-mailman

    postfixを再起動する

    $ sudo service postfix restart

    ・apacheの設定

    apache2では*-aveilableに実際のファイルをコピーし、以下のコマンドで*-enabledにシンボリックリンクを作成/削除して、有効/無効にするようだ。

    シンボリックリンクを作成する場所無効にするコマンド有効にするコマンド
    mods-enableda2dismod a2enmodモジュールの設定ファイル
    sites-enableda2dissitea2ensite仮想ホストの設定ファイル
    sites-enableda2disconfa2enconf その他設定ファイル

    confファイルの修正

      $ sudo vi /etc/apache2/sites-available.000-default.conf
    ServerName ml.mydomain.com
    ServerAdmin postmaster@mydomain.com

    cgiモジュールを有効にする

      $ sudo a2enmod cgi

    mailmanのapache.confを追加して有効化する

      $ sudo ln -s /etc/mailman/apache.conf /etc/apache2/conf-available/mailman.conf
      $ sudo a2enconf mailman

    設定ファイルの確認

      $ sudo apache2ctl configtest
      $ sudo apache2ctl stop
      $ sudo apache2ctl configtest # confファイル検査
      $ sudo apache2ctl -S # VirtualHost確認 -t -D DUMP_VHOSTS -D DUMP_RUN_CFG と同じ
      $ sudo apache2ctl -t -D DUMP_INCLUDES
      $ sudo apache2ctl -t -D DUMP_MODULES

    ・apacheを起動する
     $ sudo apache2ctl start

    Windows Defenderファイアウォールの警告が出たら許可する

      以下のエラーが出た時
        Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT
        https://note.kiriukun.com/entry/20200404-failed-to-enable-APR_TCP_DEFER_ACCEPT-on-wsl-ubuntu-apache2
       以下をapache.confの末尾に追加する
          AcceptFilter http none
          AcceptFilter https none

    ・メーリングボックスの管理

    ・Web UIでの編集

    http://localhost/mailman/admin/
    http://localhost/mailman/admin/mailman

    作成されたメーリングリストのメンバーは0人なので、自分を追加する

    ・Web UIで表示するHTTPアドレスの変更

    以下のコマンドで確認する
      $ sudo /usr/lib/mailman/bin/dumpdb /var/lib/mailman/lists/mailman/config.pck | grep web_page
    変更用のファイルを作る
      $ sudo vi /etc/mailman/change_url.py
    def change_url(mlist):
    mlist.Lock()
    mlist.web_page_url = 'http://ml.mydomain.com/mailman/'
    mlist.Save()
    所定の場所にシンボリックリンクを作り、winlistを実行する
      $ sudo ln -s /etc/mailman/change_url.py /usr/lib/mailman/bin/change_url.py
      $ sudo /usr/lib/mailman/bin/withlist -r change_url mailman    # メーリングリストmailmanのみの場合
      $ sudo /usr/lib/mailman/bin/withlist -r change_url -a         # すべて書き換える場合
    
    以下のコマンドで変更されていることを確認する
      $ sudo /usr/lib/mailman/bin/dumpdb /var/lib/mailman/lists/mailman/config.pck | grep web_page

    ・起動・終了コマンド一覧

    sudo mailmanctl start
    sudo mailmanctl -s start
    sudo apache2ctl start
    sudo /etc/init.d/rsyslog --privileged start
    sudo service postfix start
    
    sudo mailmanctl stop
    sudo apache2ctl stop
    sudo service postfix stop
    
    sudo mailmanctl restart
    sudo mailmanctl -s restart
    sudo apache2ctl restart
    sudo /etc/init.d/rsyslog restart
    sudo service postfix restart

    ログの確認

    postfix
    sudo less +F /var/log/mail.log
    sudo less /var/log/mail.err
    mailman
    sudo less /var/log/mailman/error
    sudo less +F /var/log/mailman/post
    sudo less /var/log/mailman/qrunner
    sudo less /var/log/mailman/smtp
    sudo less /var/log/smtp-failure
    sudo less /var/log/subscribe
    sudo less /var/log/ette

    fetchmail
    sudo less +F /var/log/fetchmail.log

    apache2
    sudo ls -lF /var/log/apache2/
    sudo less +F /var/log/apache2/access.log
    sudo less /var/log/apache2/error.log

    メール
    sudo less -f /var/spool/mail/root
    sudo less -f /var/spool/mail/user

    ・メーリングリストの設定
    送信元メールアドレスはそのまま表示するが、返信はメーリングリストに届くようにする。

    from_is_list いいえ
    anonumouse_list いいえ
    first_strip_reply_to いいえ
    reply_goes_to_address このリスト