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-enabled | a2dismod | a2enmod | モジュールの設定ファイル |
sites-enabled | a2dissite | a2ensite | 仮想ホストの設定ファイル |
sites-enabled | a2disconf | a2enconf | その他設定ファイル |
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
)