macOS→VagrantのUbuntu→LXDコンテナへのポートフォワーディング

はじめに

VagrantでUbuntu 18.04 LTSとLXDをインストールする手順 で構築したLXDの環境で、macOS→VagrantのUbuntu→LXDコンテナへのポートフォワーディングをしたのでメモです。

今回はhttpsの443番ポートで試しました。

macOSからVagrantへのポートフォワーディング

基本的にはVagrantの公式ドキュメント Forwarded Ports - Networking - Vagrant by HashiCorp のように forwarded_port という設定をVagrantfileに追加すればOKです。

ただし、ホストでバインドするポートをhttpの80番やhttpsの443番のように1024番以下にするときは、すんなりとは行きません。上記のページの Options Reference の host の説明によると rootで vagrant up を実行すれば可能ですが、推奨されないとのことです。

ということで guestは443、hostは8443 と指定しました。

OSX における Vagrant 80番ポートフォワーディング - Qiita ではvagrant-triggersというプラグインを使ってVMの起動・停止時にmacOSの pfctl コマンドを実行して、ホストのローカルホストでポートフォワーディングすると良いらしいです。

今回はちょっと試すだけだったのでvagrant-triggersは使わず、手動で pfctl を実行しました。

Mac pfctl Port Forwarding | Sal Ferrarello も参考にして macOS で以下のコマンドを実行して 443から8443 へのポートフォワードを行いました。

echo "
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -

ポートフォワードの設定確認は以下のコマンドで行います。

sudo pfctl -s nat

ポートフォワードの削除は以下のコマンドで行います。

sudo pfctl -F all -f /etc/pf.conf

pfctl とVagrantのforwarded_portの合わせ技で macOS のローカルホストの443番ポートからVagrant上のUbuntuの443番ポートへのポートフォワードができるようになりました。

Ubuntuのファイアウォールで443番ポートを許可

Ubuntuには ufw というファイアウォールの管理用コマンドがあります。が、慣れているということで今回は iptables を使うことにしました。

まず ufw の状態を確認してみると無効になっていました。

$ sudo ufw status
Status: inactive

以下のコマンドで iptables-persistent をインストールします。

sudo apt install iptables-persistent

CUIのダイアログでIPv4とIPv6のファイアウォールの現在の設定を保存するか聞かれるのではいと答えます。 するとそれぞれ /etc/iptables/rules.v4/etc/iptables/rules.v6 に保存されます。

このうち前者を編集します。

sudo vim /etc/iptables/rules.v4

*filter セクションの -A INPUT の行が複数ありますが最後の後に以下の行を追加します。

-A INPUT -i lxdbr0 -p tcp -m tcp --dport 443 -j ACCEPT

保存してvimを抜けた後、以下のコマンドを実行して反映します。

sudo apt iptables-restore < /etc/iptables/rules.v4

以下のコマンドを実行して指定通り反映されたかを確認します。

sudo apt iptables-save

UbuntuからLXDコンテナへのポートフォワーディング

LXDのproxyを使ってポートフォワーディング の手順で設定してください。

動作確認

これでmacOS上のブラウザで https://localhost にアクセスするとLXDコンテナの443番ポートにアクセスできるようになりました。 まとめると macOS 443→ macOS 8443→ Vagrant 443→LXD 443 という4段フォワードとなっています。