企業ネットワーク上のSquidを使用したHitrim

最近、1つのかなり面白い記事(http://habrahabr.ru/blogs/sysadm/28063/)に出会いました。この記事では、プロキシサーバークラスターを作成して合計スループットを向上させる可能性について説明しました。 当初、この興味深いソリューションの場所は時代遅れのテクノロジーの博物館にあったように見えましたが、熟考すると、より興味深い結論に至りました。

実際、私たちのオフィスは、私のように、かなり高価なインターネットとITの面ではあまり賢くない一般的な管理のあるゾーンに地理的に位置しています。 その結果、フック付きの500の場合、人は最大2つのメガビットチャネルを持ちます。 個人的な速度が128 kbit / sマークを超える時間はとても幸せです。 そしてこれは悲しい以上です。



幸いなことに、私は適切な部門で働いており、すべての新しいことにオープンであり、重要なことに、利用可能な速度に不満を抱いています。 各従業員には、中央プロキシが自分のスキニーインターネットを提供する資格情報に応じて、コンピューターとActive Directoryエントリの資格があります。 ご覧のとおり、これはカスケードプロキシを利用するのに十分な環境です。 squid-sを設定するための手順については説明しません。これについては、上記の資料で既に十分に説明されています。 一般的な概念を示す写真のみを表示し、少しコメントします。



画像



Squidは、適切な資格情報を使用してオフィスの中央プロキシサーバーからインターネットを受信するように構成された、部門の関心のある従業員のコンピューターにインストールされます。 これは、次のsquid構成行を使用して実行されます。



cache_peer プロキシアドレスのポート 0クエリなしのデフォルトログイン= ユーザー:パスワード



パスワードは構成ファイルに保存されるため、パスワードへのアクセスを制限することを強くお勧めします。

次に、部門のプロキシサーバーが上昇し、かなり正直なラウンドロビンアルゴリズムを使用して従業員プロキシへの着信要求を分散させます(ラウンドロビンは、循環ループで要素を列挙することによる分散コンピューティングシステムの負荷分散アルゴリズムです)。 北が利用できるプロキシを知るために、次の行がその構成に追加されます。



cache_peer 従業員プロキシのポート 0クエリなしラウンドロビン



最後に、ブラウザ、ダウンロードマネージャーなどのクライアントソフトウェアは、新しくインストールされた部門プロキシサーバーを使用するように構成されます。



結果のソリューションのセキュリティを強化したい場合は、さまざまな方法を使用できますが、私は最も簡単な方法を使用しました。 プロキシ従業員は、従業員とプロキシ部門のみがアクセスできるように構成されます。



acl localhost src 127.0.0.1/32

acl proxynet src プロキシ部門

http_accessはproxynetを許可します

http_access allow localhost

http_accessすべて拒否



結果のクラスターから不要なユーザーを遮断するために、基本認証を実装する部門のプロキシサーバーの構成に次の行が実装されます(デフォルトフォルダーにインストールされたWindowsシステムでsquidを使用する場合、パスは正しいです):



auth_param基本プログラムc:/squid/libexec/ncsa_auth.exe c:/ squid / etc / passwd

auth_param基本子5

auth_param基本的な大文字と小文字を区別オフ

acl認証済みproxy_authが必要です

http_access deny!認証済み



また、c:/ squid / etc / passwdファイルでは、ログイン/パスワードハッシュペアが認証に使用されます。



この記事の終わりかもしれませんが、それを書くことを私に促した重要な側面がなかったとしても。 ドメインポリシーによると、パスワードを定期的に変更する必要があります。もちろん、一部の同僚は、プロキシ構成ファイルでこれらの変更を同期するのを定期的に忘れてしまいます。 。 これは非常に迷惑なため、診断ユーティリティを作成することにしました。このユーティリティは、プロキシ部門のあるマシンに配置され、リクエストに応じてスポンサー付きプロキシサーバーすべての可用性と正しい動作を確認します。



アルゴリズムは非常に簡単ですが、ここで説明します。 入力として部門プロキシ構成ファイルの名前を受け取るGetPeersメソッドは、すべてのプロキシサーバーのリストを引き出します。



private static IEnumerable<String> GetPeers(string configFileName)

{

char[] separators = new char[]{' ', '\t'};

List<String> strings = new List<String>();

StreamReader reader = new StreamReader(configFileName, Encoding.Default);

while (!reader.EndOfStream)

{

string st = reader.ReadLine().Trim();

if (st.ToLower().StartsWith("cache_peer"))

{

string[] substrings = st.Split(separators);

strings.Add("http://" + substrings[1] + ":" + substrings[3]);

}

}

return strings;

}







IsPeerAvaliableメソッドは、指定されたURLでプロキシサーバーの状態を確認します。 PeerStatus列挙は、ステータスの決定方法のように学術的に完全ではありませんが、「実用的な目的」には十分です。



private static PeerStatus IsPeerAvaliable(string peer)

{

WebRequest request = WebRequest.Create("http://ya.ru");

request.Method = "GET";

request.Proxy = new WebProxy(peer);

request.Timeout = 5000;

try

{

request.GetResponse();

return PeerStatus.OK;

}

catch (WebException ex)

{

if (ex.Status == WebExceptionStatus.ConnectFailure)

return PeerStatus.Offline;

if (ex.Status == WebExceptionStatus.ProtocolError)

return PeerStatus.AuthError;

return PeerStatus.Error;

}

catch (Exception ex)

{

return PeerStatus.Error;

}

}







このユーティリティは、コンソールまたはグラフィカルアプリケーションとして、またはWebインターフェイスを提供するサービスとして実装できます。 操作の観点から最も単純なものとして、最後のオプションを選択しました。結果は次のようになります。



画像



これからどのような結論を導き出すことができますか?




All Articles