Proxyサーバーの構築手順

# はじめに

* 職場で社内用の各種サーバーの管理を任されることになったので、まずは簡単そうなものから構築できるようになろうと考え、第二弾としてSquidを使ったProxyサーバーを立ててみました。
* この記事は構築手順をまとめたものとなりますが、あくまでも「学習用」としてProxyサーバーを構築したので、このままの設定などで本番用としては使えないかもしれません。
* Proxyそのものについては、[こちらの記事](https://www.infraexpert.com/study/security23.html)をご覧ください。

# 全体像

* AWS上にsquidを使ったProxyサーバーを立てて、自宅の開発用PC（クライアントPC）がProxy経由でインターネットを利用する形にします。

![Proxyサーバーの構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/5b8b4ba9-8380-f65f-dd97-64f93e361621.png)

# テストに使用した環境

* クライアント（※既存の端末）がCentOS7ですが、Proxyサーバー側はあえてRocky Linuxを使ってみました。
  * 技術的にRocky Linuxが必要ということではなく、単にRocky Linuxを使ってみたかったというだけです。

## Proxyサーバー

* 仮想マシン
  * AWSのEC2インスタンス（t3a.nano）
* OS
  * Rocky Linux release 8.4 (Green Obsidian)
* Proxy
  * squid 4.11
 
## クライアントPC

* OS
  * Windows 10 Pro (21H1)

#サーバー側の設定

## 仮想マシンの作成

* Rocky Linuxの仮想マシンを作った後、セキュリティグループに以下のインバウンドルールを追加しました。
  * クライアントPCからProxyサーバーへの接続に必要な設定となります。

|タイプ|プロトコル|ポート範囲|ソース|
|---|---|---|---|
|カスタム TCP|TCP|3128|自宅のグローバルIP|

## firewalldの設定

* AWSやAzureを使う場合はセキュリティグループの設定で十分だと思いますが、オンプレ環境を使う場合はファイアウォールの設定が必要になると思います。
* 最初にfirewalldをインストールして、firewalldを起動しておきます。

```
[rocky@ip-10-0-1-29 ~]$ sudo yum install firewalld

[rocky@ip-10-0-1-29 ~]$ sudo systemctl start firewalld
[rocky@ip-10-0-1-29 ~]$ sudo systemctl enable firewalld
[rocky@ip-10-0-1-29 ~]$ sudo firewall-cmd --state
running
```

* 次にfirewalldで通信を許可されているサービスを確認します。
  * ここでは、servicesにsquidが入っていないはずです。

```
[rocky@ip-10-0-1-29 ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ntp ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

* 通信を許可するサービスにsquidを追加して、設定内容を確認します。
  * 設定後は、servicesにsquidが入っているはずです。

```
[rocky@ip-10-0-1-29 ~]$ sudo firewall-cmd --add-service=squid --zone=public --permanent
success
[rocky@ip-10-0-1-29 ~]$ sudo firewall-cmd --add-service=squid --zone=public
success
[rocky@ip-10-0-1-29 ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ntp squid ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

## Proxy用ポートとキャッシュディレクトリの設定

* squid.confを開いて、Proxy用のポートとキャッシュディレクトリの設定をします。
  * Proxy用ポートは、デフォルトの3128を利用しました。
  * コメントを外して、`/var/spool/squid`をキャッシュディレクトリとして指定しました。

```
[rocky@ip-10-0-1-29 ~]$ sudo vi /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 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
# Add 2021.10.20
acl localnet src {自宅のグローバルIP}  ←★追記
...
# 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
...
# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/spool/squid 100 16 256  ←★コメント解除
...
--------------------------------------------------------------------------------
```

## squidの起動と動作確認

* 以下のコマンドでsquidを起動します。

```
[rocky@ip-10-0-1-29 ~]$ sudo systemctl start squid
```

* 続けて、`squidclient`による動作確認を行います。
  * 今回は`https://www.google.com/?hl=ja`のコンテンツを取得できるかを確認しました。

```
[rocky@ip-10-0-1-29 ~]$ squidclient --host localhost --port 3128 https://www.google.com/?hl=ja
HTTP/1.1 200 OK
Link: </?hl=ja>;rel="canonical"
Date: Wed, 20 Oct 2021 07:16:57 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Shift_JIS
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2021-10-20-07; expires=Fri, 19-Nov-2021 07:16:57 GMT; path=/; domain=.google.com; Secure
Set-Cookie: NID=511=PbamSWJldqaFuwVkgKD6FDuJM7GPAoVT0pYerkRqUK_wHeMeiD8EiCDdANQXC-HJD3D_YfRJtVOrzCGil_7ixPO8vKclFbWNji7Z-MvdEyvaQ0YGr3qNp7RnvfKHF1nam7gUi__NU0mBAUPQDpYLIE4oK8T932hGrfR0aR9DRUE; expires=Thu, 21-Apr-2022 07:16:57 GMT; path=/; domain=.google.com; HttpOnly
Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
Accept-Ranges: none
Vary: Accept-Encoding
X-Cache: MISS from ip-10-0-1-29.ap-northeast-1.compute.internal
X-Cache-Lookup: MISS from ip-10-0-1-29.ap-northeast-1.compute.internal:3128
Via: 1.1 ip-10-0-1-29.ap-northeast-1.compute.internal (squid/4.11)
Connection: close

<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="
```

# クライアント側の設定

* ［設定］>［ネットワークとインターネット］>［プロキシ］と進み、ProxyサーバーのグローバルIPと、先程に設定したポート番号を指定します。
* プロキシの設定が完了したら、任意のWebページを開けるか確認します。

![proxy_setting_windows.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/59a5de40-c764-72bd-3e1a-10d707d849c9.png)



# アクセスログの確認

* `/var/squid/access.log`を開いて、アクセスログが記録されていることを確認します。
* 以下の例では、最初の4行はsquidclientによるテストのログで、後半の行は実際にブラウザからアクセスした際のログとなります。

```
[rocky@ip-10-0-1-29 ~]$ sudo vi /var/log/squid/access.log
--------------------------------------------------------------------------------
1634712268.755    195 ::1 TCP_MISS/200 16038 GET https://www.google.com/? - HIER_DIRECT/216.58.220.132 text/html
1634714217.192    186 ::1 TCP_MISS/200 16014 GET https://www.google.com/? - HIER_DIRECT/142.251.42.132 text/html
1634715022.390    203 ::1 TCP_MISS/200 16005 GET https://www.google.com/? - HIER_DIRECT/142.250.196.100 text/html
1634716541.909    193 ::1 TCP_MISS/200 16046 GET https://www.google.com/? - HIER_DIRECT/172.217.175.100 text/html
1634720435.630    224 {自宅のグローバルIP} TCP_TUNNEL/200 44671 CONNECT www.yahoo.co.jp:443 - HIER_DIRECT/183.79.250.123 -
1634720442.559    233 {自宅のグローバルIP} TCP_TUNNEL/200 44716 CONNECT www.yahoo.co.jp:443 - HIER_DIRECT/183.79.250.123 -
1634720510.470     52 {自宅のグローバルIP} TCP_TUNNEL/200 191 CONNECT servedby.flashtalking.com:443 - HIER_DIRECT/209.197.3.19 -
1634720510.491    124 {自宅のグローバルIP} TCP_TUNNEL/200 1097 CONNECT servedby.flashtalking.com:443 - HIER_DIRECT/209.197.3.19 ---------------------------------------------------------------------------------
```

# 参考URL

* [Squidをインストールして設定してみた話](https://blog.serverworks.co.jp/squid)
* [プロキシサーバとは](https://www.infraexpert.com/study/security23.html)

※上記以外に、[標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド](https://www.amazon.co.jp/dp/B06XSWVL55)も参考にしました。