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
  )