Squid

提供: ArchWiki
ナビゲーションに移動 検索に移動

Squid は HTTP, HTTPS および FTP のキャッシュプロキシであり、広範囲なアクセス制御機能を提供します。

インストール

公式リポジトリから squidインストールしてください。

設定

デフォルトで、キャッシュディレクトリが /var/cache/squid に作成され、適当なパーミッションが設定されます。さらに /etc/squid/squid.conf を設定することで、細かい制御をすることが可能です。

設定はすべてコメントが付いていますが、コメントを除去したい場合は以下を実行:

sed -i "/^#/d;/^ *$/d" /etc/squid/squid.conf

以下のオプションが一廉に役立つはずです。設定ファイルに以下のオプションが存在しない場合、追加してください。

  • http_port - Squid がローカルマシンに bind するポートを設定します。http_port 行を複数行記述することで複数のポートに Squid を bind できます。デフォルトでは Squid はポート 3128 を使います。
http_port 3128
http_port 3129
  • http_access - プロキシの使用を許可するアクセス制御リストです。デフォルトでは localhost だけがプロキシにアクセスできるようになっています。http_access deny all オプションを http_access allow all に変えることで、誰でもプロキシにアクセスできるようになります。サブネットからアクセスできるようにしたい場合、そのように設定することもできます:
acl ip_acl src 192.168.1.0/24
http_access allow ip_acl
http_access deny all
  • cache_mgr - キャッシュの管理人のメールアドレス。
cache_mgr [email protected]
  • shutdown_lifetime - Squid のサービスを停止するように言われたときに待機する時間を指定します。デスクトップ PC で squid を実行する場合、短く設定すると良いでしょう。
shutdown_lifetime 10 seconds
  • cache_mem - Squid がメモリにオブジェクトを保存するのに使うメモリの量です。Squid の合計のメモリ使用量はこの設定を上回ります。デフォルトでは 8MB ですが、RAM が大量に利用できるときは増加させると良いでしょう。
cache_mem 64 MB
  • visible_hostname - ステータス/エラーメッセージで表示されるホストネーム。
visible_hostname cerberus
  • cache_peer - Squid からインターネットに直接接続するのではなく、他のプロキシサーバーを通したい場合、こちらに指定してください。
  • login - 親のプロキシが認証を必要とするときはこのオプションを使います。
  • never_direct - ページを取得するときにキャッシュを直接インターネットに送らない。上記のオプションを設定する場合はこのオプションも設定します。
cache_peer 10.1.1.100 parent 8080 0 no-query default login=user:password
never_direct allow all
  • maximum_object_size - キャッシュするオブジェクトの最大容量。デフォルトでは 4 MB ですが、ディスク容量がもっとある場合は適当にサイズを上げると良いでしょう。
maximum_object_size 10 MB
ノート: cache_dir を新しく定義したら、次のコマンドでキャッシュディレクトリを初期化する必要があります: squid -zN。-z はスワップディレクトリの作成を、-N はデーモンモードではないことを意味します。
  • cache_dir - キャッシュディレクトリです。全てのキャッシュファイルが保存されます。多数のオプションが存在しますが、基本的なフォーマットは以下の通りです:
cache_dir <storage type> <directory> <size in MB> 16 256

学校のインターネットプロキシを設定する場合:

cache_dir diskd /cache0 200000 16 256

キャッシュディレクトリをデフォルトから変更するときは、Squid を起動する前にキャッシュディレクトリに適当なパーミッションを設定してください。そうしないと Squid がキャッシュディレクトリを作成できずに起動に失敗します。

ローカルホストネームのサービスにアクセス

