インフラエンジニア向け、Citrix NetScaler VPX for AWS を使ってみる

2014.08.11

NetScalerとは、簡単にいうとロードバランサー(負荷分散装置)です。 詳細はここ参照。

  1. ロードバランサーを触ってみたいが、身近にVMware vSphere(ESXi)やXenServerなどのハイパーバイザーが無く、検証してみたい
  2. オンプレミスでロードバランサーを利用していて、クラウドでも同じものを利用したい

という方に参考になれば幸いです。

あまりお金をかけず、検証するため、以下の内容で実施しました。

  • NetScalerのライセンスは、Citrixの90日間の試用版ライセンスでテストします。
  • 通信試験用のEC2サーバは12ヶ月の無料枠で作成できます。
  • NetScalerは有料枠のEC2サーバ上にを作成する必要があります。

ここに参考になる資料はあるのですが、複数ハマった場所がありましたので、以後試す方の参考になればと思います。 Citrix NetScaler ベストプラクティクス

また、NetScalerのライセンス選択で、サポートに差異があるため注意が必要です。 上記資料から抜粋

・従量課金方式で構築した場合 Software および EC2 利用料を AWS へお支払いいただく方式です。 簡単に 始められるメリットがありますが、国内で Citrix のサポートは受けられませんのでご注意ください。 サポートは米国 Citrix の英語によるサポートです。
・BYOL (Bring Your Own License)方式の場合 Citrix Systems 社の代理店からライセンスを購入していただき、EC2 利用料のみを AWS へお支払いいただく方式です。 Software 利用料はかかりません。また、国内で Citrix のサポートが受けられます。
*AWS Marketplaceの表示だと、Customer Licenseと推測してます。
*弊社は代理店ではありませんので、サポートできません。

では早速、構築してみたいと思います。

■検証環境ネットワークの構築

AWSのアカウントを取得し、VPC(Amazon Virtual Private Cloud)に以下の構成を作成します。

構成図

kaji-netscaler-構成図

AWSのアカウントを作成。 http://aws.amazon.com/jp/register-flow/

VPCの作成には以下のこのサイトを参考にしてください。 通信検証用にサーバ2台構築し、apacheでWebサーバを構築しておきます。

ネットワークは3つ作っておきます。

kaji-netscaler_2014-08-05_18_00_48

■IAMでユーザ作成

NetScalerがAWS側で利用するユーザ「cns_ha」をIAMで作成します。

IAMとは

kaji-netscaler_2014-08-06_17_35_26 kaji-netscaler_2014-08-06_17_41_22

作成した後、Policyを追加します。 図の4つの項目を指定します。

kaji-netscaler_2014-08-06_17_46_55 kaji-netscaler_2014-08-06_17_49_46

 

■Security Groupの設定

NetScaler 管理用インターフェイスに指定するSecurity Group設定は以下の通信を許可しないと操作用GUIが表示できないため設定します。

以下の図はAWS Marketplaceに表示されている内容です。また、後で使うため、AMI-IDを確認しておきます。

kaji-netscaler_2014-08-06_21_22_56 kaji-netscaler_2014-08-06_21_24_32

■NetScaler試用版のライセンス取得

試用版ライセンスダウンロード http://www.citrix.co.jp/products/download.html

*My Citrixのアカウントも作成されるようです。

kaji-netscaler_2014-08-08_12_06_27kaji-netscaler_2014-08-08_12_07_44kaji-netscaler_2014-08-08_12_08_34

■AWS EC2 ToolのインストールとNetScalerの構築

あとでNetScalerをVPCへ構築する際に利用するため、手元のパソコンにAWS EC2 Toolのインストールを行います。 NetScalerのマニュアルの手順に含まれるため、行います。

Macを利用の方は、以下のページを参考にhomebrewをインストールしてから、EC2 Toolをインストールすると楽です。 https://dev.classmethod.jp/etc/modern-dev-environment-by-homebrew/

