OSSのSquidを使ってProxyサーバを立ててみる

## はじめに
以下の記事をほぼほぼ参考にして試してみた備忘録記事です。
https://qiita.com/hana_shin/items/0f574358d040b4c60889

## dockerによりcentos7を準備する。
まずはcentos7をpullする。

```
$ docker pull centos:centos7
```

client側とserver側のコンテナに分けて起動しておく。
※ server側コンテナに関しては、後ほどsystemctlを使うために、systemdへのリンクになっているはずの/sbin/initをコンテナ起動時に実行させておいて、privileged権限を付与しておく。

```
$ docker run -it -d --privileged --name server_centos centos:centos7 /sbin/init
$ docker run -it -d --name client_centos centos:centos7
```

## サーバー側コンテナの設定
### squidのインストール

```
$ docker exec -it server_centos /bin/bash

# yum -y install squid

# squid -v
  Squid Cache: Version 3.5.20
```

### firewalldの設定
Squidのポート番号開放するためにfirewalldのポート3128番を開く。

そもそもfirewalldが入ってないので、まずはインストール。

```
# yum -y install firewalld
```

続いて起動する。

```
# systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
    Active: inactive (dead)
        Docs: man:firewalld(1)

# systemctl start firewalld

# systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
    Active: active (running) since Wed 2021-05-05 04:36:52 UTC; 18s ago
        Docs: man:firewalld(1)
    Main PID: 208 (firewalld)
    CGroup: /docker/67c6d66ed30882f8008ebddab69a4b71331c21f04cb2a1888d1d5e190cf4feae/system.slice/firewalld.service
            └─208 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
            ‣ 208 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

    May 05 04:36:51 67c6d66ed308 systemd[1]: Starting firewalld - dynamic firewall daemon...
    May 05 04:36:52 67c6d66ed308 systemd[1]: Started firewalld - dynamic firewall daemon.
    May 05 04:36:53 67c6d66ed308 firewalld[208]: WARNING: AllowZoneDrifting is enabled. This i...w.
    May 05 04:36:53 67c6d66ed308 firewalld[208]: WARNING: Failed to load nf_conntrack module: ...k'
                                                modprobe: ERROR: could not insert 'nf_conntra...ed
                                                modprobe: ERROR: Error running install command ...
    Hint: Some lines were ellipsized, use -l to show in full.
```

firewalldの自動起動を有効化

```
# systemctl enable firewalld
```

続いてその確認。

```
# systemctl is-enabled firewalld
    enabled
```

firewalldに、squidのポート番号である3128番だけ開ける

```
# firewall-cmd --add-port=3128/tcp
    success
# firewall-cmd --list-ports
    3128/tcp
```

### BASIC認証の設定
一応、proxyサーバー上で（squidの設定により）、BASIC認証もできるみたいなので真似てみた。

```
# yum -y install httpd-tools

# ls -a /etc/squid/
    .   cachemgr.conf          errorpage.css          mime.conf          squid.conf
    ..  cachemgr.conf.default  errorpage.css.default  mime.conf.default  squid.conf.default

# htpasswd -c /etc/squid/.htpasswd user1
    New password:（ここでは「test」と記述した。）
    Re-type new password:（ここでは「test」と記述した。）
    Adding password for user user1

# ls -a /etc/squid/
    .          cachemgr.conf          errorpage.css.default  squid.conf
    ..         cachemgr.conf.default  mime.conf              squid.conf.default
    .htpasswd  errorpage.css          mime.conf.default

# vi /etc/squid/squid.conf
    // 以下を追記。設定の意味は→http://www.squid-cache.org/Versions/v3/3.5/cfgman/auth_param.html
    # Example rule allowing access from your local networks.
    # Adapt to list your (internal) IP networks from where browsing
    # should be allowed
    -snip-
    auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/.htpasswd
    auth_param basic children 5 startup=5 idle=1
    auth_param basic realm Squid proxy-caching web server
    auth_param basic credentialsttl 2 hours
    acl staff proxy_auth REQUIRED

    -snip-

    #
    # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
    #
    http_access allow staff

```

### Squidの起動

