squid3.5でProxyサーバ構築(RHEL7.3)

#概要
今までの復習を兼ねて、Linux7系でいろいろサーバを構築してみようの第一弾。
商用環境で構築運用したことはなく、(多分)10年くらい前に社内の検証環境でちょろっと構築したくらい。

squidバージョン：3.5.20
squid設定ファイル：/etc/squid/squid.conf
アクセスログファイル：/var/log/squid/access.log
OSバージョン：RHEL7.3

#やってみよう
自PCからAWS上に構築するProxy経由でブラウジングするのがゴール。
###事前準備

+ EC2インスタンスの作成
RHEL7.3でインスタンスを作成しておきます。
設定はデフォルトでOKですが、気になるようであればロケールの変更をしてください。
※アクセスログの時間

+ セキュリティグループでのインバウンド許可
プロキシサーバで待ち受けるポートをインバウンドで許可しておいてください。
squidのデフォルトは3128ですが、8080や8008でもOKです。

 
###squidのインストール
デフォルトではsquidはインストールされていませんので、yumでインストールします。
>[ec2-user@ip-172-XX-XX-XX ~]$ **sudo yum install squid**
Loaded plugins: amazon-id, rhui-lb, search-disabled-repos

>Resolving Dependencies
--> Running transaction check
---> Package squid.x86_64 7:3.5.20-2.el7_3.3 will be installed
--> Processing Dependency: /usr/bin/perl for package: 7:squid-3.5.20-2.el7_3.3.x86_64
--> Processing Dependency: perl(DBI) for package: 7:squid-3.5.20-2.el7_3.3.x86_64
--> Processing Dependency: perl(Data::Dumper) for package: 7:squid-3.5.20-2.el7_3.3.x86_64
--> Processing Dependency: perl(Digest::MD5) for package: 7:squid-3.5.20-2.el7_3.3.x86_64
--> Processing Dependency: perl(English) for package: 7:squid-3.5.20-2.el7_3.3.x86_64
--> Processing Dependency: perl(FileHandle) for package: 7:squid-3.5.20-2.el7_3.3.x86_64
--> Processing Dependency: perl(Getopt::Long) for package: 7:squid-3.5.20-2.el7_3.3.x86_64
（略）                                         
perl-macros.x86_64 4:5.16.3-291.el7
perl-parent.noarch 1:0.225-244.el7 
perl-podlators.noarch 0:2.5.1-3.el7
perl-threads.x86_64 0:1.87-4.el7 
perl-threads-shared.x86_64 0:1.43-6.el7
squid-migration-script.x86_64 7:3.5.20-2.el7_3.3                              

>Complete!
[ec2-user@ip-172-XX-XX-XX ~]$ 

インストールが完了しました！

###設定
今回は単純にクライアントの自PCから構築するProxyサーバ経由でWebブラウジングできればいいので
設定の流れは以下の通りです。
1. プロキシサーバへ接続できるクライアントの設定
2. 該当のグループを明示的に許可、最後に拒否設定
3. ポートの設定
4. squidの再起動

####プロキシサーバへ接続できるクライアントの設定
/etc/squid/squid.confを編集します。
デフォルトでは以下のように、メジャーな内部ネットワークのアドレスが許可されています。

>/# Example rule allowing access from your local networks.
\# Adapt to list your (internal) IP networks from where browsing
\# should be allowed
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

今回は関係ないので上の記載はすべてコメントアウトし、自分のIPを調べて記載します。
>***#***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 115.XXX.XX.XX/32 #me**

####該当のグループを明示的に許可、最後に拒否設定
デフォルトでlocalnet, localhostは許可されていて、最後にdeny allがあるので確認だけ。
>\# Example rule allowing access from your local networks.
\# Adapt localnet in the ACL section to list your (internal) IP networks
\# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

>\# And finally deny all other access to this proxy
http_access deny all

####ポートの設定
squidではデフォルトで3128を待ち受けています。
>\# Squid normally listens to port 3128
http_port 3128

変更したい場合はここのポート番号を修正します。

####squidの起動
設定が完了したらファイルを保存してsquidを起動しましょう。
>[ec2-user@ip-172-XX-XX-XX ~]$ **sudo systemctl start **

ステータスの確認をします。
>[ec2-user@ip-172-XX-XX-XX ~]$ **sudo systemctl status**
>\● squid.service - Squid caching proxy
   Loaded: loaded (/usr/lib/systemd/system/squid.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-05-04 23:31:27 EDT; 5s ago
  Process: 16605 ExecStart=/usr/sbin/squid \$SQUID_OPTS -f $SQUID_CONF (code=exited, status=0/SUCCESS)
  Process: 16600 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, status=0/SUCCESS)
 Main PID: 16609 (squid)
   CGroup: /system.slice/squid.service
           tq16609 /usr/sbin/squid -f /etc/squid/squid.conf
           tq16611 (squid-1) -f /etc/squid/squid.conf
           mq16612 (logfile-daemon) /var/log/squid/access.log

