既定のSNATを無効にして、ロードバランサーのSNATを利用する

今日はSNAT について書きます。

あまり意識していなかったのですが、Azure では仮想マシンにパブリックIPをつけなくても、インターネットに出られます。これは、既定でSNAT (Source NAT)がはたらいているからで、サブネットを出るときに自動的にパブリックIP アドレスに変換されているんだそうです。

この既定のSNAT は廃止されることが決まっています。そのため、インターネットに出る他の手段を考えておく必要があります。
yamapan さんが詳しくまとめてくれているのでご参照ください。[記事](https://qiita.com/aktsmm/items/b33640d83c5d7b26bf85)

この記事では、ロードバランサーを使ったSNAT を検証してみます。

## 概要
1. 既定のSNAT を観察。つまりパブリックIP を与えない仮想マシンからブラウザでインターネットに出ます。
1. 既定のSNAT を無効にして、インターネットに出られないことを確認。
1. ロードバランサーのNAT 機能を有効にし、インターネットに出られることを確認。

## 1.既定のSNAT
適当に仮想ネットワークを作成し、パブリックIP を持たない仮想マシンを作成します。
仮想ネットワークを作成するときにも特に注意はありません。Bastion 入れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/e88bbafe-0d42-902c-8b46-ece871f49c8a.png)
赤枠のところで、今回のネタになっているSNAT （言葉は出てきてませんが）について書かれていますね。要するに既定のSNAT はおすすめしません、と言っているのだと思います。そしてその対策としてNAT ゲートウェイがおすすめだと。

仮想マシンの作成時に、ロードバランサーが作れますがここでは「なし」を選択します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/57ccdab7-1e9e-fac6-d9e3-591689ff0e83.png)
パブリックIP はつけません。

### インターネットに出る
Bastion 経由で仮想マシンにRDP し、ブラウザでIP アドレスを確認すると、このようなIP アドレスが見えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/4b15a449-b68f-aece-ca1b-25e58bf8299e.png)
これはサブネットを出るときに変換された後のパブリックIP アドレスです。
仮想マシンを確認すると、パブリックIP はありません。既定のSNATなのでIP アドレス確認くんで見たアドレスはここで見えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/b44c5090-caf1-ecfb-ac24-f572a40ab66b.png)
意識しないとまぁそんなもんか、という感じですが、パブリックIP がないと外には出られないはずのところ、Azure が貸してくれているみたいなもんで、デフォルトでは出られるようになっています。それが今後廃止になる、というところにこの記事のモチベーションがあります。


## 2.既定のSNAT を無効にする
サブネットの作成時に既定のSNAT を無効にすることができます。有効/無効を作成後に切り替えることはできません。検証のために作り直します。

仮想ネットワークの作成時に、プライベートサブネットという設定を行います。
default サブネットを選択するとそのオプションがでてきます。プレビュー期間のようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/10208b69-0ef0-230d-a6b1-e8593248e876.png)
これに✓を入れて作成。そのほかは既定のSNAT を試したときと同じです。
仮想マシンの方は、プライベートサブネットにしたdefault サブネットに置くこと、パブリックIP を与えないことが注意点です。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/db5098b5-290f-e3d8-d4d6-17e4936f0090.png)

### インターネットに出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/05c3e1bb-5ccc-56e8-cf72-6dcea6c280af.png)
先ほどと同じようにBastion した仮想マシンからブラウザでIP アドレス確認くんに接続しようとしても、確認できません。プライベートサブネットで既定のSNAT が無効になっているためこうなっています。

## 3.ロードバランサーでSNAT
インターネットに出る方法はさまざまあります（詳細は冒頭で紹介した記事をご覧ください）。
今回はロードバランサーを使ってみます。
ロードバランサーはフロントエンドIP アドレスで通信を待ち受け、バックエンドプールに通信を分散する機能を持ちます。逆に、バックエンドプールからインターネットに出るときは、フロントエンドIP アドレスに変換してくれます。
それではロードバランサーの作成から始めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/5e52230d-0b1c-7209-503f-f8a85a55c1ae.png)

種類はパブリックで、SKU はStandard にしておきます。種類をパブリックにしないとパブリックIP 使わないんじゃないか、たぶん。また検証しよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/cbae58e3-5243-a1eb-3dd2-0f8591edc43c.png)

フロントエンドIP 構成では、パブリックIP アドレスを新規作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/262fe4c4-2d5b-09d5-f3cf-4b09252575ea.png)

バックエンドプールでは、バックエンドプールの追加から仮想ネットワークを選択し、NIC を選択し、IP 構成には仮想マシンを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/2805b618-f11b-eddf-90de-0c38c572dc0e.png)

今回はインバウンド規則は触りません。

アウトバウンド規則では、
1. 先ほど新規作成したパブリックIP アドレスをフロントエンドIP アドレスに指定
1. プロトコルはTCP （HTTPS を運んでほしいため）
1. バックエンドプールに先ほどのバックエンドプールを指定
1. ポートの割り当ては適当に設定しました。手動、インスタンスごとのポート数、16　のように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/2e8fbf2c-f9a5-ec5d-629a-b209fa07562f.png)

これで検証通ったので作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/9aedf7f0-1cdb-8ff0-2e27-58434b54a71c.png)

作成されたら、すでに構成は終わっているので、先ほどの仮想マシンのBastion に戻ってインターネットへの接続を試みます。

### インターネットに出る
ブラウザの更新ボタンをクリックすると即時でページが変わりました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/1017fba5-3fe6-ffbe-4d6e-2e1d2bb9be45.png)
さてこのIP アドレスは？？というと・・・
お分かりの通り、ロードバランサーのフロントエンドIP アドレスですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/22c72396-561f-2b6a-b3ce-6e2ca979d372.png)
仮想マシンが、ロードバランサーを経由して、インターネットに出られるようになりました。

## おわりに
あんまり意識していませんでしたが、パブリックIP アドレスがないと外には出られないのが本来です。Azure は今まで意識しなくてもいいようになっていたようです。
AWS は元から（？）NAT ゲートウェイを置かないとインターネットに出られない仕組みだったようです。1年ほど前にやったAWS の本を復習したときにハッとしました。

この構成は、既定のSNAT が廃止になったら一般化するかなぁと思うので、今度はBicep でIaC にしてみたいと思います。

今回はここまで。お疲れさまでした。