Debian 11でプライベート接続用のSquidプロキシを設定する方法は?
こんにちは、皆さん。今日は私は日本語に関しての導入をお伝えします。
プロキシサーバーは、エンドユーザーとインターネットリソースの間に立ち、ゲートウェイとして機能するサーバーアプリケーションの一種です。プロキシサーバーを通じて、エンドユーザーはプライバシー、セキュリティ、およびキャッシングなど、さまざまな目的でウェブトラフィックを制御および監視することができます。たとえば、プロキシサーバーを使用して、自分のIPアドレスとは異なるIPアドレスからウェブリクエストを行うことができます。また、プロキシサーバーを使用して、ウェブが異なる管轄地域でどのように提供されているかを調査したり、監視やウェブトラフィックの制限方法を回避したりすることもできます。
イカは安定した人気のあるオープンソースのHTTPプロキシです。このチュートリアルでは、Debian 11サーバー上でHTTPプロキシを提供するためにSquidをインストールおよび設定します。
前提条件
このガイドを完成させるために必要なものは、以下の通りです。
- A Debian 11 server and a non-root user with sudo privileges. You can learn more about how to set up a user with these privileges in our Initial Server Setup with Debian 11 guide.
このチュートリアルでは、your_domainというドメイン名を使用しますが、ご自身のドメイン名またはIPアドレスにこれを置き換えてください。
ステップ1 – Squid Proxyのインストール
イカは、個々のユーザーの送信トラフィックをルーティングする以外にも、さまざまな用途があります。大規模なサーバーデプロイメントのコンテキストでは、分散キャッシングメカニズム、負荷分散装置、またはルーティングスタックの別のコンポーネントとして使用することができます。しかし、通常はプロキシサーバーが関与していたサーバートラフィックの水平スケーリング方法の一部は、コンテナ化フレームワーク(例:Kubernetes)によって人気を上回られています。同時に、個々のユーザーとしてWebリクエストをリダイレクトするためにプロキシサーバーを使用することは、プライバシー保護においてますます人気があります。これを念頭に置くと、オープンソースのプロキシサーバーは、低い優先度のメンテナンスモードで多数の機能を持っているように見える場合があるため、注意が必要です。プロキシの用途は時代とともに変化しましたが、基本的な技術は変わっていません。
まず、非ルートユーザーで以下のコマンドを実行して、パッケージリストを更新し、Squid Proxyをインストールしてください。
- sudo apt update
- sudo apt install squid
イカはインストール後、バックグラウンドサービスを自動的に設定して開始します。サービスが正常に実行されていることを確認できます。
- systemctl status squid.service
● 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はこのサーバーの外部からのクライアントの接続を許可しません。それを有効にするためには、その設定ファイルを変更する必要があります。設定ファイルは/etc/squid/squid.confに保存されていますので、nanoかお気に入りのテキストエディタで開いてください。
- 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 means an Access Control List, a common term for permissions policies
- localnet in this case is the name of your ACL.
- src is where the request would originate from under this ACL, i.e., your IP address.
もし自分のローカルIPアドレスがわからない場合は、What’s my IPのようなサイトにアクセスして確認するのが最も早いです。その変更を行った後、ファイルを保存して閉じます。もしnanoを使用している場合は、Ctrl+Xを押して、プロンプトが表示されたらYを押し、Enterを押します。
この時点で、スクイードを再起動して接続することができますが、安全確保のためにもう少しできることがあります。
ステップ2 — スクイッドのセキュリティを確保
ほとんどのプロキシおよびプロキシに接続するクライアントサイドアプリ(例:ウェブブラウザ)は、複数の認証方法をサポートしています。これには共有キーや別個の認証サーバーを使用することもありますが、最も一般的なのは通常のユーザー名とパスワードです。Squidは、組み込みのLinux機能を使用してユーザー名とパスワードのペアを作成することができ、IPアドレスによるアクセス制限の追加または代替手段としても利用できます。これを行うためには、/etc/squid/passwordsというファイルを作成し、Squidの設定をそのファイルに向ける必要があります。
最初に、Squidが好むパスワード生成ツールにアクセスするために、Apacheプロジェクトからいくつかのユーティリティをインストールする必要があります。
- sudo apt install apache2-utils
このパッケージには、新しいSquidユーザーのパスワードを生成するために使用することのできるhtpasswdコマンドが提供されています。Squidのユーザー名はシステムのユーザー名とは全く重複しないので、ログインに使用した同じ名前を使用することもできます。パスワードの追加を求められることもあります。
- sudo htpasswd -c /etc/squid/passwords your_squid_username
これにより、ユーザー名と新しいパスワードのハッシュが/etc/squid/passwordsに保存され、Squidが認証のソースとして使用します。ファイルの内容を確認するために、後でcatコマンドを使うことができます。
- sudo cat /etc/squid/passwords
sammy:$apr1$Dgl.Mtnd$vdqLYjBGdtoWA47w4q1Td.
ユーザー名とパスワードが保存されたことを確認した後、新しい/etc/squid/passwordsファイルを使用するようにSquidの設定を更新することができます。nanoやお気に入りのテキストエディタを使用して、Squidの設定ファイルを再度開き、次にハイライト表示された行を追加してください。
- sudo nano /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に、basic_ncsa_authメカニズムを使用して解析可能なパスワードハッシュを新しいパスワードファイルでチェックし、プロキシへのアクセスに認証を必要とするよう指示します。この他の認証方法については、Squidのドキュメントを参照してください。その後、変更した設定を使ってSquidを再起動できます。完了するまでに少し時間がかかるかもしれません。
- sudo systemctl restart squid.service
もしufwを使っている場合は、ファイアウォールでポート3128を開けることを忘れないでください。
- sudo ufw allow 3128
次のステップでは、最後にプロキシに接続します。
ステップ3 – スクイッドを介して接続する
Squidサーバーをデモンストレーションするためには、さまざまな種類のWebリクエストを行う人気のあるコマンドラインプログラムであるcurlを使用します。一般的に、ブラウザの理想的な状況下で特定の接続が機能しているかどうかを検証する場合には、常に最初にcurlでテストを行うべきです。これを行うためには、ローカルマシンで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://プロトコルを使用し、ユーザー名とパスワードをサーバーに指定して、その後google.comのような正常に動作するウェブサイトに接続します。コマンドが成功した場合は、以下の出力が表示されるはずです。
* 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://ウェブサイトにもアクセスすることが可能です。クライアントとサーバー間のSSLを保持するため、CONNECTと呼ばれる別のプロキシディレクティブが使用されます。
- curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 https://www.google.com/
* 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エンドポイントをデプロイする方法を学びました。多くのアプリケーションには、数十年前からオペレーティングシステムレベルで内蔵されたプロキシサポートがありますので、このプロキシスタックは非常に再利用可能です。
次に、さまざまな種類のウェブトラフィックのプロキシとして動作するDanteというSOCKSプロキシをSquidと並行して展開する方法を学ぶかもしれません。
プロキシサーバーの最も一般的な使用例の1つは異なるグローバルリージョン間のトラフィックのプロキシです。そのため、他のデータセンターでこの設定を複製したい場合に備えて、Ansibleを使用してサーバーの展開を自動化する方法を確認しておくことをお勧めします。