>May 04 23:31:27 ip-172-XX-XX-XX.us-west-2.compute.internal systemd[1]: Starti...
May 04 23:31:27 ip-172-XX-XX-XX.us-west-2.compute.internal systemd[1]: Starte...
May 04 23:31:27 ip-172-XX-XX-XX.us-west-2.compute.internal squid[16609]: Squi...
May 04 23:31:27 ip-172-XX-XX-XX.us-west-2.compute.internal squid[16609]: Squi...
Hint: Some lines were ellipsized, use -l to show in full.
[ec2-user@ip-172-XX-XX-XX ~]$ 

ついでに自動起動の設定も入れておきます。
>[ec2-user@ip-172-XX-XX-XX ~]\$**systemctl enabled squid**
[ec2-user@ip-172-XX-XX-XX ~]$**systemctl is-enabled squid**
**enabled**


###動作確認
設定も終わりましたので、動作確認です。
IEのプロキシにこのEC2インスタンスのIPと接続ポートを入れます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/36592/21284992-216e-74b4-ba27-c8b3f65e31b2.jpeg" width=50%>

どこか適当なサイトにアクセスして、ログを確認します。
>[root@ip-172-XX-XX-XX squid]# **tail -100 /var/log/squid/access.log** 
1493956288.080     18 115.XX.XX.XX TCP_MISS/304 346 GET http://www.googletagservices.com/tag/js/gpt.js - HIER_DIRECT/216.58.193.66 -
1493956288.094     21 115.XX.XX.XX TCP_MISS/304 601 GET http://livedoor.4.blogimg.jp/karapaia_zaeega/imgs/e/b/eb45e2ee.png - HIER_DIRECT/54.230.141.124 -
1493956288.133    139 115.XX.XX.XX TCP_MISS/302 666 GET http://livedoor.blogimg.jp/karapaia_zaeega/imgs/0/0/004be9b5.jpg - HIER_DIRECT/125.6.190.4 text/html
1493956288.155    147 115.XX.XX.XX TCP_MISS/302 666 GET http://livedoor.blogimg.jp/karapaia_zaeega/imgs/5/4/54c99608.jpg - HIER_DIRECT/125.6.190.4 text/html
1493956288.167    143 115.XX.XX.XX TCP_MISS/302 666 GET http://livedoor.blogimg.jp/karapaia_zaeega/imgs/a/e/ae04335c.jpg - HIER_DIRECT/125.6.190.4 text/html
1493956288.170     27 115.XX.XX.XX TCP_MISS/304 601 GET http://livedoor.4.blogimg.jp/karapaia_zaeega/imgs/b/f/bfce72b1.png - HIER_DIRECT/54.230.141.124 -

Proxyサーバ経由でWebブラウジングができることを確認しました！

####ログフォーマットを編集
ちなみに上のログだとアクセス時刻がさっぱりわかりません…。
以前はApache形式に変換する、みたいなオプションがあったようですが
3.5でその設定は効かないようです。

そんなわけで[本家サイトのLogformatページ](http://www.squid-cache.org/Versions/v3/3.5/cfgman/logformat.html)を見て以下のように設定することにしました。

- LocalTime
- Client IP
- Squid Request Status/HTTP Status Code
- Size
- Request Method
- Request URL
- user name
- Squid Hierarchy Status Code/Destination IP
- MIME Content Type

/etc/squid/squid.confには以下のように追記。
>logformat squid      %tl %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt

squidを再起動してどこかのサイトにアクセスすると、
ログが見やすいようになりました！
>[root@ip-172-XX-XX-XX squid]# **tail -100 /var/log/squid/access.log**
05/May/2017:00:12:58 -0400 115.XXX.XX.XX TCP_MISS/200 137705 GET http://livedoor.4.blogimg.jp/karapaia_zaeega/imgs/3/0/30497336.jpg - HIER_DIRECT/54.192.117.245 image/jpeg
05/May/2017:00:12:58 -0400 115.XXX.XX.XX TCP_MISS/200 512 GET http://jsoon.digitiminimi.com/twitter/count.json? - HIER_DIRECT/210.135.97.193 text/javascript
05/May/2017:00:12:58 -0400 115.XXX.XX.XX TCP_TUNNEL/200 4856 CONNECT platform.twitter.com:443 - HIER_DIRECT/199.96.57.6 -
05/May/2017:00:12:58 -0400 115.XXX.XX.XX TCP_MISS/200 1827 GET http://optimized-by.rubiconproject.com/a/13136/73628/349040-9.js? - HIER_DIRECT/8.39.37.31 text/javascript
05/May/2017:00:12:58 -0400 115.XXX.XX.XX TCP_MISS/200 468 GET http://jsoon.digitiminimi.com/twitter/count.json? - HIER_DIRECT/210.135.97.193 text/javascript


#終わりに
ログのフォーマットに手間取らなければ、ここまで10分で十分です。
あとはディスクキャッシュ量がデフォルトで100MBなので、この辺りを変更してパフォーマンスを向上させるとか、ホスト名とかユーザエージェントなどの情報を隠すとか、いろいろできそうです。

初投稿。MardDownに慣れないとな～…(:3_\)