% brew install ec2-ami-tools ec2-api-tools
% vi .bash_profile

適時、お使いのPC環境に応じて編集してください。

# AWS Command Line Tools
export AWS_ACCESS_KEY="Your AWS Access ID"
export AWS_SECRET_KEY="Your AWS Secret Key"
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home/
export EC2_AMITOOL_HOME="/usr/local/Cellar/ec2-ami-tools/1.5.3/libexec"
export EC2_HOME="/usr/local/Cellar/ec2-api-tools/1.7.1.0/libexec"
export EC2_URL="https://ec2.ap-northeast-1.amazonaws.com"
export EC2_REGION="ap-northeast-1"

 

次にVPC上にNetScalerを構築します。 その際に、マニュアル通りに行ってもうまく動作しない点がありました。

(1)AMIの指定がマニュアルだとIDが古いため、最新のイメージのAMIを確認する必要がありました。→「ami-19c2ba18」のところ

(2)ドキュメントが古かったせいか、m1.large指定で記載があり、最新の条件を確認する必要がありました。→「m3.large」のところ AWS Marketplaceの情報を確認しましょう。

正常に動作したコマンド

$ ec2-run-instances ami-19c2ba18 -n 1 -t m3.large -a :0:subnet-72967405:"NSIP":10.0.21.11 -a :1:subnet-07917370:"CLIENT-SIDE":10.0.0.11::::10.0.0.12, -a :2:subnet-b49173c3:"SERVER-SIDE":10.0.11.11

「-a」の後は、 :「作成する ENI番号」:「所属する Subnet(環境に合わせて変更)」:「”ニックネーム”」:「IP アドレス」:::::「サブインターフェイスのIPアドレス」で3つ作ります。

正常作成時のログ

INSTANCE	<インスタンスID>	ami-19c2ba18		ip-10-0-21-11.ap-northeast-1.compute.internal	pending		0		m3.large	2014-08-09T03:19:19+0000	ap-northeast-1a			windows	monitoring-disabled		10.0.21.11	vpc-40b75e25	subnet-72967405	ebs					hvm	xen		sg-21679944	default	false
NIC	eni-9f2d9ce8	subnet-07917370	vpc-40b75e25	319981429384	in-use	10.0.0.11	ip-10-0-0-11.ap-northeast-1.compute.internal	true
NICATTACHMENT	eni-attach-26b9dc21	1	attaching	2014-08-09T12:19:19+0900	true
GROUP	sg-21679944	default
PRIVATEIPADDRESS	10.0.0.11	ip-10-0-0-11.ap-northeast-1.compute.internal
PRIVATEIPADDRESS	10.0.0.12	ip-10-0-0-12.ap-northeast-1.compute.internal
NIC	eni-9e2d9ce9	subnet-72967405	vpc-40b75e25	319981429384	in-use	10.0.21.11	ip-10-0-21-11.ap-northeast-1.compute.internal	true
NICATTACHMENT	eni-attach-25b9dc22	0	attaching	2014-08-09T12:19:19+0900	true
GROUP	sg-21679944	default
PRIVATEIPADDRESS	10.0.21.11	ip-10-0-21-11.ap-northeast-1.compute.interna
NIC	eni-9d2d9cea	subnet-b49173c3	vpc-40b75e25	319981429384	in-use	10.0.11.11	ip-10-0-11-11.ap-northeast-1.compute.internal	true
NICATTACHMENT	eni-attach-24b9dc23	2	attaching	2014-08-09T12:19:19+0900	true
GROUP	sg-21679944	default
PRIVATEIPADDRESS	10.0.11.11	ip-10-0-11-11.ap-northeast-1.compute.interna

■NetScalerに管理IPアドレス(NSIP)を外部からアクセスできるようにする。

作成されたインスタンスにSecurity Groupの設定し、作成したらタグをつけてわかりやすいようにしましょう。

