序章

プロキシサーバーは、エンドユーザーとインターネットリソース間のゲートウェイとして機能するサーバーアプリケーションの一種です。 エンドユーザーは、プロキシサーバーを介して、プライバシー、セキュリティ、キャッシュなど、さまざまな目的でWebトラフィックを制御および監視できます。 たとえば、プロキシサーバーを使用して、自分のIPアドレスとは異なるIPアドレスからWeb要求を行うことができます。 また、プロキシサーバーを使用して、管轄区域ごとにWebがどのように提供されるかを調査したり、監視やWebトラフィックの抑制のいくつかの方法を回避したりすることもできます。

Squid は、安定した人気のあるオープンソースのHTTPプロキシです。 このチュートリアルでは、Ubuntu20.04サーバーにHTTPプロキシを提供するようにSquidをインストールして構成します。

前提条件

このガイドを完了するには、次のものが必要です。

このチュートリアルではドメイン名your_domainを使用しますが、これを独自のドメイン名またはIPアドレスに置き換える必要があります。

ステップ1—SquidProxyをインストールする

Squidには、個々のユーザーのアウトバウンドトラフィックのルーティング以外にも多くのユースケースがあります。 大規模なサーバー展開のコンテキストでは、分散キャッシングメカニズム、ロードバランサー、またはルーティングスタックの別のコンポーネントとして使用できます。 ただし、通常はプロキシサーバーが関与するサーバートラフィックを水平方向にスケーリングするいくつかの方法は、アプリケーションのより多くのコンポーネントを分散するKubernetesなどのコンテナ化フレームワークによって人気が上回っています。 同時に、個々のユーザーがプライバシーを保護するために、プロキシサーバーを使用してWebリクエストをリダイレクトすることがますます一般的になっています。 これは、優先度の低いメンテナンスモードで数十の機能を備えているように見えるオープンソースプロキシサーバーを使用する場合に留意するのに役立ちます。 プロキシのユースケースは時間の経過とともに変化しましたが、基本的なテクノロジーは変化していません。

root以外のユーザーとして次のコマンドを実行して、パッケージリストを更新し、SquidProxyをインストールすることから始めます。

  1. sudo apt update
  2. sudo apt install squid

Squidは自動的にバックグラウンドサービスをセットアップし、インストール後に開始します。 サービスが正しく実行されていることを確認できます。

  1. systemctl status squid.service
