Azure Firewall を使ってみる

前回までで、リバースプロキシを構成しました。
Azure 上ではNSG に守られていますが、オンプレ流にファイアウォールを立ててみます。
※便宜上リバースプロキシと言ってますが、Azure Firewall の機能にフォーカスして書きます。

## 構成
新しくVNet を追加してAzure Firewall を設置して、リバプロのVNet とは別のVNet に設置します。
![Slide4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/22d31a92-0346-4373-b8d5-fdbbcadf3757.jpeg)


## Azure Firewall のデプロイ
Firewall に付随して必要なリソースはパブリックIP （と仮想ネットワーク、サブネット）です。
Basic SKU を使う場合は、追加で管理用のパブリックIP アドレスが必要となります。適当に作りました。今回は使ってません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/05d6db00-fd41-490d-bfec-6841b6fca3b8.png)

デプロイには5分程度かかりました。

### Firewall のDNAT ルール追加
Firewall を介してワークロード（今回ならリバプロ）に接続するにはDNAT（宛先NAT）が必要です。
Firewall と同時にデプロイされているFirewall Policy で設定できます。
設定前に、Firewall に紐づいたパブリックIP アドレスをメモっておきます。Firewall の「設定」＞「パブリックIP構成」で見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/467b7744-d681-4030-b804-0b3631aa0dda.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/86defeb2-1c65-4797-bd58-f1ab46d11739.png)

こちらはDNAT の設定。Firewall Policy から、「DNAT規則」＞「規則コレクションの追加」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/0bb5a6ad-db21-4b88-9eae-ef2fab2103f7.png)

リバースプロキシに自分の家PC からつなぐ想定で、設定した項目はこんな感じです。"Port" については22 でいいのかしら。Teraterm を使います。
ルールのデプロイにも数分かかりました。
| 項目 | 内容 |
|:-:|:-:|
| Rule name  | revpro  |
| Source  | 自分の家PC　のパブリックIP  |
|  Port |  22 |
|  Destination | Firewall のパブリックIP（メモしたもの）  |
|  Translated Address |  10.1.0.4 (リバプロのプライベートIP） |
| Translated Port  | 22  |


### Firewall を介してリバプロに接続
Teraterm で、Firewall のパブリックIP に向けてSSH をすると接続できました。
※Firewall とリバプロが別の仮想ネットワークにいるので、仮想ネットワークピアリングをしてください。

tshark でパケットキャプチャしてみます。

```
Capturing on 'eth0'
    1 0.000000000     10.0.1.8 → 10.1.0.4     TCP 60 51942 → 22 [ACK] Seq=1 Ack=1 Win=251 Len=0
    2 0.465985279     10.1.0.4 → 10.0.1.8     SSH 202 Server: Encrypted packet (len=148)
    3 0.526023202     10.0.1.8 → 10.1.0.4     TCP 60 51942 → 22 [ACK] Seq=1 Ack=149 Win=255 Len=0
    4 0.977897770     10.1.0.4 → 10.0.1.8     SSH 186 Server: Encrypted packet (len=132)
    5 0.977939769     10.1.0.4 → 10.0.1.8     SSH 202 Server: Encrypted packet (len=148)
    6 0.987029073     10.0.1.8 → 10.1.0.4     TCP 60 51942 → 22 [ACK] Seq=1 Ack=429 Win=254 Len=0
    7 1.489965502     10.1.0.4 → 10.0.1.8     SSH 186 Server: Encrypted packet (len=132)
    8 1.490025575     10.1.0.4 → 10.0.1.8     SSH 298 Server: Encrypted packet (len=244)
    9 1.498536804     10.0.1.8 → 10.1.0.4     TCP 60 51942 → 22 [ACK] Seq=1 Ack=805 Win=253 Len=0
   10 2.001904621     10.1.0.4 → 10.0.1.8     SSH 186 Server: Encrypted packet (len=132)
   11 2.001940881     10.1.0.4 → 10.0.1.8     SSH 298 Server: Encrypted packet (len=244)
   12 2.011285053     10.0.1.8 → 10.1.0.4     TCP 60 51942 → 22 [ACK] Seq=1 Ack=1181 Win=251 Len=0
   13 2.513773676     10.1.0.4 → 10.0.1.8     SSH 186 Server: Encrypted packet (len=132)
   14 2.513799554     10.1.0.4 → 10.0.1.8     SSH 298 Server: Encrypted packet (len=244)
   15 2.522775011     10.0.1.8 → 10.1.0.4     TCP 60 51942 → 22 [ACK] Seq=1 Ack=1557 Win=255 Len=0
   16 3.025756842     10.1.0.4 → 10.0.1.8     SSH 186 Server: Encrypted packet (len=132)
   17 3.025786326     10.1.0.4 → 10.0.1.8     SSH 298 Server: Encrypted packet (len=244)
   18 3.034777495     10.0.1.8 → 10.1.0.4     TCP 60 51942 → 22 [ACK] Seq=1 Ack=1933 Win=254 Len=0
   19 3.537904495     10.1.0.4 → 10.0.1.8     SSH 186 Server: Encrypted packet (len=132)
```
どうやら、リバプロは10.0.1.8 とやり取りしているように見えています。
DNAT で宛先を自動的に変換するルールは明示的に書きましたが、送信元は勝手にAzureFirewallSubnet のアドレスに変換されるように見えます。

### ネットワークルール・アプリケーションルールについて
インバウンド通信については、アプリケーションルールが適用されません。必要ならWAF を使うことになります。
今回のように仮想マシンにパブリックIP を付与していない場合、DNAT のルールが必須になるため、（DNATルールにより宛先アドレスなど全部設定できるため）ネットワークルールも明示的に設定する必要はないようです。