オンプレミスからPower Systems Virtual Server(Power VS)に接続する際、VPNルータ等を置くことなく、なるべく簡易に繋ぎたい、という要件が時々あります。
Power VSに標準で払い出されるExternal IPも利用可能ですが、Power VSサービス側の共有Firewallを通るため、使えるポートが決まっていて個別のFirewallルールを設定できない等、制約があります。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-network-security
x86に配置した仮想サーバーでDNAT+SNATする事で、端末 -> (インターネット)-> x86サーバー -> (Direct Link Connect) -> Power VS の経路で通信できる事を確認しました。
この方法だと、x86仮想サーバーのSecurity Groups(無償のL4 Firewall機能)もかけられるので、クイックに繋ぎたい時には悪くない選択肢と言えるかもしれません。
下記が問題ない事が条件となります。
・プロトコルとしてNAT変換がOKである事。
・VPNを使わないので、通信がそのままインターネットを通る事。(プロトコルとして暗号化されているなら許容可能と考えます(下記の例では検証なのでhttpを使いましたが...))
事前準備
・x86仮想サーバーとPower VSをオーダーします。OSに直接パブリックIPが付いていた方がNAT設定しやすいと考え、x86はClassic環境にしました。
・x86とPower VSの間のDirect Linkは接続済みとします。手順は下記の項番2です。
https://qiita.com/y_tama/items/eb8d6e3d54197a569e25
x86からPower VSは疎通している事を確認
今回はhttpで試すので、Power VS上のAIXにWebサーバーを立てました。
まずはx86から通信できることを確認します。
# curl http://192.168.150.195
This is AIX web server.
#
x86仮想サーバーでNAT設定
(下記のコマンドだと、OS再起動すると設定が消えますので、適宜、永続化してください)
まず、パケット転送を有効化します。
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
#
x86サーバーのパブリックIPアドレスに来たport 80の通信を、Power VSのIPアドレスにDNATします。
iptables -t nat -A PREROUTING -p tcp -d 161.202.xx.xx --dport 80 -j DNAT --to-destination 192.168.150.195:80
また、Power VSからの戻りのパケットが戻れるよう、x86サーバーのプライベートアドレスにSNATしてPower VSに送ります。
iptables -t nat -A POSTROUTING -p tcp -d 192.168.150.195 --dport 80 -j SNAT --to-source 10.129.177.42
iptables内容の確認。
# sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere tamavsi03.IBM.cloud tcp dpt:http to:192.168.150.195:80
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT tcp -- anywhere 192.168.150.195 tcp dpt:http to:10.129.177.42
#
x86サーバーのSecurity Groups設定
port 80のインバウンドを許可します。下記では設定していませんが、Sourceに、クライアント端末に割り振られるグローバルIPのアドレス範囲を設定すれば、接続元を制限できます。
オンプレミスの端末のブラウザから、x86仮想サーバーのグローバルIPアドレスを指定すると、AIXのwebサーバーが応答するようになりました。