現場でsquidを用いたネットワーク環境を作っています。
…が、なかなかに設定ファイルが難しい(´;ω;`) ので、基本についてまとめてみます。
もくじ
1.Squidのプロキシ機能
Squidは、普通のプロキシサーバを設定したい時や、
リバースプロキシを置きたい時に使える。
■フォワーディングプロキシ
いわゆるプロキシサーバの役割。
ローカルネットワークから外部のインターネットに接続する時に、接続を中継する。
現場では、
仮想マシンを複数用意し、ローカルネットワークを形成するが、
そのままでは完全に閉じてしまいどこへもアクセスできない環境が出来上がる。
そのため1か所だけ出口を設け、外部と通信したい時に、各ローカル仮想マシンが、
このフォワーディングプロキシの機能を持ったマシンを経由する設定をしている。
■リバースプロキシ
プロキシサーバとは逆に、インターネット→ローカルネットワークへの通信に際して
中継を行うこともできる。
squidでメジャーに使われているのは、前述のフォワーディングプロキシの機能である。
squidは、/etc/squid/squid.conf(デフォルトの配置)という設定ファイルをもとに動く。
squidをインストール(yum install squid)すると、デフォルトではフォワードプロキシとして機能するような設定が書かれている。
設定ファイルを更新後は、squidの再起動が必要。(systemctl restart squid)
■その他
Squidは、キャッシュサーバを作りたい時にも使える。
…が、今回は私の頭がついていかないので省略…m(__)m
2.設定ファイルの書き方基本
設定ファイルは、大きく分けて、
という、4つのパートに分かれて記述されている。(デフォルトの場合)
以下、各パートの記述内容の詳細を解説する。
■acl定義
リクエストのパターンを定義する。
定義方法:
acl <aclの名前(任意)> <aclの種類> <値>
例:
・acl localnet src 10.0.0.0/8
・acl Safe_ports port 80
なお、squidの設定ファイル(/etc/squid/squid.conf)を開いても分かる通り、
同じacl名で、複数のaclを登録することも可能。
例:
・acl localnet src 10.0.0.0/8
・acl localnet src 172.16.0.0/12
この場合、localnetというaclに対する制御の内容(後述)は、
「src 10.0.0.0/8」と「172.16.0.0/12」のどちらにも適用される。
従って、制御内容を同じにするのであれば、同じ名前のaclでまとめると、
設定ファイルがすっきり見やすくなる。
<aclの種類(主なもの)>
src 送信元のIPネットワーク
port 宛先ポート番号
method HTTPメソッド
dst 宛先IPアドレス
dstdomain 宛先ドメイン
先ほどの例であれば、具体的には以下のようなACLを定義していることになる。
・acl localnet src 10.0.0.0/8
→「localnet」という名前のaclを定義。
「localnet」というaclに、送信元ネットワークが 10.0.0.0/8に一致するパターンを追加する。
・acl Safe_ports port 80
→「Safe_ports」という名前のaclを定義。
「Safe_ports」というaclに、宛先ポート番号が80であるパターンを追加する。
■各aclに対する制御内容
次に、定義したaclについて、どのような制御を行うかを記述していく。
といっても、アクセスを「許可」か「拒否」のどちらかである。
記述方法:
http_access <allow/deny> <acl名>
例:
・http_access allow Safe_ports
→「Safe_ports」というaclなら、アクセスを許可する。
・http_access deny all
→全てのアクセスを拒否する。(allは全てという意味)
<制御記述の順番について>
http_accessは記述する順が重要である。
設定ファイルの上から順に判定をし、アクセス許可/拒否が判定された時点で、
以降のhttp_accessでの制御は見ないためである。
たとえば、上で例を2つ書いたが、2つ目の「http_access deny all」を最初に書いた場合、
「Safe_ports」というaclで定義された値も含め、すべてのアクセスを拒否することになる。
逆に1つ目→2つ目の順で記述した場合は、
「Safe_ports」というaclで定義された値はアクセスを許可され、定義されていない値の場合のみ拒否する設定となる。
<複数のacl定義を同時に満たす場合の制御>
http_access <allow/deny> <acl1> <acl2> …
という形で、acl名を並べて書くと、aclのAND条件となる。
例:
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports
→ポート番号が443以外で、CONNECTメソッドによる通信があった場合は、アクセスを拒否する
(「!」は否定の意味)
<キャッシュマネージャのアクセス制御>
デフォルトのsquid.confを確認すると、後半に以下のような記述がある。
http_access allow localhost manager
http_access deny manager
localhost、managerは、ともに予約語のようなものだと思ってほしい。
localhostはそのままの意味だが、
managerとは、キャッシュマネージャのことである。
先ほど少し触れたとおり、squidはキャッシュサーバの機能生成も可能なため、
コンテンツのキャッシュを管理する、キャッシュマネージャが最初から存在している。
デフォルトの記述によって、
キャッシュマネージャのアクセスは、localhostのみ許可する設定となっている。
キャッシュ機能を作りこむのでなく、プロキシ機能のためにsquidを使いたいのであれば、
ここはデフォルトのまま置いておいてよいだろう。
<ローカルネットワークおよびホストからのアクセス>
デフォルトのsquid.confを確認すると、さらに以下のような記述がある。
http_access allow localnet
http_access allow localhost
見たままの通りだが、
ローカルネットワーク、ローカルホストからのアクセスをそれぞれ許可する設定である。
ここをいじることはあまりないはず。
■その他の設定
<squidに割り当てるポート番号の設定>
デフォルトでは、squidはポート番号3128を利用する設定となっている。
http_port 3128
http_portに、利用したいポート番号を設定すれば、3128以外のポート番号を割り当てることも可能。
<コアダンプ出力先の設定>
必要に応じ、squidにおけるコアダンプの出力先も設定できる。
デフォルトの設定は以下の通り。
coredump_dir /var/spool/squid
※コアダンプとは
コアダンプとは、実行中のプログラムがエラーで強制終了する際に、その時点でプログラムが使用しているメモリ空間の内容をまるごと写し取ってファイルに保存したもの。デバッグ作業に用いられる。
(IT用語辞典 e-Wordsより引用)
■キャッシュ保存期間の設定
デフォルトでは設定ファイルの最後に、
キャッシュの保存期間を設定する記述もある。
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
基本の記述方法は以下の通り。
refresh_pattern <正規表現> <最小保存期間(分)> <キャッシュの古さ度合(%)> <最大保存期間(分)>
3.さいごに
キャッシュの部分はまだイメージつききってないですが、
プロキシ設定のほうはある程度基本をつかめました(`・ω・´)
実際の仕事では、さらに応用的な設定もいくつか出てくるので、
引き続き勉強したいと思います。気が向いたら記事にもします(たぶん)