Output
● squid.service - Squid Web Proxy Server Loaded: loaded (/lib/systemd/system/squid.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-12-15 21:45:15 UTC; 2min 11s ago

デフォルトでは、Squidはクライアントがこのサーバーの外部からSquidに接続することを許可していません。 これを有効にするには、に保存されている構成ファイルにいくつかの変更を加える必要があります。 /etc/squid/squid.conf. で開く nano またはお気に入りのテキストエディタ:

  1. sudo nano /etc/squid/squid.conf

Squidのデフォルトの構成ファイルは非常に長く、大量のオプションが含まれているため、 # それらがオンになっている行の先頭で、コメントアウトとも呼ばれます。 ほとんどの場合、ファイルを検索して、編集する行を見つけます。 の nano、これはを押すことによって行われます Ctrl+W、検索語を入力し、を押します Enter、を繰り返し押します Alt+W 必要に応じて、その用語の次のインスタンスを検索します。

フレーズを含む行に移動することから始めます http_access deny all. Squidのデフォルトのアクセスルールを説明するテキストのブロックが表示されます。

/etc/squid/squid.conf
. . . 
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all
. . . 

これから、現在の動作を確認できます– localhost 許可されています; 他の接続はそうではありません。 これらのルールは順番に解析されるため、 deny all この構成ブロックの下部にあるルール。 そのルールを次のように変更できます allow all、誰でもプロキシサーバーに接続できるようにしますが、おそらくそうしたくないでしょう。 代わりに、上に行を追加できます http_access allow localhost 次のように、独自のIPアドレスが含まれます。

/etc/squid/squid.conf
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*
# Example rule allowing access from your local networks.
acl localnet src your_ip_address
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost
  • acl は、 A ccess C ontrol L istを意味し、権限ポリシーの一般的な用語です。
  • この場合のlocalnetはACLの名前です。
  • src は、このACLの下でリクエストが発信される場所、つまりIPアドレスです。

ローカルIPアドレスがわからない場合は、 What’s my IP のようなサイトにアクセスすると、どこからアクセスしたかがわかります。 その変更を行った後、ファイルを保存して閉じます。 使用している場合 nano、 押す Ctrl+X、そしてプロンプトが表示されたら、 Y その後 Enter.

この時点で、Squidを再起動して接続できますが、最初にSquidを保護するためにできることは他にもあります。

ステップ2—イカを確保する

ほとんどのプロキシ、およびプロキシに接続するほとんどのクライアント側アプリ(Webブラウザーなど)は、複数の認証方法をサポートしています。 これらには、共有キーまたは個別の認証サーバーを含めることができますが、最も一般的には、通常のユーザー名とパスワードのペアが必要です。 Squidを使用すると、IPアドレスによってプロキシへのアクセスを制限するための追加または代替の手順として、組み込みのLinux機能を使用してユーザー名とパスワードのペアを作成できます。 これを行うには、というファイルを作成します /etc/squid/passwords Squidの構成をポイントします。

まず、Squidが好むパスワードジェネレータにアクセスするには、Apacheプロジェクトからいくつかのユーティリティをインストールする必要があります。

  1. sudo apt install apache2-utils

このパッケージは、 htpasswd コマンド。これは、新しいSquidユーザーのパスワードを生成するために使用できます。 Squidのユーザー名は、システムのユーザー名と重複しないため、必要に応じて、ログインに使用したのと同じ名前を使用できます。 パスワードを追加するように求められます。

  1. sudo htpasswd -c /etc/squid/passwords your_squid_username

これにより、ユーザー名と新しいパスワードのハッシュが次の場所に保存されます。 /etc/squid/passwords、Squidによる認証ソースとして使用されます。 あなたはできる cat 後でファイルを見て、それがどのように見えるかを確認します。

  1. sudo cat /etc/squid/passwords
Output
sammy:$apr1$Dgl.Mtnd$vdqLYjBGdtoWA47w4q1Td.

ユーザー名とパスワードが保存されていることを確認したら、Squidの構成を更新して新しいものを使用できます /etc/squid/passwords ファイル。 使用する nano または、お気に入りのテキストエディタで、Squid構成ファイルを再度開き、次の強調表示された行を追加します。

  1. sudo nano /etc/squid/squid.conf
/etc/squid/squid.conf
…
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*
auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm proxy
acl authenticated proxy_auth REQUIRED
# Example rule allowing access from your local networks.
acl localnet src your_ip_address
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost
http_access allow authenticated
# And finally deny all other access to this proxy
http_access deny all
…

これらの追加のディレクティブは、Squidに新しいものをチェックインするように指示します passwords を使用して解析できるパスワードハッシュのファイル basic_ncsa_auth メカニズム、およびプロキシへのアクセスに認証を要求します。 この認証方法または他の認証方法の詳細については、Squidのドキュメントを確認してください。 その後、構成を変更してSquidを最終的に再起動できます。 これが完了するまでに少し時間がかかる場合があります。

  1. sudo systemctl restart squid.service

また、使用している場合は、ファイアウォールでポート3128を開くことを忘れないでください ufw:

  1. sudo ufw allow 3128

次のステップでは、最後にプロキシに接続します。

ステップ3—イカを介して接続する

Squidサーバーのデモを行うために、次のコマンドラインプログラムを使用します。 curl、さまざまな種類のWebリクエストを作成するために人気があります。 一般に、特定の接続が理想的な状況でブラウザで機能するかどうかを確認する場合は、常に最初に次のコマンドをテストする必要があります。 curl. これを行うには、 local マシンでcurlを使用します。これは、すべての最新のWindows、Mac、およびLinux環境にデフォルトでインストールされるため、任意のローカルシェルを開いて次のコマンドを実行できます。

  1. curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 http://www.google.com/

The -x 引数はプロキシサーバーをcurlに渡します。この場合、 http:// プロトコル、このサーバーへのユーザー名とパスワードを指定してから、次のような既知のWebサイトに接続します。 google.com. コマンドが成功すると、次の出力が表示されます。

Output
* Trying 138.197.103.77... * TCP_NODELAY set * Connected to 138.197.103.77 (138.197.103.77) port 3128 (#0) * Proxy auth using Basic with user 'sammy' > GET http://www.google.com/ HTTP/1.1

アクセスも可能です https:// 構成をさらに変更することなく、Squidプロキシを使用するWebサイト。 これらは、と呼ばれる別のプロキシディレクティブを利用します CONNECT クライアントとサーバー間のSSLを維持するには、次のようにします。

  1. curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 https://www.google.com/
Output
* Trying 138.197.103.77... * TCP_NODELAY set * Connected to 138.197.103.77 (138.197.103.77) port 3128 (#0) * allocate connect buffer! * Establish HTTP proxy tunnel to www.google.com:443 * Proxy auth using Basic with user 'sammy' > CONNECT www.google.com:443 HTTP/1.1 > Host: www.google.com:443 > Proxy-Authorization: Basic c2FtbXk6c2FtbXk= > User-Agent: curl/7.55.1 > Proxy-Connection: Keep-Alive > < HTTP/1.1 200 Connection established < * Proxy replied OK to CONNECT request * CONNECT phase completed!

使用したクレデンシャル curl これで、新しいプロキシサーバーを使用したい他の場所でも機能するはずです。

結論

このチュートリアルでは、トラフィックをプロキシするための一般的なオープンソースAPIエンドポイントを、オーバーヘッドをほとんどまたはまったく使用せずにデプロイする方法を学びました。 多くのアプリケーションには、数十年前に(多くの場合OSレベルで)プロキシサポートが組み込まれているため、このプロキシスタックは非常に再利用可能です。

次に、 Dante をデプロイする方法を学びたいと思うかもしれません。これは、さまざまなタイプのWebトラフィックをプロキシするためにSquidと一緒に実行できるSOCKSプロキシです。

プロキシサーバーの最も一般的な使用例の1つは、さまざまなグローバルリージョンとの間のトラフィックのプロキシであるため、複製したい場合に備えて、Ansibleを使用してサーバーの展開を自動化する方法を確認することをお勧めします。他のデータセンターでのこの構成。