VPN for VPC(Site-to-Siteタイプ)でIBM Cloud環境に接続した後、さらに別の環境にアクセスしたいことがあります。
今回は、PowerVSにアクセスするケースを想定しています。
Direct LinkでIBM Cloudに接続した時の構成はこちらの記事に書きましたが、今回はVPN接続編です。
オンプレミスから最終的な接続先(PowerVS)に直接は行けない(それらへのルーティング情報はオンプレには広告されない)ので、VPCのVSIで、NATを行います。
オンプレ側で宛先に指定するIPアドレスは、VPCでユーザーが定義可能なセグメントから払い出されたものなので、オンプレ側とのIP重複を避けられます。
(この記事ではNAT定義周りにフォーカスし、オンプレミスとVPC間のIPsec接続と、x86とPowerVS間のCloud Connections[またはDL2.0]は事前に構成済みとします)
NAT GW用のVSIを作成
実際のNAT処理はVSIで行いますので、オーダーします。今回はCentOS 7.xで立てました。
NAT用サブネットを作成
NAT用IPアドレスとして使うためのサブネットを作成します。この例では、192.168.82.64/26としました。
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にルーティングされるようになりました。
NAT GW設定
NAT GW用VSIがNATを行えるよう設定します。
まず、VSIのネットワーク・インターフェース定義で、「IP スプーフィングを許可」を有効にします。
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にアクセスできます。
# 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
# 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から来ています。
# 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
# # 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上に定義追加しています。
# 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.
#
以上です。