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

  • IPoEからPPPoEへ戻す

     先日、突然グローバルIPアドレスが変更された。

     グローバルIPアドレスが変わると、ダイナミックDNSの設定を変えているが、それ以降外部から接続ができなくなっていた。

     ルーターのログを調べてみると、IPv4でのPPPoEセッションを一旦は開始するが、すぐに解放されてしまっている。

     インターネットプロバイダーの方で、PPPoE接続方式からIPoE接続方式に設定が変更されたらしい。

     LANから外部に接続するのは、何ら問題ない。AWS上のインスタンスにも今のIPアドレスでファイアーウォール越しに接続できる。

     ただし、外部から接続しようと思っても、同じIPv4アドレスを使いまわしているためかpingもnslookupも失敗する。IPv6どおしであれば接続できるらしいが、いろいろ設定するハードルが高いらしい。

     インターネットプロバイダーのサポートページを調べると「設定・トラブル」のよくある質問に、IPv6からIPv4に戻す方法が載っていた。

     電話で依頼すると数分でルーターがIPアドレスを取り直してPPPoE接続に戻った。

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

     Ubuntuの新しいバージョン22.04にアップグレードしたら、いくつか設定を変更しないといけなくなった。

    Ubuntuをアップグレードするかプロンプトが出た。

    実行するとOSのバージョンを上げる作業が数時間行われた。

    いくつかトラブルがあったが、何とかアップグレードに成功。

    ただし、現時点(2022年9月)ではmailmanのモジュールが削除されているため、新規インストールしてはいけない。

    postfix

    ・インストール

    $ sudo apt install postfix
      Internet with smarthostを選択
      mydomain.com

    ・設定

    変更部分のみ

      $ sudo vi /etc/postfix/main.cf
    compatibility_level = 3.6
    myhostname = ml.mydomain.com
    mydomain = mydomain.com
    myorigin = $myhostname
    inet_interfaces = all
    mydestination = $myhostname, localhost.$mydomain, localhost
    local_recipient_maps =
    smtpd_banner = $myhostname ESMTP unknown
    sendmail_path = /usr/sbin/sendmail
    newaliases_path = /usr/bin/newaliases
    mailq_path = /usr/bin/mailq
    setgid_group = postdrop
    html_directory = no
    manpage_directory = /usr/share/man
    sample_directory = /etc/postfix
    readme_directory = /usr/share/doc/postfix
    # ここから設定ファイルの下部に追加する
    smtpd_recipient_restrictions=permit_mynetworks, reject
    
    # 転送先の上位メールサーバ
    #relayhost = [smtp.gmail.com]:587
    relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587
    # SMTP-AUTH を有効
    smtp_sasl_auth_enable = yes
    # 転送先のサーバのアドレスと認証するユーザ名とパスワードを記述したファイル
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    # 匿名ログインを許可しない
    smtp_sasl_security_options = noanonymous
    # 転送先のサーバの SASL メカニズムに対するフィルタ
    smtp_sasl_mechanism_filter = cram-md5, plain, login
    # 可能ならば TLS 暗号化
    smtp_tls_security_level = may
    # CA証明書(ca-certificates)
    smtp_tls_CApath = /etc/ssl/certs/ca-certificates.crt
    
    # ログ設定(デフォルト値)
    # /var/log/mail.logに出力される
    syslog_facility = mail
    
    # mailman用設定
    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

    ・SMTP-AUTH
    転送先のサーバのアドレスと認証するユーザ名とパスワードを行ごとに記述する。
    複数行に羅列でき、main.cfで指定されたものが使われるらしい

      $ sudo vi /etc/postfix/sasl_passwd
    [smtp.gmail.com]:587 xxxx@gmail.com:yyyy
    [email-smtp.xxxx.amazonaws.com]:587 xxxx:yyyy

    ファイルのパーミッションを変更する

      $ sudo chmod 600 /etc/postfix/sasl_passwd

    Postfix が参照するデータベースファイルに反映させる

      $ sudo postmap hash:/etc/postfix/sasl_passwd

    ・設定ファイルのエラー確認

      $ sudo postfix -v check
    postfix/postfix-script: warning: symlink leaves directory: /etc/postfix/./makedefs.out
    上のワーニングが出るが無視してよいらしい。いやならシンボリックリンクからハードリンクに変える
      $ sudo rm /etc/postfix/makedefs.out; sudo ln /usr/share/postfix/makedefs.out /etc/postfix/makedefs.out

    ・Postfix を再起動する

      $ sudo service postfix restart
    Windows Defenderファイアウォールからの警告が出たら許可する

    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'
    VIRTUAL_EMAIL_HOST1 = 'ml.mydomein2.net'
    DEFAULT_URL_HOST   = 'ml.mydomain.com'
    VIRTUAL_URL_HOST1 = 'ml.mydomain2.net'
    
    #####
    # 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, VIRTUAL_EMAIL_HOST1]
    add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
    add_virtualhost(VIRTUAL_URL_HOST1, VIRTUAL_EMAIL_HOST1)
    SMTPHOST = DEFAULT_EMAIL_HOST
    SMTPPORT = 25                                      # 0:default from smtplib
    
    #####
    # 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の起動ごとに必要らしい

    ・林檎の絵がついた携帯電話から投稿すると文字化けして配送されることへの対応

    届いたメールのヘッダーにによるとutf-8エンコードされた後にbase64エンコードされている。

    Content-Type: text/plain; charset=utf-8
    Content-Transfer-Encoding: base64

    mailmanがbase64デコードをせずに、base64エンコードされた文字列をそのままutf-8として解釈して転送しているので文字化けしているのかもしれない。

    以下のサイトにあるbase64デコードフィルターを追加することにした。

    https://yamagata.int21h.jp/tool/gmail-filter/

    上記サイトの内容でスクリプトファイルを作成する。先頭行は環境に合わせて書き換える。

    $ sudo vi /usr/local/bin/base64-filter.pl
      #!/usr/bin/perl
        ...
    $ sudo chomd +x /usr/local/bin/base64-filter.pl
    

    postfix用のaliasesファイルですべてのメーリングリスト名の行を書き換える。

    $ sudo vi /var/lib/mailman/data/aliases
      mailman:             "|/var/lib/mailman/mail/mailman post mailman"
        ↓
      mailman:             "|/usr/local/bin/base64-filter.pl |/var/lib/mailman/mail/mailman post mailman"
    $ sudo newaliases

    aliasデータベースを更新するのを忘れずに。

    $ sudo newaliases

    注意点として、メーリングリストの追加・削除や手動で/usr/lib/mailman/bin/genaliasesを実行したときには、このファイルが更新され、フィルターの記述が消えるので、都度編集する必要がある。

    apache

    ・設定

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

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

    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

    fetchmail

    ・インストール

      $ 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
      # メール配送先ホスト
      smtphost ml.mydomain.com/25
    
    # 外部メールサーバの設定(取り込み元) localdomainsではenvelopeが必要
    poll mail.mydomain.com with proto imap envelope "X-Envelope-To"
      localdomains ml.mydomain.com ml.mydomain2.net 
      user "mydomain" 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

    ・注意

     メーリングリストの全体的オプションで、メールの送信に使うホスト名(ドメイン名)を変更した場合に、/var/lib/mailman/data/virtual-mailmanが更新されなかったので、以下のコマンドで強制的に更新する必要があった。

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

    ・おまけ

     新しいメッセージがない時の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 &

    rsyslog

    ・logrotateの設定

    rsysrog-rotateファイルを書き換える。

    $ sudo vi /usr/lib/rsyslog/rsysrog-rotate
    if [ -d /run/systemd/system ]; then
        systemctl kill -s HUP rsyslog.service
    fi
       ↓
    if [ -d /run/systemd/system ]; then
        systemctl kill -s HUP rsyslog.service
    else
        kill -HUP $(cat /var/run/rsyslogd.pid)
    fi

    cronやpostfixは再起動されないので、独自のファイルを作成する

      $ sudo vi /etc/logrotate.d/rsyslog
    #/var/log/mail.info
    #/var/log/mail.warn
    #/var/log/mail.err
    #/var/log/mail.log
    #/var/log/cron.log
      $ sudo vi /etc/logrotate.d/cron
    /var/log/cron.log
    {
    	su root adm
    	rotate 8
    	weekly
    	missingok
    	notifempty
    	compress
    	delaycompress
    	sharedscripts
    	postrotate
    		/etc/init.d/cron restart
    	endscript
    }
      $ sudo vi /etc/logrotate.d/posfix
    /var/log/mail.info
    /var/log/mail.warn
    /var/log/mail.err
    /var/log/mail.log
    {
    	su root adm
    	rotate 8
    	weekly
    	missingok
    	notifempty
    	compress
    	delaycompress
    	sharedscripts
    	postrotate
    		/etc/init.d/postfix restart
    	endscript
    }

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

      $ sudo vi /etc/logrotate.d/apache2
    -----
        postrotate
    	if pgrep -f ^/usr/sbin/apache2 > /dev/null; then
    	    apache2ctl graceful  2>&1 | logger -t apache2.logrotate
    	fi
        endscript
    -----
      $ 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
    }

    cronのログを有効にする

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

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

    /var/lib/logrotate/status

    ポート番号の変更

    すでにホストマシンでtelnetdやxampp内のapacheが起動しているときはWSLのポート番号を変えることで共存させる。
    なお、10080は最近のWebブラウザーではアクセスできないようにされているようで(ERR_UNSAFE_PORTというエラーが表示される)、他のポートを選ぶ。

    telnetd
      $ sudo vi /etc/services
    telnet		23/tcp
      ↓
    telnet		9023/tcp
    apache2
      $ sudo vi /etc/apache2/sites-available/000-default.conf
    <VirtualHost *:80>
      ↓
    <VirtualHost *:9080>
    
      $ sudo vi /etc/apache2/ports.conf
    Listen 80
      ↓
    Listen 9080
      postfix
        $ sudo vi /etc/postfix/master.conf
    smtp      inet  n       -       y       -       -       smtpd
      ↓
    #smtp      inet  n       -       y       -       -       smtpd
    9025      inet  n       -       y       -       -       smtpd
    mailman
      $ sudo vi /etc/mailman/mm_cfg.py
    DEFAULT_URL_PATTERN = 'http://%s/mailman/'
     ↓
    DEFAULT_URL_PATTERN = 'http://%s:9080/mailman/'
    
    add_virtualhost(VIRTUAL_URL_HOST2, VIRTUAL_EMAIL_HOST2)
     ↓
    add_virtualhost(VIRTUAL_URL_HOST2, VIRTUAL_EMAIL_HOST2)
    SMTPHOST = 'ml.mydomain.com'
    SMTPPORT = 9025
      fetchmail
        $ sudo vi /root/.fetchmailrc
    smtphost ml.mydomain.com/9025

    利用しているポート番号の確認

      $ sudo ss -natup

    自動起動

     いくつかのプロセスは、Ubuntuが起動されるごとに実行しないといけない

     WSLが起動すると、必ずデフォルトユーザーがログインするので、デフォルトユーザーの.bash_aliasesで実行させることにした

      $ vi ~/.bash_aliases
    alias su='sudo '
    alias sudo='sudo '
    alias sudol='sudo --user=list '
    alias suvi='sudo vi '
    alias visu='sudo vi '
    alias lt='ls -lFt '
    alias lh='ls -lFH '
    alias pd='pushd '
    alias pp='popd '
    alias lessf='less +F '
    
    alias genaliases='/etc/lib/mailman/bin/genaliases '
    
    cd ~
    tty
    if [ "$REMOTEHOST" == "" ] && [ "`tty`" == "/dev/tty1" ]; then
        # start daemon
        test -f /var/run/rsyslogd.pid            || sudo /usr/sbin/rsyslogd
        sudo /etc/init.d/cron status             || sudo /etc/init.d/cron start
        test -f /var/run/inetd.pid               || sudo /etc/init.d/inetutils-inetd start
        sudo /etc/init.d/postfix status          || sudo /etc/init.d/postfix start
        sudo /etc/init.d/apache2 status          || sudo /sbin/apache2ctl start
        sudo /bin/mkdir -p /var/lock/mailman
        sudo /bin/chown www-data:list /var/lock/mailman
        sudo /bin/chmod g+w /var/lock/mailman
        sudo /bin/mkdir -p /var/run/mailman
        sudo /bin/chown list /var/run/mailman
        sudo /bin/chmod g+w /var/run/mailman
        test -f /var/run/mailman/mailman.pid     || sudo /sbin/mailmanctl start
        test -f /var/run/fetchmail.pid           || sudo /usr/bin/fetchmail --nosslcertck -f /root/.fetchmailrc
    
        ps ax
        sudo /bin/apt update
    
        # restore TERM setting
    #    stty sane
        echo run  -  sudo /root/fetchmail_time.sh 
    else
        LOGS=(/var/log/fetchmail.log /var/log/mail.log /var/log/mailman/post /var/log/apache2/access.log)
    
        for L in ${LOGS[@]} ; do
            if [[ ! `ps -ef | grep -vw "$USER"` =~ $L ]]; then
                echo sudo tail -F $L
                     sudo tail -F $L
                break
            fi
        done
    fi

    if文の後半はtelnetで接続された順番にログファイルを自動的に表示させている。

    ただし、sudoで実行させているため、パスワードを入力しなくても実行できるようにしておく

        $ sudo vi /etc/sudoers.d/auto-start
    %sudo ALL=NOPASSWD: /usr/sbin/rsyslogd
    %sudo ALL=NOPASSWD: /etc/init.d/apache2
    %sudo ALL=NOPASSWD: /etc/init.d/cron
    %sudo ALL=NOPASSWD: /etc/init.d/inetutils-inetd
    %sudo ALL=NOPASSWD: /etc/init.d/postfix
    %sudo ALL=NOPASSWD: /sbin/apache2ctl
    %sudo ALL=NOPASSWD: /sbin/mailmanctl
    %sudo ALL=NOPASSWD: /sbin/service
    %sudo ALL=NOPASSWD: /bin/apt
    %sudo ALL=NOPASSWD: /bin/chmod
    %sudo ALL=NOPASSWD: /bin/chown
    %sudo ALL=NOPASSWD: /bin/ln
    %sudo ALL=NOPASSWD: /bin/ls
    %sudo ALL=NOPASSWD: /bin/mkdir
    %sudo ALL=NOPASSWD: /usr/bin/fetchmail
    %sudo ALL=NOPASSWD: /usr/bin/vi
    %sudo ALL=NOPASSWD: /usr/bin/vim
    %sudo ALL=NOPASSWD: /usr/bin/view
    %sudo ALL=NOPASSWD: /usr/bin/less
    %sudo ALL=NOPASSWD: /usr/bin/tail
    %sudo ALL=NOPASSWD: /root/fetchmail_time.sh
    %sudo ALL=NOPASSWD: /usr/lib/mailman/bin/dumpdb
    
      $ sudo chmod 0440 /etc/sudoers.d/auto-start

    ポートマップ

    WSL2のプライベートアドレスは起動するごとに変わる。そのため、外部からWebブラウザーや、telnetで接続できるようにするには、WSL2のポートをホストマシンのポートに接続するスクリプトを実行する。

    WSL内で実行してもよいが、ファイアウォールの設定もあるのでWindows側から行う。

    WSLのバージョンが1の場合は、ファイアウォールやポートフォワードを削除する。

    wsl_port.ps1
    -----
    if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }
    
    # All the ports you want to forward separated by comma
    $ports=@(9023, 9025, 9080);
    $ports_a = $ports -join ",";
    
    # Remove Firewall Exception Rules
    try {
    # 初回やWSLのバージョンを1から2にした場合はエラーが出るが、無視してよい
      iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -ErrorAction Ignore";
    } catch {
    }
    
    $ip = bash.exe -c "ip r |tail -n1|cut -d ' ' -f9"
    # ipアドレスが取得できないときはWSL2ではないとみなしポートフォワードを削除する
    if ([string]::IsNullOrEmpty($ip)) {
      foreach ($port in $ports) {
        iex "netsh.exe interface portproxy delete v4tov4 listenport=$port listenaddress=*" > $null;
      }
    
    } else {
      # Adding Exception Rules for inbound and outbound Rules
      iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
      iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
    
      foreach ($port in $ports) {
        iex "netsh.exe interface portproxy add v4tov4 listenport=$port listenaddress=* connectport=$port connectaddress=$ip";
      }
    }
    
    # Show proxies
    iex "netsh.exe interface portproxy show v4tov4";
    
    -----

    Windows起動時にWSLを起動する

    WSL-start.batのショートカットを”C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp”や、 “shell:startup”に置いておくと、Windowsが起動するタイミングでUbuntuを起動し、上のポートマップスクリプトも実行させる。

    WSL-start.bat  
    -----
    start %LOCALAPPDATA%\Microsoft\WindowsApps\ubuntu.exe
    timeout -t 20
    powershell -file wsl_port.ps1
    timeout /t 60 > nul
    -----

    参考:Windows WSL2に外部から直接アクセスするための設定

    https://rcmdnk.com/blog/2021/03/01/computer-windows-network/

    mailmanデータベースをバックアップする

      for /f "usebackq delims=" %%f in (`wsl.exe -- ls /var/lib/mailman/lists/`) do (
        wsl.exe -- sudo /usr/lib/mailman/bin/dumpdb /var/lib/mailman/lists/%%f/config.pck > C:\Temp\config.pck.%%f.txt
      )
  • WSLを使ってメーリングリストを作成(番外編2)

     しばらく運用して問題点が出てきたので解決する。

    1. サブドメインから送ったメールがAuthentication-Resultsセクションでdkim-adsp=noneとなる。
    2. 毎日06:30ごろにroot宛にCronのエラーメールが来る。
    3. リンゴの絵がついた携帯から投稿すると文字化けして配送される。

    1.サブドメインから送ったメールがAuthentication-Resultsセクションでdkim-adsp=noneとなる

     サブドメインml.mydomain.comにspfとdkimが必要らしい。以下のサブドメインに対してそれぞれ設定を行う。

    mail.mydomain.com
    ml.mydomain.com

    ・サブドメインにSPFレコードを追加する

    TXT,mail.mydomain.com v=spf1 include:mydomain.com -all
    

    ・Amazon SESでサブドメインにDKIMを追加する

    Amazon SESコンソールを開く
    Configurationの下のVerified identitiesをクリック
    Create identityを押す、identity typeのDomainをチェック
    Domainにサブドメイン名を入力 mail.mydomain.com
        Assign a default configuration set: off
        Use a custom MAIL FROM domain: off
    Create identifyを押す
    作成されたLegacy TXT RecordsとPublish DNS recordsをDNSに追加する
    
    TXT,_amazonses.mail.mydomain.com,xxxxx
    TXT,mail.mydomain.com,amazonses:xxxxx
    CNAME,xxx._domainkey.mail.mydomain.com,xxx.dkim.amazonses.com
    CNAME,yyy._domainkey.mail.mydomain.com,yyy.dkim.amazonses.com
    CNAME,zzz._domainkey.mail.mydomain.com,zzz.dkim.amazonses.com

     しばらくしてAWS側の検証が完了すると、DKIM setup SUCCESS for ドメイン という件名のメールがAWSアカウント宛に届く

    これでdkim-adsp=passとなっているはずなので、サブドメインからメールを送って確認する。

    ・元のドメインのDKIMを見てみるとキー長が1024ビットだったので2048ビットに変えておく。

    SESではキー長を変更する場合には以下の制限があるらしい

    ・同じ長さには変えられない
    ・24時間内に別のキー長に2回以上変えられない(その期間の最初のダウングレードを除く)

    キー長の変更手順

    Amazon SESコンソールを開く
    Configurationの下のVerified identitiesをクリック
    対象のアイテム(ドメイン)をクリックする
    AuthenticationタブのDomainKeys Identified Mail (DKIM)にあるEditを押す
    DKIM signing key lengthの RSA_2048_BIT か RSA_1024_BIT を選ぶ
    Save changesを押す
    次に送られるメールからは、キー長が変わるらしい。

    ・追加したサブドメインにバウンス対応用のSNS通知を設定しておく

    2.毎日06:30ごろにroot宛にCronのエラーメールが来る

    Cron <root@xxxx> test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    
      /etc/cron.daily/logrotate:
      invoke-rc.d: could not determine current runlevel

    WSLではinvoke-rc.dはエラーとなるが、誰かが動かそうとしているらしい。

    実行階層の解析
    /etc/crontab: ( cd / && run-parts --report /etc/cron.daily )
     /etc/cron.dairy/logrotate
      /usr/sbin/logrotate /etc/logrotate.conf: include /etc/logrotate.d
       /etc/logrotate.d/rsyslog
        /usr/lib/rsyslog/rsysrog-rotate
         invoke-rc.d rsyslog rotate > /dev/null

    rsysrog-rotate内でinvoke-rc.d が実行されていた。

    invoke-rc.d rsyslog rotate > /dev/null

    rsysrog-rotateファイルを書き換える。

    $ sudo vi /usr/lib/rsyslog/rsysrog-rotate
    invoke-rc.d rsyslog rotate > /dev/null
       ↓
    /etc/init.d/rsyslog rotate > /dev/null

    リンゴの絵がついた携帯から投稿すると文字化けして配送される

    届いたメールのヘッダーにによるとutf-8エンコードされた後にbase64エンコードされている。

    Content-Type: text/plain; charset=utf-8
    Content-Transfer-Encoding: base64

    mailmanがbase64デコードをせずに、base64エンコードされた文字列をそのままutf-8として解釈して転送しているので文字化けしているのかもしれない。

    以下のサイトにあるbase64デコードフィルターを追加することにした。

    https://yamagata.int21h.jp/tool/gmail-filter/

    上記サイトの内容でスクリプトファイルを作成する。先頭行は環境に合わせて書き換える。

    $ sudo vi /usr/local/bin/base64-filter.pl
      #!/usr/bin/perl
        ...
    $ sudo chomd +x /usr/local/bin/base64-filter.pl
    

    postfix用のaliasesファイルですべてのメーリングリスト名の行を書き換える。

    $ sudo vi /var/lib/mailman/data/aliases
      mailman:             "|/var/lib/mailman/mail/mailman post mailman"
        ↓
      mailman:             "|/usr/local/bin/base64-filter.pl |/var/lib/mailman/mail/mailman post mailman"
    $ sudo newaliases

    aliasデータベースを更新するのを忘れずに。

    $ sudo newaliases

    注意点として、メーリングリストの追加・削除や手動で/usr/lib/mailman/bin/genaliasesを実行したときには、このファイルが更新され、フィルターの記述が消えるので、都度編集する必要がある。