Proxyサーバの環境構築手順


1 はじめに

Proxyサーバとは、内部ネットワークからインターネットへの接続を中継するサーバです。
Proxyサーバの役割としては、たとえば、以下のようなものがあります。

・キャッシュによるトラフィック減少とパフォーマンス向上
・アクセス制御(例:マルウェアがアクセスするC&Cサーバへのアクセス禁止)

ここでは、SquidというProxyサーバを構築してみます。
また、パスワード認証を設定して、その動作確認をしてみます。

2 環境

VMware Workstation 15 Player上の仮想マシン(2台)を使いました。
以下の図は、クライアントのcurlコマンドからSquidを経由して、
インターネット上のサーバにアクセスしていることを表しています。
なお、図中の()内の数値は、ポート番号を表しています。

ネットワーク構成
   client                     server
+-----------+             +-----------+
|           |             |           |
| CentOS7.6 |             | CentOS7.6 |
|           |             |           |
|           |             |           |
|   curl    |             |   Squid   |
|      *    |             |   (3128)  |
|      |    |             |  A     *  |
|      |    |             |  |     |  |
|      |    |             |  |     |  |
+-- eth0 ---+             +-- eth0 ---+
 .20 | |                     | .10 |
     | |                     |  |  |
     | +---------------------+  |  +-------------------------->
     |                          |
------------------------------------------------ router ------- Internet
           192.168.3.0/24                     .1

仮想マシンの版数は、サーバ/クライアントともに以下のとりです。

CentOS版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
カーネル版数
[root@server ~]# uname -r
3.10.0-957.el7.x86_64

3 事前準備

3.1 インストール方法

サーバ側でsquidパッケージをインストールします。

サーバ側
[root@server ~]# yum -y install squid

squidの版数を確認します。

版数確認
[root@server ~]# squid -v
Squid Cache: Version 3.5.20

3.2 Squidのポート番号開放

Squidは3128番ポートでListenするので、3128番ポートへのアクセスを開放します。
なお、firewall-cmdコマンドの使い方は、ここ(firewall-cmdコマンドの使い方)を参照してください。

ポート番号の開放
[root@server ~]# firewall-cmd --add-port=3128/tcp
success

ポート番号を確認します。
3128番ポートへのアクセスが開放されていることがわかります。

ポート番号の確認
[root@server ~]# firewall-cmd --list-ports
3128/tcp

4 サーバ側設定

user1のパスワード認証を設定します。パスワードとしてtestと入力します。
設定したパスワードとユーザ名は、/etc/squid/squid.passに保存されます。

パスワードの作成
[root@server ~]# htpasswd -c /etc/squid/.htpasswd user1
New password:  <= testと入力する。
Re-type new password:  <= testと入力する。
Adding password for user user1

サーバの設定ファイルは、/etc/squid/squid.confです。
squid.confへのディレクティブ設定は、下記ページを参考にしました。
http://www.squid-cache.org/Versions/v3/3.5/cfgman/auth_param.html
ユーザ認証をするためsquid.confに以下のディレクティブ(★)を追加しました。

squid.conf設定内容
# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
-snip-
acl CONNECT method CONNECT

★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のアクセス制御の設定は、次の2段階で行います。
(1)aclディレクティブで制御対象を定義する。
(2)http_accessディレクティブでアクセス対象への許可あるいは拒否を設定する。

aclの書式
acl acl名 aclタイプ 引数
http_accessディレクティブ書式
http_access allow|deny acl名

5 Squidの起動

サーバ側でSquidを起動します。

起動
[root@server ~]# systemctl start squid

SquidがListenするポート番号を確認します。
Squidは、3128番ポートでListenしていることがわかります。
なお、lsofコマンドの使い方は、ここ(lsofコマンドの使い方)を参照してください。

ポート番号の確認
[root@server ~]# lsof -c squid -a -i -P
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
squid   19505 squid    6u  IPv6  70929      0t0  UDP *:57651
squid   19505 squid    8u  IPv4  70930      0t0  UDP *:47984
squid   19505 squid   11u  IPv6  70933      0t0  TCP *:3128 (LISTEN)

6 クライアント側設定

6.1 ユーザ登録

user1user2を登録します。

user1の登録
[root@client ~]# useradd user1
user2の登録
[root@client ~]# useradd user2

6.2 user1の環境変数設定

user1の環境で、.bashrcファイル末尾に、下記環境変数を追加しました。

環境変数の設定
[user1@client ~]$ vi .bashrc
# User specific aliases and functions
export http_proxy=http://user1:[email protected]:3128
export https_proxy=http://user1:[email protected]:3128

設定した環境変数をシステムに反映します。

