IBM CloudのVPN for VPC(Site-to-Siteタイプ)から入ってきた通信に対しVPCでNATを行う

VPN for VPC（Site-to-Siteタイプ）でIBM Cloud環境に接続した後、さらに別の環境にアクセスしたいことがあります。
今回は、PowerVSにアクセスするケースを想定しています。
Direct LinkでIBM Cloudに接続した時の構成は[こちらの記事](https://qiita.com/y_tama/items/05738986fcf92866abb0)に書きましたが、今回はVPN接続編です。

オンプレミスから最終的な接続先（PowerVS）に直接は行けない（それらへのルーティング情報はオンプレには広告されない）ので、VPCのVSIで、NATを行います。

オンプレ側で宛先に指定するIPアドレスは、VPCでユーザーが定義可能なセグメントから払い出されたものなので、オンプレ側とのIP重複を避けられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/9db12c6e-6b77-f571-97d9-3e6d372740ed.png)

（この記事ではNAT定義周りにフォーカスし、オンプレミスとVPC間のIPsec接続と、x86とPowerVS間のCloud Connections[またはDL2.0]は事前に構成済みとします）

# NAT GW用のVSIを作成
実際のNAT処理はVSIで行いますので、オーダーします。今回はCentOS 7.xで立てました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/17e7bf07-e103-d7a0-a232-12a8284d6b7a.png)

# NAT用サブネットを作成

NAT用IPアドレスとして使うためのサブネットを作成します。この例では、192.168.82.64/26としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/200080e3-1751-9e70-5fb5-b3d60dd3849d.png)

# VPC上でルーティング・テーブル設定

上記で作成したサブネットにアクセスがあった場合、NATゲートウェイとして立てるVSIにルーティングするよう、ルーティング・テーブルに定義します。

今回は、「オンプレからVPN for VPC経由で入ってくる通信（とその戻りの通信）」と、「VSIでNAT後、PowerVS用のDirect Linkに抜けていく通信（とその戻りの通信）」を制御したいです。

前者は、ルーティング・テーブルのトラフィック・タイプにEgressを選びます。直感的には外部からIPsecトンネルを通ってVPCに入ってくるのでIngressで制御したくなりますが、VPN GatewayはVPC上のプライベートIPアドレスを持っており、オンプレからIPsecトンネルを抜けて来たパケットは「VPC上のコンポーネントから送り出されるパケット」という扱いになるため、Egressで制御することができます。
後者は、トラフィック・タイプはIngress、トラフィック・ソースはDirect Linkを選びます。

EgressもIngressも、宛先CIDRは上記で作成したNAT用サブネットです。ネクスト・ホップには、上記で立てたNAT GW用VSIのIP(今回は192.168.82.4)を指定します。もしNAT GWが壊れてVSIを再作成してIPが変わったとしても、このネクスト・ホップを新しいIPに書き換えることで比較的簡単に対応できると思います。（あるいは最初からNAT GWを2台立てておいて、障害時にネクスト・ホップを切り替えるスクリプトを用意しておくとか。）

これで、このNAT用サブネット宛に来たパケットはNAT GW用VSIにルーティングされるようになりました。

【VPN for VPC用（Egress）】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/80ae475c-f8d7-c658-67eb-87683cfc3992.png)

【PowerVSとの通信用（Ingress）】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/012ebd9e-c0cf-c38c-76c9-1f96302d8e69.png)

# NAT GW設定

NAT GW用VSIがNATを行えるよう設定します。
まず、VSIのネットワーク・インターフェース定義で、「IP スプーフィングを許可」を有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/6a02f0a1-1b3f-e486-4841-71a1676b7c94.png)

kernel parameterでip_forwardを許可するため、/etc/sysctl.d/nat.confファイルに「net.ipv4.ip_forward = 1」を記述し、sysctlコマンドで反映します。

```
# cat /etc/sysctl.d/nat.conf
net.ipv4.ip_forward = 1
# sysctl -p /etc/sysctl.d/nat.conf
net.ipv4.ip_forward = 1
#
```

次に、NAT用のIPアドレスを、NAT GWのVSIのlo interfaceに定義します。
前の手順のルーティング・テーブルの設定により、192.168.82.64/26宛のパケットはこのVSIにルーティングされて来ますので、それを受けられるように、この範囲のIPを付けます。今回は192.168.82.70を付与します。

```
# ip addr add 192.168.82.70/32 dev lo
```

firewalldをenable/startします。

```
# systemctl enable firewalld
# systemctl start firewalld
```

Destination NAT先として、まずはPowerVSに立てたAIXのIP（192.168.150.195）を指定します。
AIXからの戻りパケットが戻ってこられるよう、Source NATも設定します。
また、sshの22番ポートを許可する設定も入れます。

```
# firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d 192.168.82.70 -j DNAT --to-destination 192.168.150.195
success
# firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j SNAT --to 192.168.82.70
success
# firewall-cmd --direct --add-rule ipv4 filter FWDO_public_allow 0 -m tcp -p tcp --dport 22 -j ACCEPT
success
# firewall-cmd --reload
success
# 
```

```:設定内容確認
# firewall-cmd --direct --get-all-rules
ipv4 nat POSTROUTING 0 -o eth0 -j SNAT --to 192.168.82.70
ipv4 filter FWDO_public_allow 0 -m tcp -p tcp --dport 22 -j ACCEPT
ipv4 nat PREROUTING 0 -d 192.168.82.70 -j DNAT --to-destination 192.168.150.195
#
```

# アクセス確認

