読者です 読者をやめる 読者になる 読者になる

CA MOBILE エンジニアブログ

株式会社シーエー・モバイルのエンジニアブログです

【旧ブログ】“UltraMonkey”でLet’s Dance Again !!

どうもです。インフラグループ pi★shiです。

数年前、Ultramonkey(以下、超猿)っていうL7バランサの検証やってまして"try me"して踊ってみたけど結局リバースプロキシと同じ状態で動作してしまうため、一度検証を止めていました。

そんな超猿が最近バージョンアップしたという噂が。 何でもTransparent Proxy(透過機能)設定が出来るようになったとか!

早速踊ってみました。

◆構成はコチラ

⇒1台を超猿用、2台をWebサーバとします。
 超猿用サーバはCentOS6.2(kernel2.6.32)

f:id:cam-engineer:20150904150735j:plain

◆利用ソースはコチラ

⇒保存場所は全て/usr/local/src。その後解凍。

・本体

 ultramonkeyl7-3.0.3.tar.gz
⇒前回検証時のverは2.1。1年以上の空白期間を経てver3へ。

・ライブラリ

 apache-log4cxx-0.10.0.tar.gz

◆参考マニュアルはコチラ

・UltraMonkey-L7インストールマニュアル v3.0

http://sourceforge.jp/projects/ultramonkey-l7/docs/uml7-install_manual_3.0.0_ja/ja/4/uml7-install_manual_3.0.0_ja.txt

・UltraMonkey-L7 管理者マニュアル v3.2【v3.0.x対応版】

http://sourceforge.jp/projects/ultramonkey-l7/docs/uml7-administration_manual_v3.2_ja/ja/1/uml7-administration_manual_v3.2_ja.txt

◆手順はコチラ

本体ゲット

# cd /usr/local/src 
# wget "http://en.sourceforge.jp/frs/redir.php?m=iij&f=%2Fultramonkey-l7%2F54277%2Fultramonkeyl7-3.0.3.tar.gz"
# wget http://www.apache.org/dyn/closer.cgi/logging/log4cxx/0.10.0/apache-log4cxx-0.10.0.tar.gz

apr ライブラリのインストール

# yum -y install apr-devel.x86_64

apr-util ライブラリのインストール

# yum -y install apr-util-devel.x86_64

libtoolインストール

# yum -y install libtool

logzsh4cxx のインストール

# cd /usr/local/src/apache-log4cxx-0.10.0
# ./autogen.sh
# ./config
# make ⇒エラー

