normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Microsoft Azure で pfSense アプライアンスを仮想マシンとインターネットの間に配置して疎通を取る

皆様は pfSense というネットワークアプライアンス製品はご存じでしょうか?日本の社畜業界で生きていた身からすると F5 さんの BIG-IP が有名かなという気もしますが、アメリカに限らず各国で幅広く利用されています。今回はこちらを Azure に配置する簡単な手順を紹介します。
www.pfsense.org
実は仮想マシンを作成後、裏側に配置した別の仮想マシンからのネットワークトラフィックが通らずどこが悪いのか、しばくら悶々としながら調査しておりました。自分の備忘も兼ねて何をしたかを簡単にまとめておきたいと思います。

日本の方が試す場合の注意点

注意点として、pfSense は Azure Marketplace 上に公開されていますが、実は日本向けには公開されていません。日本リージョン向けに作成したアカウントで pfSense の Azure Marketplace イメージを利用した VM を作成しようとすると以下のエラーがでます。

また、上記を解消する為にアカウントの国情報を変えることができず、私は今回の検証をするために新規にアメリカ側でのアカウントを作成しました。公式ドキュメントとしては以下を参照ください。
learn.microsoft.com

今回作る構成のアーキテクチャ

今回は以下の様に pfSense VM には Public IP 経由で接続し、SSH は Azure Bastion 経由で pfSense VM と裏にある Kali Linux に接続します。Route Table を利用して Kali Linux 側のネットワークを pfSense VM 経由する様にしている点に留意してください。

具体的に作成するリソース一覧は以下です。

  • Virtual Network x 1
  • Azure Bastion
  • Kali Linux x 1
  • pfSense network appliance x 1
  • Route Table x 1

本番環境を考える場合、冗長化等は必須になります。今回はあくまで検証用であるという点には留意してください。

実際に作る手順

まずは仮想ネットワークを作ります。今回は West US3 リージョンを選びました。

次の画面で "Enable Azure Bastion" にチェックを入れて Azure Bastion を作成するようにしておきましょう。

次に以下の画像を参考にして front-subnet、back-subnet、AzureBastionSubnet の三つのサブネットが含まれる仮想ネットワークを作成します。サブネットの大きさは自由に設定しても構いませんが、AzureBastionSubnet については公式ドキュメントの About Azure Bastion configuration settings | Microsoft Learn を参照してください。

上記の作成は Azure Bastion インスタンスの作成に時間がかかるので、数分程度待つ必要があります。

次にバックエンド相当になる Kali Linux を作成します。ここではお安めに抑えたいので B シリーズインスタンスを選びます。B-series burstable - Azure Virtual Machines | Microsoft Learn

ここで SSH キーを作成し、後で Azure Bastion で接続する際に利用します。

以下の様に backend-subnet に配置します。

VM 作成時に以下の様に private key をダウンロードする画面が表示されるので、ダウンロードしてください。こちらは後に利用します。

同様のステップで pfSense の仮想マシンも作成します。pfSense Plus Firewall/VPN/Router TAC Lite という仮想マシンイメージがあるので、こちらを選びます。front-subnet をデプロイ先のサブネットとして選び、SSH キーは Kali Linux を作成した際のものをそのまま利用しましょう。

pfSense の VM 作成後、同仮想マシンのネットワークインターフェースを開き、IP configuration から Enable IP forwarding にチェックを入れてください。こちらに合わせて IP アドレスも 10.0.0.4 に固定するように変更をしておきましょう。
Hybrid connection with two-tier application | Microsoft Learn

最後に Route Table を作成し、Kali Linux が配置された back-subnet にアタッチします。まずは新規に Route Table を以下の様に作成します。

次に back-subnet 側の Next hop を全て pfSense 側にトラフィックを流すように以下の様にルートを設定します。

最後に back-subnet 側に本 RouteTable は関連付けて Azure リソースの作成は完了です。

pfSense ファイヤウォールの設定

まずは管理画面にアクセスします。pfSense の Public IP をブラウザに開くと以下の画面が表示されるので、デフォルトのユーザ名・パスワードである admin/pfsense を利用して管理画面にログインします。

ログインすると以下の画面が表示されるので Change the password in the User Manager リンクからパスワードを変更しておきましょう。

次に Firewall / NAT / Outbound をメニューから開き、新規に outbound を許可する以下のルールを作成します。

更に以下の Hybrid Outbound NAT rule generation.(Automatic Outbound NAT + rules below) をチェックします。これにより Kali Linux から WAN インターフェース経由での outbound 接続自体がルーティングされます。最後に Apply Changes を押下するのを忘れない様にしてください。

pfSense デフォルトの設定では Kali Linux 側から HTTP/HTTPS の outbound 接続を許可していません。Firewall / Rules / WAN メニューを開き、以下のルールを追加します。こちらは back-subnet(10.2.0.0./24)からの HTTPS による outbound を許可する設定です。こちら加えて HTTP のルールも加えた後、Apply Changes を押下してルールを適用します。

最終的に Firewall / Rules / WAN の画面は以下の様になります。

Kali Linux から HTTPS で outbound 接続をしてみる

さっそく Azure Bastion 経由で Kali Linux に接続してみましょう。この際に保存済の SSH キーを利用します。

ログイン後 wget コマンドを使って任意の URL にアクセスし、レスポンスが帰ってくれば成功です。

Kali Linux から HTTPS で outbound 接続を許可しない場合

次に以下の様に HTTPS の outbound 接続を不許可にしてみましょう。

その後に Kali Linux 側で wget を実行すると以下の様にレスポンスが返ってきません。

pfSense 側の Diagnostics / States / States を確認すると FIN_WAIT_2: FIN_WAIT_2 でステップが止まっているのを確認できます。