オンプレ側から192.168.82.70にアクセスすると、NATされて192.168.150.195のPowerVSにアクセスできます。

```:オンプレ側からNAT用IPにping
# ping 192.168.82.70
PING 192.168.82.70 (192.168.82.70) 56(84) bytes of data.
64 bytes from 192.168.82.70: icmp_seq=1 ttl=242 time=11.6 ms
64 bytes from 192.168.82.70: icmp_seq=2 ttl=242 time=11.9 ms
```

```:NAT GWでのtcpdump（ping 1往復分）
# tcpdump host 192.168.82.70 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:30:44.949833 IP 192.168.72.4 > 192.168.82.70: ICMP echo request, id 12387, seq 1, length 64 ←オンプレサーバーからNAT用IP
21:30:44.949885 IP 192.168.82.70 > 192.168.150.195: ICMP echo request, id 12387, seq 1, length 64 ←NAT GWでDNAT&SNATして、PowerVSに転送
21:30:44.951465 IP 192.168.150.195 > 192.168.82.70: ICMP echo reply, id 12387, seq 1, length 64 ←PowerVSからNAT GWへの戻り
21:30:44.951474 IP 192.168.82.70 > 192.168.72.4: ICMP echo reply, id 12387, seq 1, length 64 ←NAT GWからオンプレへの戻り
```

NAT GW上でSource NATしているため、AIX上で確認すると、パケットは192.168.82.70から来ています。

```:オンプレから192.168.82.70にpingしている時のAIX上のtcpdump
# tcpdump -ni en1 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en1, link-type EN10MB (Ethernet), capture size 262144 bytes
17:00:01.423033 IP 192.168.82.70 > 192.168.150.195: ICMP echo request, id 12632, seq 18, length 64
17:00:01.423049 IP 192.168.150.195 > 192.168.82.70: ICMP echo reply, id 12632, seq 18, length 64
17:00:02.425004 IP 192.168.82.70 > 192.168.150.195: ICMP echo request, id 12632, seq 19, length 64
17:00:02.425021 IP 192.168.150.195 > 192.168.82.70: ICMP echo reply, id 12632, seq 19, length 64
```

```:オンプレ側からNAT用IPにSSHアクセス
# # ssh -l root 192.168.82.70
Last login: Tue Jun 14 06:25:03 CDT 2022 on /dev/pts/2 from 192.168.82.70
*******************************************************************************
*                                                                             *
*                                                                             *
*  Welcome to AIX Version 7.2!                                                *
*                                                                             *
*                                                                             *
*  Please see the README file in /usr/lpp/bos for information pertinent to    *
*  this release of the AIX Operating System.                                  *
*                                                                             *
*                                                                             *
*******************************************************************************
# 
```

# PowerVSのLPARが複数ある場合
PowerVSのLPARが複数ある場合、lo interfaceへのIPアドレス定義を追加し、NATルールを追加することで、対応可能です。
この例では、PowerVSに192.168.150.216のLPARをもう1つ立て、NAT用アドレスとして、NAT用サブネット（192.168.82.64/26）の中から、192.168.82.71をNAT GW上に定義追加しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/76133521-afdf-1eb6-19e9-d64b956966ad.png)


```
# ip addr add 192.168.82.71/32 dev lo
# firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d 192.168.82.71 -j DNAT --to-destination 192.168.150.216
success
# firewall-cmd --reload
success
# firewall-cmd --direct --get-all-rules
ipv4 nat POSTROUTING 0 -o eth0 -j SNAT --to 192.168.82.70
ipv4 filter FWDO_public_allow 0 -m tcp -p tcp --dport 22 -j ACCEPT
ipv4 nat PREROUTING 0 -d 192.168.82.70 -j DNAT --to-destination 192.168.150.195
ipv4 nat PREROUTING 0 -d 192.168.82.71 -j DNAT --to-destination 192.168.150.216
# 
```


オンプレミスから192.168.82.70にアクセスした時と192.168.82.71にアクセスした時で、アクセス先AIXが異なっている。

```
# ssh -l root 192.168.82.70
Last login: Tue Jun 14 17:27:59 CDT 2022 on /dev/pts/1 from 192.168.82.70
*******************************************************************************
*                                                                             *
*                                                                             *
*  Welcome to AIX Version 7.2!                                                *
*                                                                             *
*                                                                             *
*  Please see the README file in /usr/lpp/bos for information pertinent to    *
*  this release of the AIX Operating System.                                  *
*                                                                             *
*                                                                             *
*******************************************************************************
# hostname
aix-tmgw01
# ifconfig en1
en1: flags=1e084863,814c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>
        inet 192.168.150.195 netmask 0xffffff00 broadcast 192.168.150.255
         tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1
# exit
Connection to 192.168.82.70 closed.
# ssh -l root 192.168.82.71
Last login: Tue Jun 14 17:02:57 CDT 2022 on /dev/pts/1 from 192.168.82.70
*******************************************************************************
*                                                                             *
*                                                                             *
*  Welcome to AIX Version 7.2!                                                *
*                                                                             *
*                                                                             *
*  Please see the README file in /usr/lpp/bos for information pertinent to    *
*  this release of the AIX Operating System.                                  *
*                                                                             *
*                                                                             *
*******************************************************************************
# hostname
aix-tmgw-02
# ifconfig en1
en1: flags=1e084863,814c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>
        inet 192.168.150.216 netmask 0xffffff00 broadcast 192.168.150.255
         tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1
# exit
Connection to 192.168.82.71 closed.
# 
```

以上です。