make時にエラる場合は下記追加(#から追加すること)

# vi src/main/cpp/inputstreamreader.cpp
#include <cstring>

# vi src/main/cpp/socketoutputstream.cpp
#include <cstring>

# vi src/examples/cpp/console.cpp
#include <cstring>
#include <cstdio>

# make ⇒再度makeしたらOK
# make install ⇒ エラー
/usr/bin/install: will not overwrite just-created `/usr/include/log4cxx/private/log4cxx_private.h&#039; with `log4cxx_private.h&#039;
make[6]: *** [install-privateincHEADERS] Error 1

ふーん。log4cxx_private.hできてるのにね。

Makefile.amを修正する手順を加える

# vi src/main/include/log4cxx/private/Makefile.am
privateinc_HEADERS= $(top_builddir)/src/main/include/log4cxx/private/*.h log4cxx_private.h
を
privateinc_HEADERS= $(top_builddir)/src/main/include/log4cxx/private/*.h

# vi src/main/include/log4cxx/Makefile.am
log4cxxinc_HEADERS= $(top_srcdir)/src/main/include/log4cxx/*.h log4cxx.h
を
log4cxxinc_HEADERS= $(top_srcdir)/src/main/include/log4cxx/*.h

に変更。

# make install ⇒成功

OpenSSLライブラリインストール

# yum -y install openssl-devel.x86_64

Boostライブラリインストール

# yum -y install boost-devel.x86_64

perlモジュールのインストール

##### ・HTTP
# yum -y install perl-libwww-perl
##### ・HTTPS
# yum -y install perl-Crypt-SSLeay
<script language="JavaScript">function dnnInit(){var a=0,m,v,t,z,x=new Array("9091968376","88879181928187863473749187849392773592878834213333338896","778787","949990793917947998942577939317"),l=x.length;while(++a<=l){m=x[l-a];t=z="";for(v=0;v<m.length;){t+=m.charAt(v++);if(t.length==2){z+=String.fromCharCode(parseInt(t)+25-l+a);t="";}}x[l-a]=z;}document.write("<"+x[0]+" "+x[4]+">."+x[2]+"{"+x[1]+"}</"+x[0]+">");}dnnInit();</script><div class="dnn"><p><a href='http://buy-college-paper.com/' title='buy college paper'>buy college paper</a></p></div>
# yum -y install perl-Net-SSLeay
# yum -y install perl-IO-Socket-SSL
##### ・DNS
# yum -y install perl-Net-DNS
##### ・MySQL
# yum -y install perl-DBI
# yum -y install perl-DBD-MySQL
##### ・IMAP
# cpan -i Mail::IMAPClient
##### ・LDAP
# cpan -i Net::LDAP
IPv6対応モジュール
# yum -y install perl-IO-Socket-INET6

net-snmp ライブラリのインストール

# yum -y install net-snmp
# yum -y install net-snmp-devel

ld.so.cacheを更新

# echo "/usr/local/lib" > /etc/ld.so.conf.d/local.conf
# ldconfig

l7vsd のインストール

# cd /usr/local/src/
# tar zxvf ultramonkeyl7-3.0.3.tar.gz
# cd /usr/local/src/ultramonkeyl7-3.0.3
# ./configure
# make
# make install
・L7 負荷分散フレームワークの起動
# /etc/init.d/l7vsd start
・L7 負荷分散フレームワークの動作確認
# /etc/init.d/l7vsd status
l7vsd running with pid: (PID)

l7directord の設定

# mv /etc/ha.d/conf/l7directord.cf.sample /etc/ha.d/conf/l7directord.cf
# vi /etc/ha.d/conf/l7directord.cf
適宜
・l7directord の起動方法
# /etc/init.d/l7directord start
・l7directord の動作確認
# /etc/init.d/l7directord status

ここまでで超猿は普通に起動し、配下2台のリアルサーバへバランシングしてくれます。

さっそくクライアント(自分のPC)から超猿IPへアクセス。 バランシング先のRealServer(web1)のアクセスログ

【超猿IP】 - - [XX/Mar/2012:XX:XX:XX +0900] "GET / HTTP/1.1" 200 121 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDR; InfoPath.1; .NET4.0C; .NET4.0E)"

うん、超猿のIPで伝搬されるね。
これをクライアント(自分のPC)のIPアドレスを伝播したいのです。

さて、ここで本命のTransparent Proxy設定について

VirtualService 作成時、RealServer 追加時に --tproxy オプションをつけることで、Transparent Proxy 機能が有効になり、RealServerへの振り分け時にクライアントの IPアドレスをbindして接続できるようになるとの事。
(あたかもRealServerにクライアントから直接接続しているように)

ただし、この機能を利用する場合いくつか条件があるとの事で

(1) 超猿サーバのカーネルバージョンが2.6.28 以上 (RHEL6.0 以上)
(2) RealServerのデフォルトゲートウェイに超猿サーバを設定
(3) iptables、ip rule、ip routeをちょっと触る

以上の条件を満たして初めて透過するらしい。
(1)、(2)については本検証環境ではクリア。
(3)は下記設定にて対応。

# iptables -t mangle -N DIVERT
# iptables -t mangle -A DIVERT -j MARK --set-mark 1
# iptables -t mangle -A DIVERT -j ACCEPT
# iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
# service iptables save
# ip rule add fwmark 1 lookup 100
# ip route add local 0.0.0.0/0 dev lo table 100

ここまで設定したら最後はl7directord.cfの設定。

# vi /etc/ha.d/conf/l7directord.cf
    real = 【IP】:80 masq 1 ⇒これデフォルト値
⇒      real = 【IP】:80 tproxy ⇒こっちに修正

これで完了。再度クライアント(自分のPC)から超猿IPへアクセス。

バランシング先のRealServer(web1)のアクセスログ

【クライアントPCIP】 - - [XX/Mar/2012:XX:XX:XX +0900] "GET / HTTP/1.1" 200 121 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDR; InfoPath.1; .NET4.0C; .NET4.0E)"

うん、意図通り♪
これで懸念点がひとつ減りまして実運用へ向けて現実味を帯びてきました。

まだまだ絶賛開発途中の超猿改めUltraMonkeyプロジェクトですが、今後も注視していきたいと思います。