(1)基本設定
#yum install squid  →インストール
#systemctl start squid   →サービスの起動

(2)設定ファイルの設定
①設定ファイル
#vi /etc/squid/squid.conf 

②設定内容
・ポート
http_port 3128 のポートを任意に設定(たとえば8080)

・ホスト名を設定しないとエラーがでるときがある
WARNING: Could not determine this machines public hostname ・・・と怒られるので、以下のように、適当に名前を付けましょう。

visible_hostname proxy_server

・許可するサービス(というか、接続先)
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

・デフォルト設定だと、プライベートIPアドレスのPCからしか許可されていません。
インターネット越しにクラウドプロキシみたいにつかう場合(AWSもそう)、たとえば、203.0.113.121のPCからの接続を受け付けるには
acl localnet src 203.0.113.121
と加えましょう(localnetではありませんが・・・)
→AWSの場合、GUIのセキュリティグループで設定するのであれば、以下を入れてもいいと思う。つまり、Squidではアクセス制限をしない。
http_access allow all 

(3)Firewallの設定
確認しておきましょう。
FirewallでPCからのプロキシの通信が止められているかもしれません。
以下に記載しています。
http://sm.seeeko.com/archives/21430071.html

(4)Squidのログを見てみましょう。
・/var/log/squid/access.log
 tail -f で見るといいでしょう。Web閲覧をする、ずらずらっとLOGが表示されます。
・日時、送信元IPアドレス、接続先URLなどが表示される。ただし、HTTPSの場合はCONNECTメソッドになり、FQDNまで。
・ログフォーマットは、logformat squidでsquid.confに指定する。ちょっとうろ覚えだが、時刻などが表記されなかったのではないか。以下は追加で取得したいログである。
%tl →時刻表記がわかりやすい
%>st データの要求サイズ
%<st データの応答サイズ

m/images/cleardot.gif - DIRECT/216.58.196.238 image/gif
1557126956.478     47 192.168.0.8 TCP_MISS/200 10436 GET http://sc.seeeko.com/ - DIRECT/203.104.130.159 text/html
1557126956.874     30 192.168.0.8 TCP_MISS/200 300 GET http://counter2.blog.livedoor.com/c? - DIRECT/125.6.146.22 image/gif

1557126913.361    383 192.168.0.8 TCP_MISS/200 9887 CONNECT direct.bk.mufg.jp:443 - DIRECT/104.87.68.15 -

(5)Logフォーマットの変換
ログフォーマットが、上に書いたように見づらいので、変換しましょう。
設定ファイルは以下です。
/etc/squid/squid.conf

デフォルトのlogformatの記載が無いと思われるので、以下を追加する。(本当は、デフォルトのフォーマットが記載されていて、それを変更したいですよね)

