Ubuntu20.04でプライベート接続用のSquidプロキシを設定する方法
序章
プロキシサーバーは、エンドユーザーとインターネットリソース間のゲートウェイとして機能するサーバーアプリケーションの一種です。 エンドユーザーは、プロキシサーバーを介して、プライバシー、セキュリティ、キャッシュなど、さまざまな目的でWebトラフィックを制御および監視できます。 たとえば、プロキシサーバーを使用して、自分のIPアドレスとは異なるIPアドレスからWeb要求を行うことができます。 また、プロキシサーバーを使用して、管轄区域ごとにWebがどのように提供されるかを調査したり、監視やWebトラフィックの抑制のいくつかの方法を回避したりすることもできます。
Squid は、安定した人気のあるオープンソースのHTTPプロキシです。 このチュートリアルでは、Ubuntu20.04サーバーにHTTPプロキシを提供するようにSquidをインストールして構成します。
前提条件
このガイドを完了するには、次のものが必要です。
- Ubuntu20.04サーバーとsudo権限を持つroot以外のユーザー。 これらの権限を持つユーザーを設定する方法の詳細については、 Ubuntu20.04を使用したサーバーの初期設定ガイドをご覧ください。
このチュートリアルではドメイン名your_domainを使用しますが、これを独自のドメイン名またはIPアドレスに置き換える必要があります。
ステップ1—SquidProxyをインストールする
Squidには、個々のユーザーのアウトバウンドトラフィックのルーティング以外にも多くのユースケースがあります。 大規模なサーバー展開のコンテキストでは、分散キャッシングメカニズム、ロードバランサー、またはルーティングスタックの別のコンポーネントとして使用できます。 ただし、通常はプロキシサーバーが関与するサーバートラフィックを水平方向にスケーリングするいくつかの方法は、アプリケーションのより多くのコンポーネントを分散するKubernetesなどのコンテナ化フレームワークによって人気が上回っています。 同時に、個々のユーザーがプライバシーを保護するために、プロキシサーバーを使用してWebリクエストをリダイレクトすることがますます一般的になっています。 これは、優先度の低いメンテナンスモードで数十の機能を備えているように見えるオープンソースプロキシサーバーを使用する場合に留意するのに役立ちます。 プロキシのユースケースは時間の経過とともに変化しましたが、基本的なテクノロジーは変化していません。
root以外のユーザーとして次のコマンドを実行して、パッケージリストを更新し、SquidProxyをインストールすることから始めます。
sudo apt update sudo apt install squid
Squidは自動的にバックグラウンドサービスをセットアップし、インストール後に開始します。 サービスが正しく実行されていることを確認できます。
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
またはお気に入りのテキストエディタで開きます。
sudo nano /etc/squid/squid.conf
Squidのデフォルトの構成ファイルは非常に長く、#
を行の先頭に置くことで一時的に無効にされた多数のオプションが含まれていることに注意してください。これは、[X226Xとも呼ばれます。 ]コメントアウト。 ほとんどの場合、ファイルを検索して、編集する行を見つけます。 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プロジェクトからいくつかのユーティリティをインストールする必要があります。
sudo apt install apache2-utils
このパッケージは、htpasswd
コマンドを提供します。このコマンドを使用して、新しいSquidユーザーのパスワードを生成できます。 Squidのユーザー名は、システムのユーザー名と重複しないため、必要に応じて、ログインに使用したのと同じ名前を使用できます。 パスワードを追加するように求められます。
sudo htpasswd -c /etc/squid/passwords your_squid_username
これにより、ユーザー名と新しいパスワードのハッシュが/etc/squid/passwords
に保存され、Squidによって認証ソースとして使用されます。 後でファイルをcat
して、次のように表示されます。
sudo cat /etc/squid/passwords
Outputsammy:$apr1$Dgl.Mtnd$vdqLYjBGdtoWA47w4q1Td.
ユーザー名とパスワードが保存されていることを確認したら、新しい/etc/squid/passwords
ファイルを使用するようにSquidの構成を更新できます。 nano
またはお気に入りのテキストエディタを使用して、Squid構成ファイルを再度開き、次の強調表示された行を追加します。
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 …
これらの追加のディレクティブは、basic_ncsa_auth
メカニズムを使用して解析できるパスワードハッシュについて、新しいpasswords
ファイルをチェックインし、プロキシへのアクセスに認証を要求するようにSquidに指示します。 この認証方法または他の認証方法の詳細については、Squidのドキュメントを確認してください。 その後、構成を変更してSquidを最終的に再起動できます。 これが完了するまでに少し時間がかかる場合があります。
sudo systemctl restart squid.service
また、ufw
を使用している場合は、ファイアウォールでポート3128を開くことを忘れないでください。
sudo ufw allow 3128
次のステップでは、最後にプロキシに接続します。
ステップ3—イカを介して接続する
Squidサーバーのデモを行うために、curl
と呼ばれるコマンドラインプログラムを使用します。これは、さまざまな種類のWeb要求を行うために一般的です。 一般に、特定の接続が理想的な状況でブラウザで機能するかどうかを確認する場合は、常に最初にcurl
でテストする必要があります。 これを行うには、 local マシンでcurlを使用します。これは、すべての最新のWindows、Mac、およびLinux環境にデフォルトでインストールされるため、任意のローカルシェルを開いて次のコマンドを実行できます。
curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 http://www.google.com/
-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
さらに構成を変更せずに、Squidプロキシを使用してhttps://
Webサイトにアクセスすることもできます。 これらは、クライアントとサーバー間のSSLを維持するために、CONNECT
と呼ばれる別個のプロキシディレクティブを利用します。
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を使用してサーバーの展開を自動化する方法を確認することをお勧めします。他のデータセンターでのこの構成。