ACE で FTP 通信を負荷分散する場合、inspect ftp の設定を policy-map に設定するだけで実現可能です。
# 構成

# ACE 設定
ACE20/Admin# sh run Generating configuration.... hostname ACE20 boot system image:c6ace-t1k9-mz.A2_3_1.bin access-list all line 8 extended permit ip any any rserver host sv1 ip address 192.168.72.11 inservice rserver host sv2 ip address 192.168.72.12 inservice serverfarm host sf rserver sv1 inservice rserver sv2 inservice class-map match-all vip-ftp 2 match virtual-address 192.168.71.100 tcp eq ftp policy-map type loadbalance first-match lb class class-default serverfarm sf policy-map multi-match client-vips class vip-ftp loadbalance vip inservice loadbalance policy lb loadbalance vip icmp-reply inspect ftp access-group input all interface vlan 771 ip address 192.168.71.250 255.255.255.0 service-policy input client-vips no shutdown interface vlan 772 ip address 192.168.72.250 255.255.255.0 no shutdown |
設定自体は簡単なのですが、この 1 行があるとないとでは動作が大きく異なります。
以下、設定の有無でどのように違うのかを見ていきます。
## inspect ftp なし
# control connection

# data connection (active mode)

# client log
ftp> get tempfile local: tempfile remote: tempfile 200 PORT command successful. 425 Can't build data connection: Connection refused. ftp> |
# data connection (passive mode)

# client log
ftp> passive Passive mode on. ftp> get tempfile local: tempfile remote: tempfile 227 Entering Passive Mode (192,168,72,11,215,196) ftp: connect: Network is unreachable ftp> |
inspect ftp の設定を行わずに ftp command を実行しても、control connection を張ることは可能です。
しかし、file を download しようとすると、active/passive mode どちらを使用しても、error が発生し download に失敗してしまいます。 (active/passive mode については、FTP: active mode と passive mode について をご参照ください。)
ただし、error の内容と、capture の結果が active/passive mode で異なります。
active mode の場合、capture から syn/ack がなく RST されている (98行目 - 114行目) ことが確認できます。
passive mode の場合、syn packet すら送信されていません。
active mode が正常に動作しないのは、server から client に対して直接 data connection を張ろうとしているためです。 client は server から直接 syn packet を受信しても、routing table に server の network 情報がないため、server に syn/ack を返すことができません。 そのため、正常に connection を張れず、download に失敗しています。
passive mode が正常に動作しないのは、232 行目の 227 response の address に server の address が入っているためです。 active mode 同様、client の routing table に server の network 情報がないため、syn を送信できませんでした。
client:/# netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.71.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 !___ 192.168.71.0/24 network しか知らない。 client:/# |
つまり、ftp data connection を張る場合、loadbalancer において
- server から張られる data-connection の src address を vip address に変換
- 227 response 中の、server address を vip address に変換
という処理が必要になりますが、inspect ftp command を設定するだけで、data connection を監視し、この両方の処理を行ってくれます。
ftp inspection は ACE: Hardware architecture から見た L3/L4 と L7 の違い にも記載されているように、Xscale が処理を担当しています。
## inspect ftp あり
# control connection

control connection は inspect ftp command の有無にかかわらず動作するため、inspect ftp command がない場合と同様の capture 結果となります。
# data connection (active mode)

96 行目では、server(192.168.72.12) であった src address が 97 行目で vip address(192.168.71.100) に変換されています。
# data connection (passive mode)


136 行目の response arg では 192,168,72,12 であったものが 137 行目の response arg で 192,168,71,100 に変換されています。