kaji-netscaler_2014-08-08_12_29_32 kaji-netscaler_2014-08-08_12_41_10 kaji-netscaler_2014-08-08_12_41_34kaji-netscaler_2014-08-08_12_47_34

Elastic IPを追加し、割当。Network Interfaceでタグをつけていないと、名前は表示されません。

kaji-netscaler_2014-08-08_12_48_23 kaji-netscaler_2014-08-08_12_48_58 kaji-netscaler_2014-08-08_12_51_05

■NetScalerにログインしてライセンス発行するためにホストIDを確認

NetScalerにsshでログインし、ライセンス用のhost IDを取得する。 初期パスワードはアプライアンス機とはことなり、AWS上のインスタンスIDとなります。

kaji-netscaler_2014-08-08_14_24_58

sshでログインできたら、shellモードに変更し、以下のコマンドでhost IDを確認

> shell
Copyright (c) 1992-2008 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
	The Regents of the University of California. All rights reserved.

root@ns# lmutil lmhostid -ether
lmutil - Copyright (c) 1989-2007 Macrovision Europe Ltd. and/or Macrovision Corporation. All Rights Reserved.
The FLEXnet host ID of this machine is "xxxxxxxxxxxx"

ライセンスを適応するため、「My Citrix」のサイトで試用版ライセンスにホストIDを関連づけし、ダウンロードしたライセンスファイルをNetScalerにアップロード

kaji-netscaler_2014-08-08_12_15_15 kaji-netscaler_2014-08-08_14_38_00 kaji-netscaler_2014-08-08_14_39_36 kaji-netscaler_2014-08-08_14_48_18 kaji-netscaler_2014-08-08_14_48_58 kaji-netscaler_2014-08-08_14_50_19 kaji-netscaler_2014-08-08_14_50_40

ライセンスのインストール

ここからはNetScalerの設定に入ります。ブラウザでNetScalerの管理IPへアクセスし、ライセンスを適応

文末のConfigを環境に合わせて修正した後、NetScalerへリストアすると設定する手間が省けます。

kaji-netscaler_2014-08-08_14_54_57kaji-netscaler_2014-08-08_14_55_16

■機能選択

System > Setting

Config mode

kaji-netscaler_2014-08-09_15_00_19

Config basic features

kaji-netscaler_2014-08-09_15_00_20

■IPアドレスとインターフェイスの機能選択

System > Network > IPs > IPV4s

クライアント側(インターネット側)のインターフェイスをVirtual IP(VIP)を選択しIPアドレスを設定します。 サーバ側のインターフェイスをSubnet IP(SIP)を選択しIPアドレスを設定します。 *クライアント側を謝って、Subnet IPにして変更できなく、再度構築しなおしました。ホストIDが変更ため、ライセンス紐付けを再度やり直しました。

kaji-netscaler_2014-08-09_12_58_22kaji-netscaler 2014-08-09 12.57.52

■Policy Base Routingを設定

デフォルトでデフォルトゲートウェイが管理用IPアドレスのルータに向いていました。 クライアント側インターフェイスから来た通信をクライアント側のルータで通信するようにするため、Policy Base Routing(PBRs)を設定します。 Macアドレス指定と、IPアドレスで指定する2種類つかえるそうですが、今回はIPアドレスで指定しました。

kaji-netscaler 2014-08-08 15.36.07

*Source MACは自動入力されたもので、設定しません。Next hopはAWS側のルーターのIPアドレスはx.x.x.1で指定。

■負荷分散設定

Traffic Management > Load Balancing > Servers

構築したEC2のサーバのプライベートIPアドレスを登録 通信できていればStateが緑になります。

kaji-netscaler_2014-08-09_12_59_15 kaji-netscaler_2014-08-09_12_59_44

Traffic Management > Load Balancing > Services