```
# systemctl start squid

# yum -y install lsof

# lsof -c squid -a -i -P
    COMMAND PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    squid   300 squid    6u  IPv6 242058      0t0  UDP *:45944
    squid   300 squid    8u  IPv4 242059      0t0  UDP *:51532
    squid   300 squid   21u  IPv6 242072      0t0  TCP *:3128 (LISTEN)
// コマンドの説明は→https://qiita.com/hana_shin/items/cdc58fe8f4f7705c7a8a

```

## クライアント側コンテナの設定
BASIC認証があるのでユーザーを作成する。
まずはユーザー作成まで。

```
$ docker exec -it client_centos /bin/bash

# useradd user1

# useradd user2

# ls /home
    user1  user2
```

次にユーザー名とパスワードを環境変数http_proxyに紐づけるように設定する。
これでproxyを経由して外部にアクセスする際に自動で認証してくれる。

```
# su user1

# ls -a ~
    .  ..  .bash_logout  .bash_profile  .bashrc

# hostname -i(server_centosのコンテナ内で実行して、proxyのipを調べる。)
    172.17.0.3

# vi ~/.bashrc
    # User specific aliases and functions
    export http_proxy=http://user1:test@172.17.0.3:3128
    export https_proxy=http://user1:test@172.17.0.3:3128

# source ~/.bashrc

# echo $http_proxy
    http://user1:test@172.17.0.3:3128

# echo $https_proxy
    http://user1:test@172.17.0.3:3128

# exit
```

続いて、user2を作成する。こちらはパスワード設定をせずに設定する。

```
# su user2

# vi ~/.bashrc
    # User specific aliases and functions
    export http_proxy=http://172.17.0.3:3128
    export https_proxy=http://172.17.0.3:3128

# source ~/.bashrc

# echo $http_proxy
    http://172.17.0.3:3128

# echo $https_proxy
    http://172.17.0.3:3128

# exit
```

### 動作確認

user1で検証。
※ 以下、どのcurlコマンドを使ってもProxy経由でアクセスできる。

```
# su user1

# curl -I https://www.kantei.go.jp/
    HTTP/1.1 200 Connection established

    HTTP/1.1 200 OK
    Date: Thu, 06 May 2021 04:05:31 GMT
    X-Frame-Options: SAMEORIGIN
    Last-Modified: Wed, 05 May 2021 11:55:08 GMT
    ETag: "3f32-5c193ddca75e6"
    Accept-Ranges: bytes
    Content-Length: 16178
    Cache-Control: no-cache
    Expires: Thu, 06 May 2021 04:05:31 GMT
    Pragma: no-cache
    Content-Type: text/html

# curl -x http://user1:test@172.17.0.3:3128 https://www.kantei.go.jp/

# curl -U user1:test -x http://172.17.0.3:3128 -L https://www.google.com/
```

server_centos側でログ確認してみる。

```
# hostname -i
    172.17.0.2

# cat /var/log/squid/access.log
1620273931.858   1770 172.17.0.2 TCP_TUNNEL/200 3914 CONNECT www.kantei.go.jp:443 user1 HIER_DIRECT/202.214.194.138 -

# exit
```

次にuser2で検証。

```
# su user2
# curl -I https://www.kantei.go.jp/
    HTTP/1.1 407 Proxy Authentication Required
    Server: squid/3.5.20
    Mime-Version: 1.0
    Date: Thu, 06 May 2021 04:10:40 GMT
    Content-Type: text/html;charset=utf-8
    Content-Length: 3547
    X-Squid-Error: ERR_CACHE_ACCESS_DENIED 0
    Vary: Accept-Language
    Content-Language: en
    Proxy-Authenticate: Basic realm="Squid proxy-caching web server"
    X-Cache: MISS from 67c6d66ed308
    X-Cache-Lookup: NONE from 67c6d66ed308:3128
    Via: 1.1 67c6d66ed308 (squid/3.5.20)
    Connection: keep-alive

    curl: (56) Received HTTP code 407 from proxy after CONNECT
```

server_centos側でログ確認してみる。

```
# tail -f /var/log/squid/access.log 
    1620274240.510     62 172.17.0.2 TCP_DENIED/407 4025 CONNECT www.kantei.go.jp:443 - HIER_NONE/- text/html
```