さまざまな規模のソビエト後の空間の多くのプロバイダーは、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番目の要求(次のアドレスなど)を円で受信します。 原則として、いくつかの状況がなければ、このようなバランスをとる行為で十分です。
- すべてのサーバーが同じ構成とパフォーマンスを備えているわけではありません。
- サーバーの1つが短時間クラッシュすると、そのクライアントはすべて残りのサーバーに接続します
長い間自然に滑らかになる不均衡が生じます。
これらの状況から抜け出す方法は簡単です。同時ユーザーセッションの数を監視し、サーバーの最大負荷または緊急シャットダウンに達すると、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リファレンス
著者ブログ
コメント、提案、質問、コメントを歓迎します。 ご清聴ありがとうございました。