自宅でプロキシサーバ構築実践(Squid/CentOS 8)

インフラサーバ

CentOS 8 とプロキシサーバソフトの Squid を使ってプロキシサーバを構築してみます。
今回は Squid をインストールしてプロキシサーバとして動作させることだけを実施します。

※CentOS 8 のインストールから始める方はまずは以下の記事からどうぞ。

プロキシサーバ構築の流れ

  1. Squid のインストール
  2. firewallの設定
  3. Squid サービスの起動
  4. アクセスログの確認

たったこれだけ。すごく簡単です。

プロキシサーバ構築

Squid のインストール

以下のコマンドで Squid をインストールします。

yum -y install squid

インストールが完了したら Squid のコンフィグファイル squid.conf を確認してみます。
squid.conf のパスは以下の通りです。

/etc/squid/squid.conf

設定そのままでもとりあえずプロキシとして動くので今回は特に変更はしないのですが、
内容は確認しておきましょう。

cat /etc/squid/squid.conf

コンフィグ内の#はコメントアウトを意味します。
#より右側にある文字は設定としては認識されないということです。
コンフィグの最初には acl の設定としてグループの設定が記述されています。

acl localnet src 0.0.0.1-0.255.255.255	# RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8		# RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16		# RFC 1918 local private network (LAN)
acl localnet src fc00::/7       	# RFC 4193 local private network range
acl localnet src fe80::/10      	# RFC 4291 link-local (directly plugged) machines

【 acl “識別名” src “IPアドレス”】という書式になっていて、src なので送信元IPアドレスのグループを定義しています。localnet にプライベートIPアドレスはすべて含む設定とされていますね。

上記に続く行にも acl が記述されています。

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
acl CONNECT method CONNECT

【 acl “識別名” port “ポート番号”】という書式になっていて、 port なので宛先のポート番号のグループが定義されています。
上記の中の最後の行については、 【 acl “識別名” method “メソッド名”】 の書式となっていて、httpメソッド  (GET , PUT , CONNECT , HEAD , DELETE 等) に関する acl を定義しています。

続きを見ていきます。

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localhost manager
http_access deny manager

http_access allow localnet
http_access allow localhost

http_access deny all

上記では、アクセス制御設定を行っています。書式は以下の通りです。

http_access "allow/deny" "対象"

対象の部分には acl識別名などが入り、半角スペースで区切って複数指定することもできます。
上記コンフィグの意味は以下の通りです。

  • 1行目
    acl:SSL_ports(443) に含まれないポート宛の通信は拒否する
  • 3行目
    acl:SSL_ports(443) に含まれないポート宛のCONNECTメソッドでの通信を拒否する
  • 5行目
    localhost (プロキシサーバ自身) と manager(未定義のacl識別名) からの通信を許可する
    manager は未定義のため意味のない(無効)な設定となります
  • 6行目
    manager を拒否する
  • 8行目
    acl:localnet に含まれるIPからの通信を許可する
  • 9行目
    localhost (プロキシサーバ自身) からの通信を許可する
  • 11行目
    all(すべて)の通信を拒否する

上記設定は上の行から順に評価され、一番最初に該当する行によって許可/拒否が決まります。
そのため、記述する順番が重要となります。

コンフィグの続きを見ていきます。

http_port 3128

Squid が通信を受け付けるポート番号を設定しています。デフォルトでは 3128 となっています。

coredump_dir /var/spool/squid

Squid のコアダンプ(エラー発生時のメモリ内容情報)出力先を設定しています。

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 [-i] regex min percent max [options]

regex の部分は対象接続先のURLを正規表現で記述します。 -i を付けると大文字小文字の区別をしなくなります。

  • 1行目の意味
    URLが「ftp:」から始まる場合、キャッシュされてから1440分(min)未満の場合はキャッシュデータを返します。10080分(max)を超えた場合は接続先サーバからの情報を返します。
    「1440(min)÷サーバで作成(変更)されてからの時間(分)」が 20%(percent)以下の場合、キャッシュから返します。超えていた場合は、キャッシュから返さずにサーバから取得します。

firewallの設定

クライアントからの接続を受け付けるために Squid で使用するポートの開放を行います。

firewall の設定状況を確認します。

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: wlp2s0
  sources: 
  services: cockpit dhcpv6-client dns ssh
  ports:   ←★TCP3128 が開放されていない
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

TCP3128が開放されていないため、以下コマンドにて開放します。

firewall-cmd --add-port=3128/tcp --zone=public --permanent
success

設定反映のために firewall をリロードします。

firewall-cmd --reload
success

設定を確認します。

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: wlp2s0
  sources: 
  services: cockpit dhcpv6-client dns ssh
  ports: 3128/tcp  ←★TCP3128 が開放されました
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Squid サービスの起動

以下コマンドにて Squid を起動させます。

systemctl start squid
systemctl enable squid ←★自動起動設定
systemctl status squid
● squid.service - Squid caching proxy
   Loaded: loaded (/usr/lib/systemd/system/squid.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-11-09 14:14:10 JST; 2h 54min ago

Squid の起動ができました。

アクセスログの確認

プロキシサーバの準備ができたので、実際にプロキシサーバを使ってみて Squid のアクセスログを確認してみます。

プロキシサーバとネットワーク接続する別のPCにて、プロキシサーバを使用する設定をします。

インターネットオプション → 接続タブ → LANの設定 にて、プロキシサーバを使用するにチェックを入れて、プロキシサーバのIPアドレスとポート番号を入力してください。
ポート番号は Squid.conf の [http_port] で設定した番号としてください。
設定ができたら、インターネット接続ができることを確認してください。

インターネット接続後に、プロキシサーバにて Squid のアクセスログを確認します。
アクセスログのパスは以下の通りです。

/var/log/squid/access.log

アクセスログの内容を確認してください。

tail /var/log/squid/access.log
1573276460.830    198 192.168.10.33 TCP_TUNNEL/200 39 CONNECT im.c.yimg.jp:443 - HIER_DIRECT/183.79.249.252 -
1573276461.428   2337 192.168.10.33 TCP_TUNNEL/200 310 CONNECT dsb.yahoo.co.jp:443 - HIER_DIRECT/182.22.25.252 -
1573276461.432   2277 192.168.10.33 TCP_TUNNEL/200 7196 CONNECT ib.adnxs.com:443 - HIER_DIRECT/103.43.90.178 -
1573276461.685    625 192.168.10.33 TCP_TUNNEL/200 189 CONNECT pvtag.yahoo.co.jp:443 - HIER_DIRECT/183.79.249.252 -
(略)

アクセスログが出力されているのでプロキシサーバを使用してインターネット接続ができているようです。

プロキシサーバの機能について

プロキシサーバの機能としては主に以下があります。

  • コンテンツキャッシュ機能
    →クライアントへの高速な応答を提供します
  • フィルタリング機能
    →クライアントからのインターネット接続を制限します
     有害サイトへの接続の防止など
  • ログ機能
    →アクセスログ、ブロックログ等を記録します
     インシデントなどが発生した時の調査に利用するなど

上記機能を要件通りに実装するために設定をする必要がありますが、まとめてやろうとすると大変なのでまたの機会に実施してみたいと思います。

備考

  • 以下のコマンドで squid.conf の構文チェックが実施できます。
    問題が無ければ何も出力されません。
squid -k check

次のステップ

タイトルとURLをコピーしました