PPTP / L2TP MPD5サーバーでの負荷分散

画像



さまざまな規模のソビエト後の空間の多くのプロバイダーは、PPPoEであろうとPPTP / L2TPであろうと、VPNトンネルを介してインターネットサービスを提供します。 このトピックは別の記事に簡単に収まるため、このようなアクセスの長所と短所については説明しません。 原則として、このようなトンネリングには、重大な腺(Cisco、Juniperなど)、またはFreeBSDとMPD5に基づくソフトウェアルーターが使用されます。 そのため、この記事では、MPD5サーバーの負荷分散について説明します。 ハブにはすでに同様のトピックがありましたが、PPPoEが検討されました。今日は、PPTP / L2TPを使用して状況を分析します。



理論



VPNサーバーのバランスをとる最も簡単な方法は、いわゆるラウンドロビンDNSです。 nslookup vpn.iformula.ruコマンドを実行すると、次のように表示されます。



  nslookup vpn.iformula.ru 
サーバー:193.93.236.2 
住所:193.93.236.2#53

名前:vpn.iformula.ru
住所:10.168.1.103
名前:vpn.iformula.ru
住所:10.168.1.101
名前:vpn.iformula.ru
住所:10.168.1.102 


(nslookup yandex.ru を試すことができます -ラウンドロビンDNSも使用されます



つまり DNSサーバーに要求を送信するクライアントは、応答としてリストから最初のアドレスを受信し、2番目の要求(次のアドレスなど)を円で受信します。 原則として、いくつかの状況がなければ、このようなバランスをとる行為で十分です。



長い間自然に滑らかになる不均衡が生じます。

これらの状況から抜け出す方法は簡単です。同時ユーザーセッションの数を監視し、サーバーの最大負荷または緊急シャットダウンに達すると、DNSでのIPアドレスのアナウンスを停止する必要があります。 もちろん、シェルスクリプトを使用してこれを自動化します。



練習する



1.現在のセッションの数とセッションの最大許容数に関する情報を取得する必要があります。 MPD5は、telnetおよびwebcmdを介して制御します。 この場合、 Expectでtelnet CLIのハンドラーを作成するのではなく、htmlページを取得して解析するだけなので、webcmdを選択しました。 Web管理を有効にします。



set user $ROOT $PASSWORD admin set web self 0.0.0.0 5006
      
      





mpdを再起動すると、さまざまな情報が0.0.0.0:5006で利用可能になります。 次のようなセッションに関する情報を取得できます:http:// $ login:$password@0.0.0.0:5006 / cmd?Show%20ippool

 [] show ippool Available IP pools: pool1: used 1293 of 2047
      
      





2. DNSサーバーをセットアップします。 私は、FreeBSDの標準であるBIND9を使用します。 既にサービス対象ゾーンを持つDNSサーバーが構成されていると思います。 必要なのは、この自動生成されたファイルに$ INCLUDEを追加し、このゾーンのVPNサーバーのリストを追加することだけです。



 $INCLUDE /var/named/etc/namedb/vpn ; ;host names iformula.ru. IN A 193.93.236.126
      
      





3.自動化スクリプトをcronスケジューラーに追加して、30分ごとに実行します。 もちろん、DNSデーモンが実行されているサーバーでスクリプトを実行する必要があります。



 echo "*/30 * * * root /usr/local/bin/mpd_balancer" >> /etc/crontab echo "" >> /etc/crontab
      
      





スクリプトを分析しましょう



パラメータ:



 login="foo"
      
      



#ユーザー名

 password="bar"
      
      



#Webcmd MPD5にアクセスするためのパスワード

 prcload="90"
      
      



#1つのサーバー上の同時セッションの最大許容数(パーセント)

 name="vpn.example.com."
      
      



#VPNサービス名、末尾にドットが必要です

 srvlist="/root/srv"
      
      



#VPNサーバーのリストを含むファイルへのパート

 conf="/var/named/etc/namedb/vpn"
      
      



#生成された$ INCLUDEへのパスとクライアントが利用可能なvpnサーバーのリスト

 workdir="/tmp"
      
      



#一時ファイルのディレクトリ



セッション情報を含むHTMLページを取得します。



 fetch -o $workdir/$ipsrv -q "http://$login:$password@$ipsrv:5006/cmd?show%20ippool" > /dev/null 2>&1
      
      





サーバーのアクティブおよび最大セッションの数を解析します。

 mpdsrv="`cat "$workdir/$ipsrv" | grep used | awk '{print ($3)}' `" maxloadsrv="`cat "$workdir/$ipsrv" | grep used | awk '{print ($5)}' | tr -d "\015\032" `"
      
      





bcコンソール計算機を使用して、現在のサーバー負荷をパーセントで計算します(パーセントは最も近い整数に丸められます)。



 loadsrv="`echo "$mpdsrv/($maxloadsrv/100)" | bc`"
      
      





負荷が指定された割合を超えていない場合は、サーバーアドレスを使用可能、負荷済み、およびアクセス不能なサーバーのリストに追加し、コメントします。



 if [ "$loadsrv" -lt "$prcload" ] then echo "$name IN A $ipsrv" >> $conf else echo ";$name IN A $ipsrv" >> $conf fi
      
      





また、コンソールからスクリプトを実行するだけの場合、次のデータが取得されます。



 ####################################################################### 10.168.1.100 hosts 739 sessions and this is 49% of maximum load 10.168.1.101 hosts 1192 sessions and this is 70% of maximum load 10.168.1.102 hosts 1304 sessions and this is 65% of maximum load 10.168.1.103 hosts 138 sessions and this is 27% of maximum load 10.168.1.104 hosts 24 sessions and this is 24% of maximum load #######################################################################
      
      





これらのデータに基づいて、美しいグラフを描くことができます。

画像



スクリプトは、bc、fetch、およびrndcユーティリティを使用します。これらはすべて、標準のFreeBSDパッケージに含まれています。 このスクリプトはFreeBSD 8.3でテストされています。Linuxの場合、fetchをwgetに置き換える必要があります。 任意の数のmpd5サーバーをサポートします。



スクリプト:



リンク#1

リンク#2



MPD5ドキュメント

BIND9ドキュメント

Shリファレンス

著者ブログ



コメント、提案、質問、コメントを歓迎します。 ご清聴ありがとうございました。



All Articles