Direct Link2.0から入ってきた通信に対しVPCでNATを行う

# はじめに
Direct Link2.0でIBM Cloud環境に接続した後、さらに別の環境にアクセスしたいことがあります。
例えば、Power VSや、Transit Gateway経由で別アカウントにある環境にアクセスするケースを想定しています。

オンプレミスから最終的な接続先（Power VSや、アカウント2のClassic環境）に直接は行けない（それらへのルーティング情報はオンプレには広告されない）ので、アカウント1のVPCで、NATを行います。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/58ccb892-335d-554b-32d2-ba7ca4a099d1.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/598673e9-e2ad-655d-c542-1e3dfe2eeb2f.png)

# NAT用サブネットを作成

NAT用IPアドレスとして使うためのサブネットを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/4cf5ae7f-a21e-5c9e-1d18-29ca0a554c9f.png)


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

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

今回は、「オンプレからDirect Link経由で入って来てTransit Gatewayに抜けていく通信（とその戻りの通信）」「オンプレからDirect Link経由で入って来てPower VS用のDirect Linkに抜けていく通信（とその戻りの通信）」を制御したいので、トラフィック・タイプはIngress、トラフィック・ソースはDirect LinkとTransit Gatewayを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/21548f96-f86b-d802-0ba2-076636be89dc.png)


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/2acfe9cb-464e-6ae5-ec13-fe72122976e1.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に定義します。
前の手順のルーティング・テーブルの設定により、172.16.50.96/27宛のパケットはこのVSIにルーティングされて来ますので、それを受けられるように、この範囲のIPを付けます。今回は172.16.50.100を付与します。

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

firewalldをenable/startします。

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

Destination NAT先として、まずはPower VSに立てたAIXのIP（192.168.150.195）を指定します。（x86とPower VS間のDL2.0は事前に構成済みとします）
AIXからの戻りパケットが戻ってこられるよう、Source NATも設定します。

```
# firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d 172.16.50.100 -j DNAT --to-destination 192.168.150.195
success
# firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j SNAT --to 172.16.50.100
success
# firewall-cmd --reload
success
# 
```

```:設定内容確認
# firewall-cmd --direct --get-all-rules
ipv4 nat PREROUTING 0 -d 172.16.50.100 -j DNAT --to-destination 192.168.150.195
ipv4 nat POSTROUTING 0 -o eth0 -j SNAT --to 172.16.50.100
# 
```


# アクセス確認

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

```:オンプレ側からNAT用IPにアクセス
# ssh -l root 172.16.50.100 -i ./.ssh/id_key    
14362 unsuccessful login attempts since last login.
Last unsuccessful login: Fri Oct  8 01:27:49 CDT 2021 on ssh from 121.125.73.25
Last login: Tue Oct  5 10:26:58 CDT 2021 on /dev/pts/2 from 172.16.50.100
*******************************************************************************
*                                                                             *
*                                                                             *
*  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.                                  *
*                                                                             *
*                                                                             *
*******************************************************************************
# ifconfig -a
（略）
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

```

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

```:オンプレから172.16.50.100にpingしている時のAIX上のtcpdump
# tcpdump -i 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
01:31:57.524877 IP 172.16.50.100 > 192.168.150.195: ICMP echo request, id 268, seq 0, length 64
01:31:57.524900 IP 192.168.150.195 > 172.16.50.100: ICMP echo reply, id 268, seq 0, length 64
01:31:58.511213 IP 172.16.50.100 > 192.168.150.195: ICMP echo request, id 268, seq 1, length 64
01:31:58.511236 IP 192.168.150.195 > 172.16.50.100: ICMP echo reply, id 268, seq 1, length 64
```

# Transit Gateway経由で別アカウントのClassic環境と接続
Transit Gateway経由で別アカウント（冒頭の図のアカウント2）にあるサーバー宛の通信も、同様に設定できます。
事前にアカウント2側でTransit Gatewayを作成し、アカウント1のVPCと接続しておきます。あとは上記と同様のNAT設定で、オンプレ -> アカウント1のVPCでNAT -> アカウント2のClassic　の通信が実現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/b8589f38-ffe0-37ce-74e7-a431af95b840.png)


以上です。