【AWS メモ⑥】プロキシサーバの構築(Squid3.5)

Squid3.5を仕事で使う機会があったので備忘録的なものを残しておく。


## 前提

以下の環境で実行。



サブネット

| サブネット名   | ルートテーブル設定                        |
| -------------- | ----------------------------------------- |
| public-subnet  | ・local                                   |
| private-subnet | ・local<br />・インターネットゲートウェイ |



セキュリティグループ

| セキュリティグループ名 | 設定                                                         |
| ---------------------- | ------------------------------------------------------------ |
| public-sg              | ・社内グローバルIPアドレスからのアクセスを許可(ポート22)<br />・public-sgからのアクセスを許可(ポート3128) ※ Squidのポート |
| private-sg             | ・public-sgからのアクセスのみ許可(ポート22)                  |



EC2

| ホスト名       | OS             | セキュリティグループ |
| -------------- | -------------- | -------------------- |
| proxy-server   | Amazon Linux 2 | public-sg            |
| private-server | Amazon Linux 2 | private-sg           |



Squidの動作モードは、フォワードプロキシで行い、プライベートサブネット内のEC2のパッケージ更新は、Squidをインストールしたプロキシサーバーを中継して行う。

![スクリーンショット 2019-09-12 12.34.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180939/b48fb6b2-8dec-1ce9-680c-9f17963eb3b1.png)


## プロキシサーバーの設定

proxy-server にSquid3.5をインストールする。

```console
$ sudo yum install squid -y
```



自動起動を有効にする。

```
$ sudo systemctl enable squid
```



### 設定方法①

管理するサーバーの台数やサブネットの数が少ない場合は、Squidの設定ファイルに直接対象のIPアドレスまたはサブネットのCIDRを記述することがある。



Squidの設定ファイルを開く。

```console
$ sudo vi /etc/squid/squid.conf
```



設定ファイルに、以下の設定を追加する。

ここでは、プライベートサブネットからのすべてのアクセスを許可する。

```console
# 追加: プライベートサブネット用の変数を作成
acl private-subnet src <プライベートサブネットのCIDR>
# 追加: プライベートサブネットからのアクセス許可
http_access allow private-subnet
```



ポート番号の指定（デフォルトでは3128）

```console
# Squid normally listens to port 3128
http_port 3128
```



設定完了後、サービスを再起動する。

```console
$ sudo service squid restart
```



### 設定方法②

設定方法①とは異なり、サーバーの台数やサブネットの数が多い場合に管理をし易くするために、ホワイトリストという外部ファイルを用意する方法がある。



以下のファイルを作成する。

```console
$ sudo vi /etc/squid/acl/whitelist.txt
```



プロキシを経由したいサーバーのプライベートIPアドレスまたは、サブネットのCIDRを記述する。

```console
プライベートサブネットのCIDR
サーバーのプライベートIPアドレス
サーバーのプライベートIPアドレスその2
		・
		・
```



作成した外部ファイルを設定ファイルで読み込むように設定する。

```console
$ sudo vi /etc/squid/squid.conf
```



以下の設定を追加する。

```bash
# 外部ファイルを読み込み、変数を生成
acl Whitelist dstdomain "/etc/squid/acl/Whitelist.txt"
# 外部ファイルに設定されたサーバー、サブネットからのアクセスを許可
http_access allow Whitelist
http_access deny all
```



設定完了後、サービスを再起動する。

```console
$ sudo service squid restart
```



## プライベートサーバーの設定

プロキシサーバーを経由して、アクセスするためにyumとwgetの設定ファイルにプロキシ設定を行う。



### yumの設定

設定ファイルを開く。

```console
$ sudo vi /etc/yum.conf
```



プロキシ設定を追加する。（ポート番号はSquidのデフォルト）

```console
proxy=http://<プロキシサーバーのプライベートIPアドレス>:3128
```



### wgetの設定

設定ファイルを開く。

```console
$ sudo vi /etc/wgetrc
```



