Squid

(更新:2013/07)Install on CentOS
(更新:2006/03)Install on Vine
(作成:2004/12)

サービス管理をしていると、当然ながら複数サーバを組み合わせたりすることもしばしば。セキュリティを考えればネットワーク的な事も必然的に考えなければならず、そうすると外部への/外部からのアクセスを許さない環境なんてのもざらにある。……とはいえ、OSのUpdateもしてセキュリティフィクスやバグフィクスなんてのもしてあげなきゃいけなくて。はてさて如何に。
というわけで、プロキシサーバの簡単な立て方について。

Install on CentOS

yumでさっくり。

# yum install squid

初期設定もさっくり。とはいえ、当該サーバへアクセスできる全てのサーバが外部の何でもアクセスできちゃう、なんてのは流石にやり過ぎというか無駄過ぎるので、ある程度の制限は必要でしょう。必要なネットワークだけ指定するよう設定をしてから起動すること。

# /etc/init.d/squid start

他サーバからの利用方法

まあつまりはプロキシサーバなので、ブラウザの接続設定とかにIPとポートを指定して使うわけですが。CentOSの yum update を生かしたいなら、以下のあたり設定しておくと良い。

#### /etc/yum.conf

...
proxy=http://(squidサーバのIP):3128/
...
#### /etc/wgetrc

...
https_proxy = http://(squidサーバのIP):3128/
http_proxy = http://(squidサーバのIP):3128/
ftp_proxy = http://(squidサーバのIP):3128/
...

Install on Vine

最近のVineなら apt-get でインストールできるので楽。

# apt-get install squid
...

RPMパッケージでのインストールだと、以下sourceコンパイル時に必要なユーザ作成とかの面倒な副作業を省けて良いですな。

Install by tar-ball

まずはSquid運用ユーザを作成。Squidは通常1024以下のポートしか使用しないので、ユーザレベルの起動をした方がセキュアで良い。

# groupadd squid
# useradd -d /usr/local/squid -g squid -m squid

Squid運用ユーザと運用ディレクトリが出来たらソースコードからコンパイル。なるたけ最新のものを導入すること。 ソースは最初に書いてあるアドレスを参照のこと。

# su - squid
$ mkdir src
$ cd src
$ wget http://www.squid-cache.org/Versions/vX/x.x/squid-x.x.STABLEx.tar.bz2
$ tar xvfj squid-x.x.STABLEx.tar.bz2
...
$ cd src/squid-x.x.STABLEx
$ ./configure ---enable-useragent-log ---enable-referer-log
...
$ make all
...
$ make install
...

このままだとちょっとディレクトリが足りないので、以下のディレクトリを作成。

$ mkdir var/cache

cron にて以下のようにログローテートを設定。

$ crontab -e
0 0 * * * /usr/local/squid/sbin/squid -k rotate

起動スクリプト作成。

#### /usr/local/squid/sbin/rc.squid

#!/bin/sh
case "$1" in
    start)  # Start daemons.
    echo -n "Starting squid cache server: "
    /usr/local/squid/sbin/squid -sY >> /usr/local/squid/squid.out 2>&1 &
    touch /var/lock/squid ; echo
    ;;
    stop)   # Stop daemons.
    echo -n "Shutting down squid cache server: "
    kill -TERM `cat /usr/local/squid/var/logs/squid.pid`
    rm -f /var/lock/squid ; echo
    ;;
    *)      # Others
    echo "Usage: squid.init {start|stop}"
    exit 1
esac
exit 0

RedHatなら各 /etc/rc?.d/ 以下に起動/終了用にシンボリックリンク貼ってやると今後サーバマシン起動時に自動起動されて便利。

設定

初期設定

#### /usr/local/squid/etc/squid.conf

http_port 8080                      # HTTPリクエストに対する使用ポート
cache_mem 32 MB                     # Proxyキャッシュ容量
pid_filename /usr/local/squid/var/logs/squid.pid
                                    # プロセスIDファイル名
hierarchy_stoplist cgi-bin ? .      # キャッシュは読み込ませない
cache_dir ufs /usr/local/squid/var/cache 400 64 1024
                                    # キャッシュディレクトリ設定