環境変数の反映
[user1@client ~]$ source .bashrc

環境変数を確認します。

環境変数(http_proxy)の確認
[user1@client ~]$ echo $http_proxy
http://user1:[email protected]:3128
環境変数(https_proxy)の確認
[user1@client ~]$ echo $https_proxy
http://user1:[email protected]:3128

6.3 user2の環境変数設定

user2はパスワード認証の設定はしないので、環境変数は以下のようになります。

環境変数の設定
# User specific aliases and functions
export http_proxy=http://192.168.3.10:3128
export https_proxy=http://192.168.3.10:3128

設定した環境変数をシステムに反映します。

環境変数の反映
[user2@client ~]$ source .bashrc

環境変数を確認します。

環境変数(http_proxy)の確認
[user2@client ~]$ echo $http_proxy
http://192.168.3.10:3128
環境変数(https_proxy)の確認
[user2@client ~]$ echo $https_proxy
http://192.168.3.10:3128

7 動作確認

下記2つのユーザを使って、Squid経由で首相官邸のWebサーバにアクセスしてみます。
・user1:ID/PASS登録済
・user2:ID/PASS未登録

なお、curlコマンドの使い方は、ここ(curlコマンドの使い方)を参照してください。

7.1 user1の動作確認

首相官邸のWebサーバにアクセスすると、正常にアクセスできていることがわかります。

curlの実行結果
[user1@client ~]$ curl -I https://www.kantei.go.jp/
HTTP/1.1 200 Connection established

HTTP/1.1 200 OK
Date: Sat, 04 Apr 2020 07:08:10 GMT
X-Frame-Options: SAMEORIGIN
Last-Modified: Fri, 03 Apr 2020 11:07:52 GMT
ETag: "491a-5a260edba3417"
Accept-Ranges: bytes
Content-Length: 18714
Cache-Control: no-cache
Expires: Sat, 04 Apr 2020 07:08:10 GMT
Pragma: no-cache
Content-Type: text/html

次に、サーバ側でログを確認します。
user1がcurlを実行した場合、TCP_TUNNELと表示され、首相官邸のWebサーバへの
アクセスが許可されていることがわかります。

アクセスログの確認結果
[root@server ~]# tail -f /var/log/squid/access.log
1585984127.089    266 192.168.3.20 TCP_TUNNEL/200 3875 CONNECT www.kantei.go.jp:443 user1 HIER_DIRECT/202.214.194.138 -

なお、TCP_TUNNELとは、HTTPS通信をSquidで復号することなく、そのまま首相官邸の
Webサーバにトンネルすることを意味します。つまり、下記パターン1の動作を意味しています。
HTTPS通信を復号しないため、ウィルスチェックは行えません。

パターン1(HTTPSをトンネル)
       <--------------- HTTPS --------------->
client ------------ Proxy(Squid) ------------- Web server
                     ↑HTTPSをそのままトンネル

ウィルスチェックを行うためには、パターン2のようにProxyサーバでHTTPSを
復号/暗号化する必要があります。その際、Proxyサーバにサーバ証明書を
インストールする必要があります。

パターン2(HTTPSをトンネルしない)
       <-- HTTPS -->             <-- HTTPS -->
client ------------ Proxy(Squid) ------------- Web server
                     ↑HTTPSの復号/暗号化

7.2 user2の動作確認

首相官邸のWebサーバにアクセスすると、
Squidが、HTTP/1.1 407 Proxy Authentication Required
認証情報の入力を求めていることがわかります(期待値)。

curlの実行結果
[user2@client ~]$ curl -I https://www.kantei.go.jp/
HTTP/1.1 407 Proxy Authentication Required
Server: squid/3.5.20
Mime-Version: 1.0
Date: Sat, 04 Apr 2020 07:12:07 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3537
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 server
X-Cache-Lookup: NONE from server:3128
Via: 1.1 server (squid/3.5.20)
Connection: keep-alive

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

次に、サーバ側でログを確認します。
user2がcurlを実行した場合、TCP_DENIEDと表示され、首相官邸のWebサーバへの
アクセスが拒否されていることがわかります。

アクセスログの確認結果
[root@server ~]# tail -f /var/log/squid/access.log
1585984327.265     33 192.168.3.20 TCP_DENIED/407 3997 CONNECT www.kantei.go.jp:443 - HIER_NONE/- text/html

Z 参考情報

Linux教科書 LPICレベル2 スピードマスター問題集 Version4.5対応
squid-cache.org
WELCOME TO SQUID 3.4.0.3-20131206-r13044
Linux Proxy設定
Apache&Squidアクセス制御/ユーザー認証の設定 (2/4)
How to Create an HTTP Proxy Using Squid on CentOS 7/8