IBM Cloud: BM for VPCのインターフェース属性（Infrastructure NAT）とは何か？

#1. はじめに

VSIの時にはなかったBM for VPCのインターフェースの属性として`Enable infrastructure NAT`というものが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/be520e07-7627-c116-12f8-60232635b435.png)

これは一体何をするものでしょうか？無効にするとどうなるでしょうか？
[IBM Cloud docs](https://cloud.ibm.com/docs/vpc?topic=vpc-managing-nic-for-bare-metal-servers&interface=ui&locale=en)には一応以下のように説明があります・・・がこれだけ読んでピンと来る人はほとんどいないのではないでしょうか。

>Turning on infrastructure NAT allows the VPC infrastructure to perform any needed NAT operations. If infrastructure NAT is off, the packet passes unmodified to and from the network interface, allowing the workload to perform NAT operations. The default option is on. You must have the Advanced Network Operator IAM role to modify this configuration. Allow IP spoofing must be turned off if Enable infrastructure NAT is turned off.


#2. パケットフロー

- `118.x.xx.131`は、私の端末のGlobal IP
- `158.xxx.xx.55`は、Floating IP(サーバーのネットワークインターフェースに紐づけることができるPublic IP)
- `172.16.0.4`はVMのIP

とします。

##2-1: Infrastructure NATが有効の時（デフォルトの挙動）

- Floating IP宛のパケットは**VPC内でFloating IPからネットワークインターフェースのIPにDestination NATされて**、サーバーに到達します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/cc74776b-8388-bd5f-e0a0-eb7655f80b45.png)

```txt:InfrastructureNATが有効な時のVM上でのtcpdump
[root@guestvm1 ~]# tcpdump -i any port 443 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
14:54:04.963287 IP 118.x.xx.131.36336 > 172.16.0.4.443: Flags [S], seq 3006787997, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 875394950 ecr 0,sackOK,eol], length 0
14:54:06.033623 IP 118.x.xx.131.36336 > 172.16.0.4.443: Flags [S], seq 3006787997, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 875395950 ecr 0,sackOK,eol], length 0
14:54:07.047181 IP 118.x.xx.131.36336 > 172.16.0.4.443: Flags [S], seq 3006787997, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 875396950 ecr 0,sackOK,eol], length 0
14:54:08.055694 IP 118.x.xx.131.36336 > 172.16.0.4.443: Flags [S], seq 3006787997, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 875397950 ecr 0,sackOK,eol], length 0
14:54:09.059092 IP 118.x.xx.131.36336 > 172.16.0.4.443: Flags [S], seq 3006787997, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 875398950 ecr 0,sackOK,eol], length 0
```

##2-2: Infrastructure NATが無効の時

- Floating IP宛のパケットは**VPC内では何も行われません。Floating IPに紐づいているネットワークインターフェース宛にそのまま転送されます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/21a90242-9243-12b0-14cb-4e70e2d88472.png)

```txt:InfrastructureNATを無効にした時のVM上でのtcpdump
[root@guestvm1 ~]# tcpdump -i any port 443 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
14:55:13.137704 IP 118.x.xx.131.39416 > 158.xxx.xx.55.443: Flags [S], seq 1477831577, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 1853123572 ecr 0,sackOK,eol], length 0
14:55:14.145450 IP 118.x.xx.131.39416 > 158.xxx.xx.55.443: Flags [S], seq 1477831577, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 1853124572 ecr 0,sackOK,eol], length 0
14:55:15.145397 IP 118.x.xx.131.39416 > 158.xxx.xx.55.443: Flags [S], seq 1477831577, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 1853125572 ecr 0,sackOK,eol], length 0
14:55:16.149641 IP 118.x.xx.131.39416 > 158.xxx.xx.55.443: Flags [S], seq 1477831577, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 1853126572 ecr 0,sackOK,eol], length 0
14:55:17.154095 IP 118.x.xx.131.39416 > 158.xxx.xx.55.443: Flags [S], seq 1477831577, win 65535, options [mss 1420,nop,wscale 6,nop,nop,TS val 1853127573 ecr 0,sackOK,eol], length 0
```

Infrastructure NATが無効のケースは、どういう時に役に立つのでしょうか？
例えば、VPC上でVMware NSXなどを使ってネットワークの仮想化をしている場合、T0ルーターにそのままパケットを割り振りたい時などにこの機能は役立ちます。VPC側でNATされてしまっていたら、T0ルーターに到達する時に既に宛先がT0ルーターのprivate IPになってしまっていますし、T0ルーターからVMに転送するために再度NATが必要になってきたりしますからね。。。
T0ルーターに宛先IPがpublic IPのまま到達してくれた方が、そこから再度DNATするのか、そのままフォワードするのか、など設計の柔軟性も上がるのではないでしょうか。

#3. Floating IPの関連付け

通常は、Infrastructure NATが有効の時はFloating IPは1つしか紐付けることはできません。しかし、Infrastructure NATを無効にすれば、複数のFloating IPを紐付けることができます。

- Infrastructure NATが有効の時<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/cce8b469-8c0b-9187-206f-90b78d3fe544.png)
- Infrastrucutre NATが無効の時<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/68ea7145-5a7a-3ec5-0cf5-ae4c5a786b04.png)

以下、[IBM Cloud docs](https://cloud.ibm.com/docs/vpc?topic=vpc-managing-nic-for-bare-metal-servers#add-fips-to-nic&locale=en)より引用

:::note warn
To associate multiple floating IPs to a network interface, make sure that both Allow IP spoofing and Enable infrastructure NAT are off on the network interface.
:::