ftp_user squid@hyakki.local         # AnonymousFTPパスワードに用いられる
cache_mgr squid@hyakki.local        # 問題発生時の報告先アドレス
cache_effective_user squid          # squidを起動するユーザ/グループ
cache_effective_group squid
error_directory /usr/local/squid/share/errors/English
                                    # エラーファイル格納先
cache_access_log /usr/local/squid/var/logs/access.log
cache_log /usr/local/squid/var/logs/cache.log
cache_store_log /usr/local/squid/var/logs/store.log
logfile_rotate 10                   # ログローテーション時に残す数

書式について捕捉。
cache_dir 設定の書式は、左から Type Dir Mbytes L1 L2 を表す。 ufs は古くから使われているSquidの記憶フォーマット。これ以外を使用するにはKernelレベルの再構築が必要なので、今回は行なわなかった。 aufs とか diskd にすると多少の高速化が図れるらしい。。。
L1 L2 はキャッシュとして作られるサブディレクトリ数のレベルを示す。

キャッシュのディレクトリツリー作成

上記設定のようにキャッシュサブディレクトリ数を多くすると、それだけディレクトリツリーの作成時間が長くなるので注意。

$ sbin/squid -D -z
xxxx/xx/xx xx:xx:xx| Creating Swap Directories

許可するアドレスの設定

デフォルトでは全ホストに対しProxy禁止になっているので、以下のように許可するもののコメントを外して設定する。

#### /etc/squid/squid.conf

...
#acl localnet src 10.0.0.0/8    # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
#acl localnet src 192.168.0.0/16        # RFC1918 possible internal network
#acl localnet src fc00::/7       # RFC 4193 local private network range
#acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines
acl localnet src 192.168.1.0/24
...
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
#acl Safe_ports port 70         # gopher
#acl Safe_ports port 210                # wais
#acl Safe_ports port 1025-65535 # unregistered ports
#acl Safe_ports port 280                # http-mgmt
#acl Safe_ports port 488                # gss-http
#acl Safe_ports port 591                # filemaker
#acl Safe_ports port 777                # multiling http
...

visible_hostname unknown

許可するポートの設定

不必要なポートはコメントアウトなりして禁止しておくべき。

#### /etc/squid/squid.conf

acl Safe_ports port 80          # http
acl Safe_ports port 443 563     # https` `snews
http_access deny !Safe_ports

ユーザ認証設定

Squidには標準で LDAP NCSA MSNT PAM SMB getpwam sasl winbind と、色んなユーザ認証機構が用意されているらしい。まぁその半数くらいがWindows向け認証だったけど。 で、切角簡単に認証掛けられるんだから、公開串でも考えてなければこいつの設定をしてやるべきじゃなかろーか。

認証プログラムが無い場合、必要なプログラムを導入する。

$ cd src/squid-x.x.STABLEx/helpers/basic_auth/NCSA/
$ make ; make install
...

パスワードファイルを作成する。Apache付属の htpasswd とかでも出来る。無ければ以下のサイトから入手可能。

$ htpasswd -c /usr/local/squid/etc/passwd riyo
New password:
Re-type new password:

-c オプションは passwd ファイルの新規作成なので、既に passwd がある場合は不要。 続いて以下の設定を施し、Squidを再起動する。

#### /etc/squid/squid.conf

...

auth_param basic program /usr/local/squid/libexec/ncsa_auth /usr/local/squid/etc/passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

# BASIC Authentication
acl password proxy_auth REQUIRED
http_access allow password

再起動したのち、 ps にてプロセスを確認してみる。下記のような項目があれば、NCSAが動作していることが判る。

$ ps ax | grep squid
...
6699 ?        S      0:00 (ncsa_auth) /usr/local/squid/etc/passwd

特定URLのアクセス制限

URLによるアクセス制限を設けるにも色々やり方はあるけど、正規表現によるやり方が一般的らしい。というか他のやり方でやると、どうも失敗するみたい。。。何でだろ。
例えばドメイン部 hyakki.local hoge.co.jp 以外のWeb閲覧を禁止したいなら以下のように設定する。

#### /etc/squid/squid.conf

acl ALLOW_URL url_regex .*\.hyakki\.local .*\.hoge\.co\.jp
http_access deny !ALLOW_URL