構築したEC2のサーバのプライベートIPアドレスとwebサーバのポート番号を登録。2週類のサービス(tcp=80と8080)を構築してみました。 通信できていればStateが緑になります。

kaji-netscaler 2014-08-09 13.07.32

kaji-netscaler_2014-08-10_1_53_48

Traffic Management > Load Balancing > Virtual Servers

クライアント側(インターネット側)のローカルIPアドレスを設定し、先ほど作成した負荷分散したいServiceを選択します。 負荷分散方式の変更などもここでおこないます。詳細はNetScalerのマニュアルを参照ください。 今回は2つ作成し、2つのアドレスでhttp公開する設定を行いました。

kaji-netscaler 2014-08-09 15.28.08 kaji-netscaler_2014-08-10_1_54_23

■最後に上記で作成したローカルアドレスとAWS Elastic IP アドレスを紐付け設定

kaji-netscaler_2014-08-10_1_55_55

■外部からアクセス確認

httpdをダウンさせたりして、切り替わりを確認できます。

kaji-netscaler_2014-08-10_1_59_58

■NetScalerのコンフィグ

#NS10.1 Build 124.1308.e
# Last modified by `save config`, Sat Aug  9 16:54:41 2014
set ns config -IPAddress 10.0.21.11 -netmask 255.255.255.0
enable ns feature LB SSL
enable ns mode FR L3 USNIP PMTUD
set system parameter -natPcbForceFlushLimit 4294967295
set system user nsroot hogehoge -encrypted
set rsskeytype -rsstype ASYMMETRIC
set lacp -sysPriority 32768 -mac 06:26:e8:9a:dc:08
set interface 1/1 -throughput 0 -bandwidthHigh 0 -bandwidthNormal 0 -intftype "Xen Virtual" -ifnum 1/1
set interface 1/2 -throughput 0 -bandwidthHigh 0 -bandwidthNormal 0 -intftype "Xen Virtual" -ifnum 1/2
set interface 1/3 -throughput 0 -bandwidthHigh 0 -bandwidthNormal 0 -intftype "Xen Virtual" -ifnum 1/3
set interface LO/1 -haMonitor OFF -throughput 0 -bandwidthHigh 0 -bandwidthNormal 0 -intftype Loopback -ifnum LO/1
add ns ip6 fe80::426:e8ff:fe9a:dc08/64 -scope link-local -type NSIP -vlan 1 -vServer DISABLED -mgmtAccess ENABLED -dynamicRouting ENABLED
add ns ip 10.0.11.11 255.255.255.0 -vServer DISABLED -telnet DISABLED -ftp DISABLED -gui DISABLED -snmp DISABLED -mgmtAccess ENABLED
add ns ip 10.0.0.11 255.255.255.0 -type VIP -mgmtAccess ENABLED
set ipsec parameter -lifetime 28800
set nd6RAvariables -vlan 1
bind nd6RAvariables -vlan 1 -ipv6Prefix ::
set ipv6 -natprefix ::
set snmp alarm SYNFLOOD -timeout 1
set snmp alarm HA-VERSION-MISMATCH -time 86400 -timeout 86400
set snmp alarm HA-SYNC-FAILURE -time 86400 -timeout 86400
set snmp alarm HA-NO-HEARTBEATS -time 86400 -timeout 86400
set snmp alarm HA-BAD-SECONDARY-STATE -time 86400 -timeout 86400
set snmp alarm HA-PROP-FAILURE -timeout 86400
set snmp alarm IP-CONFLICT -timeout 86400
set snmp alarm APPFW-START-URL -timeout 1
set snmp alarm APPFW-DENY-URL -timeout 1
set snmp alarm APPFW-REFERER-HEADER -timeout 1
set snmp alarm APPFW-CSRF-TAG -timeout 1
set snmp alarm APPFW-COOKIE -timeout 1
set snmp alarm APPFW-FIELD-CONSISTENCY -timeout 1
set snmp alarm APPFW-BUFFER-OVERFLOW -timeout 1
set snmp alarm APPFW-FIELD-FORMAT -timeout 1
set snmp alarm APPFW-SAFE-COMMERCE -timeout 1
set snmp alarm APPFW-SAFE-OBJECT -timeout 1
set snmp alarm APPFW-POLICY-HIT -timeout 1
set snmp alarm APPFW-VIOLATIONS-TYPE -timeout 1
set snmp alarm APPFW-XSS -timeout 1
set snmp alarm APPFW-XML-XSS -timeout 1
set snmp alarm APPFW-SQL -timeout 1
set snmp alarm APPFW-XML-SQL -timeout 1
set snmp alarm APPFW-XML-ATTACHMENT -timeout 1
set snmp alarm APPFW-XML-DOS -timeout 1
set snmp alarm APPFW-XML-VALIDATION -timeout 1
set snmp alarm APPFW-XML-WSI -timeout 1
set snmp alarm APPFW-XML-SCHEMA-COMPILE -timeout 1
set snmp alarm APPFW-XML-SOAP-FAULT -timeout 1
set snmp alarm DNSKEY-EXPIRY -timeout 1
set snmp alarm HA-LICENSE-MISMATCH -timeout 86400
set snmp alarm CLUSTER-NODE-HEALTH -time 86400 -timeout 86400
set snmp alarm CLUSTER-NODE-QUORUM -time 86400 -timeout 86400
set snmp alarm CLUSTER-VERSION-MISMATCH -time 86400 -timeout 86400
add server Web1 10.0.11.84
add server Web2 10.0.11.85
add service Web1-80 Web1 HTTP 80 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CustomServerID "\"None\"" -CKA NO -TCPB NO -CMP NO
add service Web2-80 Web2 HTTP 80 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CustomServerID "\"None\"" -CKA NO -TCPB NO -CMP NO
add service Web1-8080 Web1 HTTP 8080 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CustomServerID "\"None\"" -CKA NO -TCPB NO -CMP NO
add service Web2-8080 Web2 HTTP 8080 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CustomServerID "\"None\"" -CKA NO -TCPB NO -CMP NO
add ssl certKey ns-server-certificate -cert ns-server.cert -key ns-server.key
bind cmp global ns_adv_nocmp_xml_ie -priority 8700 -gotoPriorityExpression END -type RES_DEFAULT
bind cmp global ns_adv_nocmp_mozilla_47 -priority 8800 -gotoPriorityExpression END -type RES_DEFAULT
bind cmp global ns_adv_cmp_mscss -priority 8900 -gotoPriorityExpression END -type RES_DEFAULT
bind cmp global ns_adv_cmp_msapp -priority 9000 -gotoPriorityExpression END -type RES_DEFAULT
bind cmp global ns_adv_cmp_content_type -priority 10000 -gotoPriorityExpression END -type RES_DEFAULT
set lb parameter -sessionsThreshold 150000
add lb vserver Web HTTP 10.0.0.11 80 -persistenceType NONE -cltTimeout 180
add lb vserver Web2 HTTP 10.0.0.12 80 -persistenceType NONE -cltTimeout 180
set cache parameter -via "NS-CACHE-10.0:  11"
set aaa parameter -maxAAAUsers 5
set ns rpcNode 10.0.21.11 -password 8a7b474124957776a0cd31b862cbe4d72b5cbd59868a136d4bdeb56cf03b28 -encrypted -srcIP *
set responder param -undefAction NOOP
add ca action NOOP_CA -type noop
bind lb vserver Web Web1-80
bind lb vserver Web Web2-80
bind lb vserver Web2 Web1-8080
bind lb vserver Web2 Web2-8080
set ns diameter -identity netscaler.com -realm com
set dns parameter -dns64Timeout 1000
add dns nsRec . a.root-servers.net -TTL 3600000
add dns nsRec . b.root-servers.net -TTL 3600000
add dns nsRec . c.root-servers.net -TTL 3600000
add dns nsRec . d.root-servers.net -TTL 3600000
add dns nsRec . e.root-servers.net -TTL 3600000
add dns nsRec . f.root-servers.net -TTL 3600000
add dns nsRec . g.root-servers.net -TTL 3600000
add dns nsRec . h.root-servers.net -TTL 3600000
add dns nsRec . i.root-servers.net -TTL 3600000
add dns nsRec . j.root-servers.net -TTL 3600000
add dns nsRec . k.root-servers.net -TTL 3600000
add dns nsRec . l.root-servers.net -TTL 3600000
add dns nsRec . m.root-servers.net -TTL 3600000
add dns addRec l.root-servers.net 199.7.83.42 -TTL 3600000
add dns addRec b.root-servers.net 192.228.79.201 -TTL 3600000
add dns addRec d.root-servers.net 199.7.91.13 -TTL 3600000
add dns addRec j.root-servers.net 192.58.128.30 -TTL 3600000
add dns addRec h.root-servers.net 128.63.2.53 -TTL 3600000
add dns addRec f.root-servers.net 192.5.5.241 -TTL 3600000
add dns addRec k.root-servers.net 193.0.14.129 -TTL 3600000
add dns addRec a.root-servers.net 198.41.0.4 -TTL 3600000
add dns addRec c.root-servers.net 192.33.4.12 -TTL 3600000
add dns addRec m.root-servers.net 202.12.27.33 -TTL 3600000
add dns addRec i.root-servers.net 192.36.148.17 -TTL 3600000
add dns addRec g.root-servers.net 192.112.36.4 -TTL 3600000
add dns addRec e.root-servers.net 192.203.230.10 -TTL 3600000
set lb monitor ldns-dns LDNS-DNS -query . -queryType Address
bind service Web2-8080 -monitorName http
bind service Web1-8080 -monitorName http
bind service Web2-80 -monitorName http
bind service Web1-80 -monitorName http
add route 0.0.0.0 0.0.0.0 10.0.21.1
set ssl service nshttps-10.0.11.11-443 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED
set ssl service nsrpcs-10.0.11.11-3008 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED
set ssl service nshttps-::1l-443 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED
set ssl service nsrpcs-::1l-3008 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED
set ssl service nskrpcs-127.0.0.1-3009 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED
set ssl service nshttps-127.0.0.1-443 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED
set ssl service nsrpcs-127.0.0.1-3008 -eRSA ENABLED -sessReuse DISABLED -tls11 DISABLED -tls12 DISABLED
set vpn parameter -forceCleanup none -clientOptions all -clientConfiguration all
add ns pbr ClientAccessRoute ALLOW -srcIP = 10.0.0.11-10.0.0.12 -nextHop 10.0.0.1 -priority 10 -kernelstate SFAPPLIED61
apply ns pbrs
bind ssl service nshttps-10.0.11.11-443 -certkeyName ns-server-certificate
bind ssl service nsrpcs-10.0.11.11-3008 -certkeyName ns-server-certificate
bind ssl service nshttps-::1l-443 -certkeyName ns-server-certificate
bind ssl service nsrpcs-::1l-3008 -certkeyName ns-server-certificate
bind ssl service nskrpcs-127.0.0.1-3009 -certkeyName ns-server-certificate
bind ssl service nshttps-127.0.0.1-443 -certkeyName ns-server-certificate
bind ssl service nsrpcs-127.0.0.1-3008 -certkeyName ns-server-certificate
set ns encryptionParams -method AES256 -keyValue ff0e316156e6153bd08b7ebf2da8f9bd2068a641828e615c1bcdd74dae2d560b88b3f54002de1921b927d576f12c538b58e712b8 -encrypted
set inatparam -nat46v6Prefix ::/96
set ip6TunnelParam -srcIP ::
set ptp -state ENABLE
 Done