logformat squid %tl %6tr %>a %Ss/%03>Hs %>st %<st %rm %ru %[un %Sh/%<a %mt

デフォルトの内容は見えないが、以下になっている。

%ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt

今回は、以下の2つを変更
・時刻表記を変更
 %ts.%03tu → %tl
・データの要求サイズを追加 
 %>st

その結果、ログは以下のように出力されます。

[root@localhost squid]# tail -f /var/log/squid/access.log
21/Dec/2019:16:20:07 -0800     99 192.168.0.7 TCP_TUNNEL/200 238 5498 CONNECT iwiz-content.c.yimg.jp:443 - HIER_DIRECT/183.79.250.251 -
21/Dec/2019:16:20:08 -0800     72 192.168.0.7 TCP_TUNNEL/200 224 5498 CONNECT b94.yahoo.co.jp:443 - HIER_DIRECT/183.79.248.124 -

(6)認証プロキシ ~Basic認証を導入する
①PWを作る。apacheが入っている前提。そうしないと、htpasswdのモジュールが入らない
# htpasswd -c -b ./.htpasswd user1 passwd
Adding password for user user1
[root@ip-172-31-94-21 squid]# cat .htpasswd
user1:$apr1$6OCL2x38$j0TMp/W5ulVXitCKqVcIp1

②/etc/squid/squid.confを編集
#vi /etc/squid/squid.conf
全てを消して、以下の5行だけを入れても動作します。それ以外はデフォルトの設定が適用されはずです。

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/.htpasswd
auth_param basic realm proxy
acl authenticated proxy_auth REQUIRED
http_access allow authenticated
http_port 3128

※以下を参考にしました。環境が違うのでパスを直しています。
https://www.kannon.link/fuku/index.php/2018/11/03/01-51/

③再起動すればBASIC認証が適用されるはずです。
# systemctl restart squid

④ログはこちら
/var/log/squid/access.log

ユーザ認証をすると、以下のようにユーザ名もログに表示されます。
1558229766.648     71 192.168.0.7 TCP_MISS/200 10573 GET http://nw.seeeko.com/ user1 HIER_DIRECT/203.104.130.159 text/html
1558229766.881     35 192.168.0.7 TCP_MISS/200 3051 GET http://nw.seeeko.com/site.css? user1 HIER_DIRECT/203.104.130.159 text/css
※HTTPSだとCONNECTメソッドになります。

(7)X-Forwarded-For
X-Forwarded-Forを有効にするには、/etc/squid/squid.conf ファイルを変更する。
forwarded_for on
これで有効になる。(とはいえ、squidでは、デフォルトでONである。だが、この項目はsquid.confファイルには存在しない。あらかじめ書いておいてほしと思う)
これで、X-Forwarded-Forのフィールドには、通信してきた端末のIPアドレスが記載される。
また、offになると有効にならず、X-Forwarded-Forのフィールドには unknown が記載される。
そもそも、X-Forwarded-Forのフィールドを消すにはdelete であったり、設定にはいくつかある。

実際にやってみる。
①XFFがoff
# tcpdump -i eth0 dst port 80 -vvv

        GET / HTTP/1.1
        Accept: text/html, application/xhtml+xml, */*
        Accept-Language: ja
        User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
        Accept-Encoding: gzip, deflate
        If-Modified-Since: Mon, 02 Dec 2019 07:21:16 GMT
        If-None-Match: "f-598b36ce168ff"
        DNT: 1
        Pragma: no-cache
        Host: 18.177.177.50
        Via: 1.1 localhost.localdomain (squid/3.5.20)
        X-Forwarded-For: unknown
        Cache-Control: max-age=259200
        Connection: keep-alive
       
②XFFを有効にする

        GET / HTTP/1.1
        Upgrade-Insecure-Requests: 1
        User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
        Accept-Encoding: gzip, deflate
        Accept-Language: ja,en-US;q=0.9,en;q=0.8
        If-None-Match: "f-598b36ce168ff"
        If-Modified-Since: Mon, 02 Dec 2019 07:21:16 GMT
        Host: 18.177.177.50
        Via: 1.1 localhost.localdomain (squid/3.5.20)
        X-Forwarded-For: 192.168.0.7
        Cache-Control: max-age=0
        Connection: keep-alive
 
このように、通信してきた送信元のIPアドレス(192.168.0.7のWindowsPC)が記載される。
ちなみに、複数のプロキシなどを経由し、それぞれでXFFのヘッダに追記する場合、次のように、IPアドレスが順次追記されます。
X-Forwarded-For: a.a.a.a1, b.b.b.b2

862492bc 

デフォルトでONということは、どんなHTTPでも、X-Forwarded-Forの項目があるのですね?
いや、そうでもありません。上記はsquidを経由した場合のHTTPヘッダです。プロキシサーバを経由せずにWebサーバに送られるHTTPヘッダは、以下のようになります。見てもらうとわかるように、X-Forwarded-Forの項目がはありません。

GET / HTTP/1.1
Host: 18.177.177.50
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko
) Chrome/79.0.3945.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0
.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Cookie: session=d4b5c396-ebc3-4700-bac3-e931535eb758
If-None-Match: "f-598b36ce168ff"