1. はじめに
インターネットからのアクセス時にVNFを経由してパケットチェックの後に、ターゲットのサーバーにアクセスさせたいので、その構成を実装した。ただし、インターネットからのingress routeはIBM Cloud上ではまだ稼働していないため、別の実装で対応する必要がある。
2. アーキテクチャー図
ALBを途中経路に介在させることも考えたが、ALBには
- ALB自体のメンテナンスやシステム負荷に応じてIPアドレスが変更される(ALBにはFQDNを利用したアクセスが必要)
- idle connection timeoutが存在する。
- VNFに到達する前に、クライアントのIPがALBのIPに置き換えられてしまう。VNFから見たパケットのSource IPはALBのprivate IP(reserved IP)である。
などの仕様もあり、VNFの前段に配置した場合にあまり効果が得られないケースもあると思われる。そこで、今回は以下のような構成を考えた。
- それぞれのターゲットサーバーにPort 80/443でサービスを公開したいので、それぞれのターゲットサーバーごとにNLBを用意する。
- NLBはSource IPを維持する。そのため、NLBにて80/443で受信したパケットをそのまま80/443でVNFに転送すると、Source IP/Destination IP(=VNFのIP)/Portのどれを使っても、どのターゲットサーバーに転送すれば良いかをVNFは判断できない。そのため、どのNLBから受け取ったパケットなのかを区別できるように、今回はNLBで構成するBackend poolのポートは以下のような命名規則に従うように構成した。
- 10.4.0.08:80 に転送するためのポート: 8008
- 10.4.0.09:80 に転送するためのポート: 8009
- 10.4.0.10:80 に転送するためのポート: 8010
- 10.4.0.08:443 に転送するためのポート: 44308
- 10.4.0.09:443 に転送するためのポート: 44309
- 10.4.0.10:443 に転送するためのポート: 44310
もちろん、ingress routeを使っていないため、以下のような問題もある。
- ターゲットサーバーごとにNLBが必要。
- ICMPに対応していない(NLBがICMPに対応しないので)。
- 全てのポートに汎用的に対応させるのはできない。今回の例ではポート80とポート443のみであり、そのポートごとに設定を行っている。
- ターゲットサーバーごとにNATするのではなく、ターゲットサーバー&ポートごとにVNFでNATを実行する必要があるので、公開ポートが増えるとより多くのNAT設定が必要となる。
- ターゲットサーバーやサービス(ポート)が増えるたびに、それに応じてVNFにてインターネット側からのポートをあける必要があり(今回の例では8008-80010や、44308-44310)、Well knownポートではないとはいえあまり好ましくない
3. Webサーバーのセットアップとテスト
Webサーバーのセットアップ方法は省略。VPC内部の踏み台サーバーからのHTTP/HTTPSのテスト結果は以下の通り。
[root@new-syasuda-tok1-vpc1 ~]# curl http://10.4.0.8
This is testweb1
[root@new-syasuda-tok1-vpc1 ~]# curl -k https://10.4.0.8
This is testweb1
[root@new-syasuda-tok1-vpc1 ~]# curl -vvv https://10.4.0.8 2>&1 | grep CN
* subject: CN=syasuda-testweb1,O=IBM,L=Default City,C=JP
* issuer: CN=syasuda-testweb1,O=IBM,L=Default City,C=JP
[root@new-syasuda-tok1-vpc1 ~]# curl http://10.4.0.9
This is testweb2
[root@new-syasuda-tok1-vpc1 ~]# curl -k https://10.4.0.9
This is testweb2
[root@new-syasuda-tok1-vpc1 ~]# curl -vvv https://10.4.0.9 2>&1 | grep CN
* subject: CN=syasuda-testweb2,O=IBM,L=Default City,C=JP
* issuer: CN=syasuda-testweb2,O=IBM,L=Default City,C=JP
[root@new-syasuda-tok1-vpc1 ~]# curl http://10.4.0.10
This is testweb3
[root@new-syasuda-tok1-vpc1 ~]# curl -k https://10.4.0.10
This is testweb3
[root@new-syasuda-tok1-vpc1 ~]# curl -vvv https://10.4.0.10 2>&1 | grep CN
* subject: CN=syasuda-testhttp3,O=IBM,L=Default City,C=JP
* issuer: CN=syasuda-testhttp3,O=IBM,L=Default City,C=JP
4. Security Groupの設定
登場人物として、NLB、VNF、Webサーバーの3つ存在するため、それぞれにSecurity Groupを構成する必要がある。
- NLB: port 80/443でCustomer Siteからからのアクセスを許可する必要がある。。
- VNF: port 8008-8010および44308-44310でCustomer Siteからのアクセスを許可する必要がある。(NLBはSource IPを変更せずにパケットを割り振るため)
- Webサーバー: port 80/443でVNFからのアクセスを許可する必要がある。
5. VNFにおけるiptables設定
[root@syasuda-testvnf1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@syasuda-testvnf1 ~]# iptables -t nat -A PREROUTING -p tcp --dport 8008 -j DNAT --to-destination 10.4.0.8:80
[root@syasuda-testvnf1 ~]# iptables -t nat -A PREROUTING -p tcp --dport 8009 -j DNAT --to-destination 10.4.0.9:80
[root@syasuda-testvnf1 ~]# iptables -t nat -A PREROUTING -p tcp --dport 8010 -j DNAT --to-destination 10.4.0.10:80
[root@syasuda-testvnf1 ~]# iptables -t nat -A PREROUTING -p tcp --dport 44308 -j DNAT --to-destination 10.4.0.8:443
[root@syasuda-testvnf1 ~]# iptables -t nat -A PREROUTING -p tcp --dport 44309 -j DNAT --to-destination 10.4.0.9:443
[root@syasuda-testvnf1 ~]# iptables -t nat -A PREROUTING -p tcp --dport 44310 -j DNAT --to-destination 10.4.0.10:443
[root@syasuda-testvnf1 ~]# iptables -t nat -A POSTROUTING -j MASQUERADE
[root@syasuda-testvnf1 ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8008 to:10.4.0.8:80
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8009 to:10.4.0.9:80
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8010 to:10.4.0.10:80
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:44308 to:10.4.0.8:443
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:44309 to:10.4.0.9:443
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:44310 to:10.4.0.10:443
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
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0
同様に2台目のVNFにも設定する。
6. NLB設定
以下に、VSI1(10.4.0.8)のためのNLBの構成を記載する。
VSI2(10.4.0.9)やVSI3(10.4.0.10)のためには、それぞれに別のNLBを購入して同様に構成する。
6-1. NLB1: Listner
6-2. NLB1: Backend Pool for Port 80
ヘルスチェックはTCPで実施
Port 8008でVNFを登録する。
6-3. NLB1: Backend Pool for Port 443
ヘルスチェックはTCPで実施
Port 44308でVNFを登録する。
6-4. NLB2の構成(抜粋)
6-5. NLB3の構成(抜粋)
7. クライアント(VPC外部)からのテスト
syasuda@MacBook ~ % curl http://<NLB1のIP address>
This is testweb1
syasuda@MacBook ~ % curl -k https://<NLB1のIP address>
This is testweb1
syasuda@MacBook ~ % curl http://<NLB2のIP address>
This is testweb2
syasuda@MacBook ~ % curl -k https://<NLB2のIP address>
This is testweb2
syasuda@MacBook ~ % curl http://<NLB3のIP address>
This is testweb3
syasuda@MacBook ~ % curl -k https://<NLB3のIP address>
This is testweb3