Squid
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 squid.admin@example.com
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
- キャッシュディレクトリです。全てのキャッシュファイルが保存されます。多数のオプションが存在しますが、基本的なフォーマットは以下の通りです:
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.
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 パッケージに入っています。
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.
以下の方法で対処できます:
- NetworkManager-wait-online.service を有効化:
# systemctl enable NetworkManager-wait-online.service
。 - systemd で squid を起動するかわりに NetworkManager dispatcher を使用:
# 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