プロキシ設定を追加する。（ポート番号はSquidのデフォルト）

```console
http_proxy=http://<プロキシサーバーのプライベートIPアドレス>:3128/
https_proxy=http://<プロキシサーバーのプライベートIPアドレス>:3128/
ftp_proxy=http://<プロキシサーバーのプライベートIPアドレス>:3128/
```



## 動作確認



プライベートサーバーでパッケージのインストールを行う。

```cosole
$ sudo yum install vim
```



wgetの動作も確認する。

```console
$ wget -pkK https://www.gnu.org/software/wget/
```



## おまけ①：ログフォーマットの設定

プライベートサーバーからのアクセスがあると、プロキシサーバーにログが保存される。



```console
$ sudo vi /var/log/squid/access.log
```



デフォルトの設定だと、アクセス時刻がわかりづらい。

```
1568267525.352   1183 xxx.xx.xx.xx TCP_TUNNEL/200 19161 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
1568267525.946    591 xxx.xx.xx.xx TCP_TUNNEL/200 4197 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
1568267526.558    610 xxx.xx.xx.xx TCP_TUNNEL/200 6509 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
1568267527.168    609 xxx.xx.xx.xx TCP_TUNNEL/200 7403 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
1568267527.919    748 xxx.xx.xx.xx TCP_TUNNEL/200 19351 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
1568267528.520    600 xxx.xx.xx.xx TCP_TUNNEL/200 5569 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
1568267529.211    689 xxx.xx.xx.xx TCP_TUNNEL/200 11569 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
1568267529.817    603 xxx.xx.xx.xx TCP_TUNNEL/200 6385 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
```



ログフォーマットの設定は、Squidの設定ファイルに追加する。

```console
$ sudo vi /etc/squid/squid.conf
```



[こちら](http://www.squid-cache.org/Versions/v3/3.5/cfgman/logformat.html) を参考にログの設定を追加する。

```console
logformat squid [%{%Y/%m/%d.%H:%M:%S}tl] %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
```



追加したらサービスを再起動して、再度ログの出力確認をする。

```
$ sudo service squid restart
```



```
$ sudo cat /var/log/squid/access.log
```



ログフォーマットが変わっていることを確認する。

```console
[2019/09/12.06:16:28] xxx.xx.xx.xx TCP_TUNNEL/200 19161 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
[2019/09/12.06:16:29] xxx.xx.xx.xx TCP_TUNNEL/200 4197 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
[2019/09/12.06:16:29] xxx.xx.xx.xx TCP_TUNNEL/200 6509 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
[2019/09/12.06:16:30] xxx.xx.xx.xx TCP_TUNNEL/200 7403 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
[2019/09/12.06:16:31] xxx.xx.xx.xx TCP_TUNNEL/200 19351 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
[2019/09/12.06:16:31] xxx.xx.xx.xx TCP_TUNNEL/200 5569 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
[2019/09/12.06:16:32] xxx.xx.xx.xx TCP_TUNNEL/200 11569 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
[2019/09/12.06:16:32] xxx.xx.xx.xx TCP_TUNNEL/200 6385 CONNECT www.gnu.org:443 - HIER_DIRECT/209.51.188.148 -
```



## おまけ②：リクエストヘッダーの設定

リクエストヘッダーに情報を載せたくない場合、設定で無効にできる。



設定ファイルを開く。

```console
$ sudo vi /etc/squid/squid.conf
```



以下の設定を追加することで無効にできる。

```console
request_header_access Referer deny all
```


## おまけ③：Gitのプロキシ設定

以下のコマンドを実行する。

```console
$ git config --global http.proxy http://<プロキシサーバーのプライベートIPアドレス>:3128
$ git config --global https.proxy http://<プロキシサーバーのプライベートIPアドレス>:3128
```


## おまけ④：Curlのプロキシ設定

以下のコマンドを実行する。

```console
$ echo 'proxy = "http://<プロキシサーバーのプライベートIPアドレス>:3128"' >> ~/.curlrc
```