完全に定義されないホストネーム (例: http://mywebapp) を使って LAN 上のウェブサーバーにアクセスする場合、dns_defnames オプションを有効にする必要があります。このオプションが設定されていない場合、Squid はホストネームの DNS リクエストを作成してしまい (mywebapp)、LAN の DNS 設定によってはリクエストが失敗します。このオプションが有効になっていれば、Squid はリクエストを作成する際に /etc/resolv.conf に設定されているドメインを追加します (例: mywebapp.company.local)。

dns_defnames on

起動

設定が完了したら、設定ファイルが問題ないか確認してください:

# squid -k check

それからキャッシュディレクトリを作成してください:

# squid -z

そして Squid を起動します:

# systemctl start squid

ブート時に squid を起動させるには次のコマンドを使用:

# systemctl enable squid

コンテンツフィルタリング

Squid でコンテンツフィルタリングを行いたい場合、とても強力な機能を持っている DansGuardian を見て下さい。

フロントエンド

Squid を管理できるウェブベースのフロントエンドが欲しい場合は Webmin がおすすめです。

adzapper による広告ブロック

Adzapper は Squid のプラグインです。(Flash アニメーションも含めて) あらゆる広告を見つけては、設定された画像に置き換えます。そのためページのレイアウトが崩れることはありません。

インストール

AdZapper は現在、公式リポジトリにも AUR にもありません。スクリプト、および設定と使用法に関する詳細情報は、http://adzapper.sourceforge.net にあります。

設定

echo "redirect_program /usr/bin/adzapper.wrapper" >> /etc/squid/squid.conf

(squid 2.6.STABLE13-1)

echo "url_rewrite_program /usr/bin/adzapper.wrapper" >> /etc/squid/squid.conf
echo "url_rewrite_children 10" >> /etc/squid/squid.conf

adzapper の設定は自由に変えられますが、そのままでも特に問題なく動作します。

nano /etc/adzapper/adzapper.conf

アンチウイルス

HAVP プログラムを ClamAV と連携するようにすることでアンチウイルス機能を Squid に追加できます。

必要なパッケージのインストール

ClamAV の記事をみてシステムに ClamAV をインストールしてください。ClamAV をインストールしたら、AUR から havpAUR[リンク切れ: アーカイブ: aur-mirror] をインストールしてください。

設定

HAVP のインストールが完了したら、HAVP インスタンスで使用するユーザーグループを作成してください:

useradd havp

アンチウイルスのログと一時ファイルディレクトリの所有者を havp に変更します:

chown -R havp:havp /var/run/havp
chown -R havp:havp /var/log/havp

ファイルシステムに (HAVP が必要とする) 強制ロックオプションを追加してください。/etc/fstab を開いて、以下を:

[...] / ext3 defaults 1 1

以下のように修正します:

[...] / ext3 defaults,mand 1 1

それからファイルシステムをリロードしてください:

mount -o remount /

/etc/squid/squid.conf に HAVP の情報を追加:

cache_peer 127.0.0.1 parent 8080 0 no-query no-digest no-netdb-exchange default
cache_peer_access 127.0.0.1 allow all

/etc/havp/havp.config のポートが /etc/squid/squid.conf の cache_peer のポートと適合しているか確認してください。

テスト

squid をリロードして HAVP を起動:

systemctl restart squid
systemctl start havp

ブート時に起動したい場合:

systemctl enable squid
systemctl enable havp

こちら にあるテストウイルス (本当のウイルスではありません) でアンチウイルス機能をテストできます。

透過ウェブプロキシ

eth0 を通る全ての www リクエストを Squid に転送することで透過的に利用することが可能です。http_port オプションに intercept パラメータを追加して透過ウェブプロキシとして Squid を利用するように設定する必要があります (squid 3.2 の場合):

 http_port 3128 intercept

iptables

ターミナルから、root 権限で以下を実行:

# gid=`id -g proxy`
# iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner --gid-owner $gid -j ACCEPT
# iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination SQUIDIP:3128
# iptables-save > /etc/iptables/iptables.rules

そして iptables を起動:

# systemctl start iptables.service

Replace SQUIDIP with the public IP(s) which squid may use for its listening port and outbound connections.

ノート: If you are using a content filtering solution, you should put the port for it, not the Squid port, and you need to remove the intercept option in the http_port line.

Shorewall

/etc/shorewall/rules を編集して以下を追加:

REDIRECT	loc	3128	tcp	www # redirect to Squid on port 3128
ACCEPT		$FW	net	tcp	www # allow Squid to fetch the www content
systemctl restart shorewall

HTTP 認証

Squid を使うにはユーザーとパスワードを入力しなくてはならないように設定できます。digest http auth を使います。

まず htdigest -c /etc/squid/users MyRealm username で users ファイルを作成します。パスワードが要求されたら入力してください。

そして以下の行を squid.conf に追加:

   auth_param digest program /usr/lib/squid/digest_file_auth -c /etc/squid/users
   auth_param digest children 5
   auth_param digest realm MyRealm
   
   acl users proxy_auth REQUIRED
   http_access allow users

それから squid を再起動してください。プロキシにアクセスするときにユーザー名とパスワードの入力が求められるようになります。

htdigest /etc/squid/users MyRealm newuser でさらにユーザーを追加することができます。htdigest ツールは Apache パッケージに入っています。

ノート: Be aware that http_access rules cascade, so you need to set them in the desired order.

NTLM

警告: NTLM は廃止予定でありセキュリティに問題を抱えています。

samba と winbindd をセットアップして次のコマンドでテスト:

 ntlm_auth --username=DOMAIN\\user

squid ユーザー/グループが /var/cache/samba/winbindd_privileged/ ディレクトリに r-x アクセスできるように権限を付与してください。

それから squid.conf に以下を追加します:

 auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
 auth_param ntlm children 5
 auth_param ntlm max_challenge_reuses 0
 auth_param ntlm max_challenge_lifetime 2 minutes
 auth_param ntlm keep_alive off
 acl ntlm_users proxy_auth REQUIRED
 http_access allow ntlm_users
 http_access deny all

トラブルシューティング

起動後に Squid を再起動

squid と NetworkManger の両方を使う場合、NetworkManger で wifi 接続が有効になる前に (/etc/resolv.conf が空の状態で) squid が起動すると以下のエラーが表示されます:

/var/log/squid/cache.log
Warning: Could not find any nameservers. Trying to use localhost 
Please check your /etc/resolv.conf file
or use the 'dns_nameservers' option in squid.conf.

以下の方法で対処できます:

# systemctl disable squid.service
/etc/NetworkManager/dispatcher.d/10_squid
if [ $1 == 'wlp2s0' ]
then
    if [ $2 == 'up' ]
    then
        systemctl start squid
    else
        systemctl stop squid
    fi
fi
# chmod u x /etc/NetworkManager/dispatcher.d/10_squid

参考資料