セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ vol.23 ラボ環境 on Azureに、共通のテスト用メール環境を導入したい
2024年07月01日配信
執筆者:山内 和朗
vol.19~22で紹介したWSL 2(Ubuntu)で簡単に導入できるテスト用メール環境は、スタンドアロン環境での利用を想定したものでした。送信メールサーバー(SMTP)、受信メールサーバー(POP3およびIMAP)ともにlocalhostを指定しての利用です。Windows標準機能でポートプロキシ(ポート転送)を構成すれば、利用範囲をローカルホストからローカルネットワークに広げることができます。
WSL 2のLinuxディストリビューションは、起動すると既定の仮想スイッチ(スイッチ名: WSL)に接続されます。この仮想スイッチは、Hyper-Vと共通の、“内部”タイプのネットワークであり、WindowsとLinuxディストリビューションの両方がこのスイッチに接続され、プライベートIPアドレスがそれぞれに動的に割り当てられます。Linuxディストリビューションからは、NAT(ネットワークアドレス変換)ベースのアーキテクチャで外部に通信することができ、外部からのアクセスはWSL 2をホストするWindowsから、プライベートIPアドレスを使用してアクセスすることができます。また、Windowsからlocalhost(127.0.0.1)に対するアクセスは、透過的にLinuxディストリビューションに転送されます。
このブログの「メモ. WSL 2へのポートプロキシ設定に" "で苦労した話」でも説明したように、Windowsが接続されているローカルネットワーク(LAN)からLinuxディストリビューションにアクセスするように構成することもできます。それには、Windowsのポートプロキシを利用して、WindowsのローカルポートへのアクセスをLinuxディストリビューションにポート転送してあげるのです。
WSL を使用したネットワーク アプリケーションへのアクセス|ローカル エリア ネットワーク (LAN) からの WSL 2 ディストリビューションへのアクセス
https://learn.microsoft.com/ja-jp/windows/wsl/networking#accessing-a-wsl-2-distribution-from-your-local-area-network-lan
このブログでは、入れ子になった仮想化(Nested Virtualization)を利用して、Azure VMにHyper-Vベースのラボ環境を構築してきました。Hyper-V VMに、WSL 2対応のWindowsゲストをインストールすれば、そのローカル環境でWSL 2のテスト用メール環境を導入することができますが、Hyper-V VMごとにそれを用意するのは少し手間です。また、WSL 2非対応のWindowsやLinuxゲストのHyper-V VMではこの方法は利用できません。
そこで、Hyper-Vベースのラボ環境を提供するAzure VMに、WSL 2のメール環境を導入することにしました。ポートプロキシを構成することで、Hyper-V VMが接続される内部ネットワークに送信メールサーバーと受信メールサーバー、つまりSMTP(TCPポート25)、POP3(TCPポート110)、IMAP(TCPポート143)へのアクセスを提供するのです(図1)。
図1 WSL 2(Ubuntu)のテスト用メール環境をHyper-Vホスト(Azure VM)に導入する
まず、vol.20のデモで示したのと同じ手順で、ラボ環境を構築したAzure VMのローカル環境に、WSL 2(Ubuntu)のテスト用メール環境を導入します。そして、Ubuntuに複数のローカルユーザーを作成し、ローカル環境にメールクライアントをインストールして、メールの送受信をテストします(画面1)。
画面1 ラボ環境を構築したAzure VMのローカル環境に、WSL 2をインストールし、テスト用メール環境をインポートしてローカル環境でのメール送受信環境を整える
続いて、ポートプロキシとWindowsファイアウォールの受信の規則を作成します。次のようなスクリプトを記述したPowerShellスクリプト(.ps1)を作成し、実行すれば、ポートプロキシの設定とWindowsファイアウォールの受信の規則が作成され、ポート転送を受け付けるようになります(実行には管理者権限が必要です)。Linuxディストリビューション(Ubuntu)は実行中であっても、なくても構いません。Enterキーを最初のwsl -e hostname -Iの実行時にUbuntuが停止中であれば、自動的に開始されます(Ubuntuが既定のLinuxディストリビューションの場合)。なお、このスクリプトの内容については、「メモ. WSL 2へのポートプロキシ設定に" "で苦労した話」をご覧ください。
$ubuntuip = (wsl -e hostname -I).Trim() $myfwrulename = "MyWSLrule" netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=25 connectaddress=$ubuntuip connectport=25 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=110 connectaddress=$ubuntuip connectport=110 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=143 connectaddress=$ubuntuip connectport=143 netsh interface portproxy show v4tov4 New-NetFirewallRule -Name $myfwrulename -DisplayName "Allow Inbound 25 110 143" -Protocol TCP -LocalPort @(25, 110,143) -Action Allow Write-Host "Mail receiving environment is running." Write-Host "Press Enter to exit" cmd /c Pause | Out-Null netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=25 netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=110 netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=143 netsh interface portproxy show v4tov4 Remove-NetFirewallRule -Name $myfwrulename wsl --terminate Ubuntu |
このスクリプトは“Press Enter to exit”というプロンプトで中断し、その間、ポート転送を受け付けます。Enterキー(または任意のキー)を入力すると、ポートプロキシの設定とWindowsファイアウォールの受信の規則が削除され、Linuxディストリビューション(Ubuntu)を停止します。
画面2 ポートプロキシとWindowsファイアウォールの受信の規則を追加/削除するスクリプトを作成し、実行する
あとは、WindowsやLinuxゲストを実行するHyper-V VMに、メールクライアントをインストールし、送信メールサーバー/受信メールサーバーを「192.168.0.1」(Hyper-V VMのデフォルトゲートウェイとなっているHyper-Vホスト側のIPアドレス)として設定すれば、Hyper-Vホストで動くWSL 2(Ubuntu)のメール環境を利用することができます(画面3)。
画面3 Hyper-V VMのゲスト側のメールクライアントからメールを送受信できることを確認する
Azure上のラボ環境のAzure VMは、小さいサイズ「Standard_D2s_v5(2コア、8GBメモリ、13,571円/月)」でスタートしました。しかし、WSL 2のテスト用メール環境を導入したことで、WSL 2実行時のリソース使用量が増えてしまいました。このサイズでは、1台のHyper-V VMを何とか実行できるくらいなので(残りの利用可能メモリは4GB程度)、Azure VMのサイズを当初予定していた「Standard_D4s_v5(4コア、16GBメモリ、27,142円/月)」にスケールアップすることにしました。
その方法はいたって簡単で、Azure VMを「停止済み(割り当て解除)」の状態にしたら、Azure VMの管理ブレードの「可用性とスケール|サイズ」を開いて、新しいサイズを選択し、「サイズの変更」をクリックします(画面4)。
画面4 WSL 2のメール環境を導入したことで、Hyper-Vで利用可能なリソースが減ってしまったので、サイズを当初予定していた「Standard_D4s_v5」に変更