雨の降る灰色の夜に、プロキシサーバーを実装する必要がありましたが、単純なものではなく、次の機能を持つプロキシサーバーを実装する必要がありました。
- 特定のActive Directoryグループのアカウントのメンバーシップに応じたアクセスのプロビジョニング/制限。
- アカウントに付与された権限に応じてアクセスを許可/制限する(たとえば、グループ全体で検索エンジンの使用を許可し、このグループの最もmostなユーザーに対して厳密に定義された検索エンジンを無効にする);
- 「VIP」MACアドレスの制限なしでアクセスを提供します。
- すべてのユーザー(非ドメインユーザーを含む)に最小限のリソースセットへのアクセスを提供します。
- プロキシサーバーで作業するためにユーザーが実行する必要がある移動の数を最小限に抑える必要があります。
- プロキシサーバーの管理は、Webインターフェイスを介して実行されます。
- このプロキシサーバーの総所有コストは最小限に抑える必要があります。
当然、ntlmssp認証を使用してSquidに目を向けました。 Webインターフェースを介してSquidを構成するためのユーティリティー、SAMSがありました。 しかし、どういうわけか私は彼と一緒に成長しませんでした:PHPバージョンを5.3から5.2にロールバックする必要があり、その後ドメインに固執せず、ユーザーが表示されませんでした。 決してこれが悪い製品だとは言いたくありません。私の友人はそれを展開してセットアップしました(そのため、ソースは信頼できます)。星の位置だけではSAMSの支持者になれませんでした。
Google、さまざまな製品、およびソリューションにかなり悩まされ、「設定の本質はsquid.confファイルを生成することです。どういうわけかphpに書きましたが、Webインターフェースを自分で実装してみませんか?」 すぐに、バッグが走り出し、ユーザーがscり、インターネットリソースへのアクセスを開く際のサービスノートを持ってきました。
人生には他に何が必要ですか? しかし、しばらくして、ソリューションインフラストラクチャのいくつかの欠点が表面に現れました。
- ドメインコントローラーが誤動作し、ドメインコントローラーとの接続が失われた場合、ユーザーがログインできなかったため、インターネット(およびメインは企業メール)である外部とのバックアップ通信チャネルは機能しなくなりました。
- ユーザーは、ヘルパー(オイルオイル)ntlm_authを使用するntlmsspプロトコルを使用してプロキシにログインします。このインスタンスの1つのインスタンスはRAMで約60メガバイトを占有します。
ご覧のとおり、同じ量のメモリを消費するwinbinddプロセスも承認に関与しています。 リクエストあたり合計120メガバイト。 承認のためのスレッドの数を示すauth_param ntlm childrenパラメーターは、ユーザーの数を約10%超える必要があることが実験的に見つかりました。 auth_param ntlm children = 200の場合 、プロキシサーバーで 600メガバイトのメモリが使用されます。
メールエージェントなどのいたずらをしている150人のユーザーがプロキシで作業している場合、サーバーは予期せず動作することがあります。たとえば、フリーズ、ドメインコントローラーとの接続の切断などです。 繰り返しになりますが、これはおそらく私の曲率ですが、この作品のトピックを理解するように促したのは彼女でした。 - CPUリソースは実質的に関与していませんが、膨大な量のRAMが予約されています。
したがって、新しいウィッシュリストが登場しました。
- プロキシサーバーの負荷を減らし、手首を軽く振るだけでプロキシサーバーの構成を拡張する機会を得ます。
- 承認に問題がある場合は、非ドメイン構成に切り替え、問題が消える場合は、ドメイン構成に切り替えます。 途中で、出現および消滅する問題を管理者に通知できます。
プロキシサーバーの負荷とスケーラビリティの削減
ソリューションの出発点は、iptablesの負荷分散機能です。
# iptables -t nat -A PREROUTING --dst $GW_IP -p tcp --dport 3128 -m state --state NEW -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination $PROXY1 #iptables -t nat -A PREROUTING --dst $GW_IP -p tcp --dport 3128 -m state --state NEW -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination $PROXY2 #iptables -t nat -A PREROUTING --dst $GW_IP -p tcp --dport 3128 -m state --state NEW -m statistic --mode nth --every 3 --packet 2 -j DNAT --to-destination $PROXY3
このリストのコードにより、3つのプロキシサーバー間で負荷を均等に分散できます。 ここで、1つのIPアドレスの背後に隠れている3つのプロキシが必要です。 私の解決策を下の図に示します。
指定:
- LAN 192.168.0.0/24-ローカルエリアネットワーク;
- PROXY-ユーザーに表示されるプロキシサーバー。
- LAN 192.168.1.0/24-プロキシサーバーのローカルエリアネットワーク。
- PROXY1..PROXYN-SquidがデプロイされているLinux OSおよびActive Directoryと統合されたSambaに基づく仮想マシン。
- PROXY_CONFIG-プロキシサーバー管理インターフェイスが展開される仮想マシン。
この場合、ユーザーに表示される「プロキシサーバー」は、実際には、必要な数のプロキシサーバーとそれらを管理するためのインターフェイスが展開されている仮想マシンのハイパーバイザーです。
この構造により、以下を簡単に提供できます。
- プロキシをバイパスするVIP VIP MACアドレスから渡されるパケット。
- プロキシのスケーラビリティ。
- 障害後の高速リカバリ。
- Squidの構成を試すためのフィールド(このためには、新しい仮想マシンをデプロイして、その上ですべてをテストするだけで十分です)。
- 問題のある仮想マシンをプロキシプールからすばやく削除します。
- ハードウェアリソースの多かれ少なかれ最適な使用。
Squidの構成はすべてのプロキシで同じであるため、squid.confファイルはPROXY_CONFコンピューターのnfsボールに保存されます。
このスキームを実装するために、次のハードウェアおよびソフトウェアコンポーネントが使用されました。
- コンピューターCPU Core i3 / RAM 4 Gb / HDD 500 Gb;
- OS Ubuntu-Server 11.04;
- VirtualBox + phpvirtualbox。
コンピューターのオン/オフ時に仮想マシンを自動的に起動および停止するために、すべての仮想マシンをオン/オフするvmstartおよびvmstopスクリプトが作成されました。 pingと共にVBoxHeadlessコマンドとVBoxManageコマンドを使用してマシンのステータスを確認するだけなので、コンテンツは提供しません。
したがって、いくつかのタスクが解決されました。
- プロキシサーバーの負荷を軽減します。新しい接続を要求するパケットは、優先順位に従ってN個の仮想プロキシサーバーに分散されます。650MBのRAMを持つ1つのプロキシサーバーは、auth_param ntlm children = 200、すでに600に等しい。
- スケーラビリティ-必要に応じて、サーバーをアンロードします。既存のプロキシのハードドライブをコピーするだけで、5〜10分で完全な戦闘準備状態で新しいマシンを作成できます。
- ハードウェアリソースの合理的な使用-プロセッサの負荷が増加したため、以前の2つのタスクは解決されました。
- フォールトトレランス-PROXY_CONFIGおよびPROXY1マシンのコピーがあれば十分です。転倒後、コーヒーをゆっくり飲むことでスキーム全体を復元できます。また、ハードドライブを別のシステムユニットに挿入しようとするとLinuxがブルースクリーンに落ちないため、完全に安心してハイパーバイザーのハードドライブをバックアップできます。
ドメイン構成と非ドメイン構成間の自動切り替え
障害が発生した場合、ドメインコントローラーへの接続ですべてが正常であるかどうかをプロキシサーバーが判断できれば、コントローラーに依存しない構成を適用し、コントローラーを復元するときに、その機能に戻ることができればいいと時間は示していますこれはすべて構想されています。
少ない言葉で、より多くのアクションを!
#!/bin/bash # , /bin/ls -la /etc/squid/squid.conf | /bin/grep 'local' LOCAL=$? echo Local configuration - $LOCAL # , /usr/bin/ntlm_auth --username=ad_user --password=ad_pass 2>/dev/null 1>/dev/null if [ $? != 0 ]; then # echo No connection with domain if [ $LOCAL -eq 1 ]; then # # echo Reconfigure to local /bin/rm /etc/squid/squid.conf /bin/ln -s /etc/squid/squid.conf.local /etc/squid/squid.conf /usr/sbin/squid -k reconfigure # , /usr/bin/php5 /home/squiduser/mail/mail.php 'from' 'Proxy XX - Gone to non-domain mode' '=(' fi # /etc/init.d/joindomain else # echo OK connection to domain if [ $LOCAL -eq 0 ]; then # # echo Reconfigure to domain /bin/rm /etc/squid/squid.conf /bin/ln -s /var/www/squid/squid.conf /etc/squid/squid.conf /usr/sbin/squid -k reconfigure # , /usr/bin/php5 /home/squiduser/mail/mail.php 'from' 'Gone to domain mode' '=)' fi fi
注:
- ファイル/etc/squid/squid.confは、ローカルまたはドメイン構成のシンボリックリンクファイル(squid.confおよびsquid.conf.local)です。
- 通知には、企業のメールにメッセージを送信するmail.phpスクリプトが使用されます。
- /etc/init.d/joindomain-ドメインにコンピューターを入力するスクリプト。
スクリプトのロジックを次の図に示します。
今後すべてのプロキシサーバーでスクリプトを同期しないようにするには、PROXY_CONFIGマシンのネットワークボールにドロップし、すべてのプロキシにマウントして、スクリプトを毎分cronに追加します。 したがって、ドメインとの接続が失われた場合、ダウンタイムは1分に短縮されます。つまり、怒っている会計士は電話をかける時間も時間もありませんが、すぐに喜びます。
まあ、それがすべてです。 すべてが機能し、問題はありません。 説明した構成に関するよくある質問にすぐに回答したいと思います。