技術・開発

【WSL2】にプロキシサーバー(Squid)をインストール・設定する方法と注意点

2021年8月2日

WSL2環境をプロキシサーバーとして動作させるため、「Squid」をインストールして設定を行いました。

【重要】外部からのアクセスについて
WSL2はホストOS(Windows)とIPアドレスが分離している仕様上、外部のPCからWSL2上のSquidに接続させるにはポートフォワーディング等の手間がかかります。さらに、PCを再起動するたびにWSL2のIPアドレスが変動するため、継続的な利用には不向きです。
外部PCやホストOSからの利用も想定している場合は、ネットワークが共有されるWSL1で構築することを強くオススメします。

1. 実行環境(コンピュータ情報)

今回はWSL2を利用し、Linuxのディストリビューションは「Ubuntu 20.04.2 LTS」で検証します。
※WSL2のインストール設定については、こちらの記事を参考にしてください。

root@DESKTOP-0MO29FJ:~# uname -a
Linux DESKTOP-0MO29FJ 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
root@DESKTOP-0MO29FJ:~# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

2. Squidのインストール

Ubuntuの公式パッケージにSquidが用意されているため、apt-get コマンドで簡単にインストールできます。
※ここでは事前に sudo su - でrootユーザーに切り替えて作業していますが、各コマンドの頭に sudo を付けて実行しても問題ありません。

特にエラー等も起きず、すんなりとインストールが完了するはずです。

root@DESKTOP-0MO29FJ:~# apt-get install squid
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libdbi-perl libecap3 squid-common squid-langpack ssl-cert
Suggested packages:
  libclone-perl libmldbm-perl libnet-daemon-perl libsql-statement-perl squidclient squid-cgi squid-purge resolvconf
  smbclient winbind openssl-blacklist
The following NEW packages will be installed:
  libdbi-perl libecap3 squid squid-common squid-langpack ssl-cert
0 upgraded, 6 newly installed, 0 to remove and 48 not upgraded.
Need to get 3687 kB of archives.
After this operation, 15.7 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 libecap3 amd64 1.0.1-3.2ubuntu1 [17.4 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal/main amd64 squid-langpack all 20191103-1 [167 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 squid-common all 4.10-1ubuntu1.4 [194 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal/main amd64 libdbi-perl amd64 1.643-1 [730 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal/main amd64 ssl-cert all 1.0.39 [17.0 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 squid amd64 4.10-1ubuntu1.4 [2562 kB]
Fetched 3687 kB in 3s (1195 kB/s)
Preconfiguring packages ...
Selecting previously unselected package libecap3:amd64.
(Reading database ... 32232 files and directories currently installed.)
Preparing to unpack .../0-libecap3_1.0.1-3.2ubuntu1_amd64.deb ...
Unpacking libecap3:amd64 (1.0.1-3.2ubuntu1) ...
Selecting previously unselected package squid-langpack.
Preparing to unpack .../1-squid-langpack_20191103-1_all.deb ...
Unpacking squid-langpack (20191103-1) ...
Selecting previously unselected package squid-common.
Preparing to unpack .../2-squid-common_4.10-1ubuntu1.4_all.deb ...
Unpacking squid-common (4.10-1ubuntu1.4) ...
Selecting previously unselected package libdbi-perl:amd64.
Preparing to unpack .../3-libdbi-perl_1.643-1_amd64.deb ...
Unpacking libdbi-perl:amd64 (1.643-1) ...
Selecting previously unselected package ssl-cert.
Preparing to unpack .../4-ssl-cert_1.0.39_all.deb ...
Unpacking ssl-cert (1.0.39) ...
Selecting previously unselected package squid.
Preparing to unpack .../5-squid_4.10-1ubuntu1.4_amd64.deb ...
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
Unpacking squid (4.10-1ubuntu1.4) ...
Setting up squid-langpack (20191103-1) ...
Setting up ssl-cert (1.0.39) ...
Setting up libdbi-perl:amd64 (1.643-1) ...
Setting up libecap3:amd64 (1.0.1-3.2ubuntu1) ...
Setting up squid-common (4.10-1ubuntu1.4) ...
Setting up squid (4.10-1ubuntu1.4) ...
Setcap worked! /usr/lib/squid/pinger is not suid!
invoke-rc.d: could not determine current runlevel
Created symlink /etc/systemd/system/multi-user.target.wants/squid.service → /lib/systemd/system/squid.service.
invoke-rc.d: could not determine current runlevel
Processing triggers for ufw (0.36-6) ...
Processing triggers for systemd (245.4-4ubuntu3.6) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
root@DESKTOP-0MO29FJ:~#

3. Squidの設定(squid.conf)

設定を誤ってしまった場合にすぐ元に戻せるよう、まずはオリジナル設定ファイルのバックアップ(コピー)を取っておきます。

root@DESKTOP-0MO29FJ:~# cp -a /etc/squid/squid.conf /etc/squid/squid.conf_20210801

続いて vim などのエディタで設定ファイルを開き、必要な箇所を編集します。
※今回はローカルネットワークからのアクセスを許可するため、以下の該当行(56行目付近のコメントアウト)のみ変更しています。

root@DESKTOP-0MO29FJ:~# vim /etc/squid/squid.conf
~~1188行目付近~~
# ローカルネットワークの設定
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

# SSLポートの設定
acl SSL_ports port 443

# Safe_portの設定(設定したポート以外はProxy接続を許可しない設定)
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

# https通信時などに利用されるCONNECTメソッドの設定
acl CONNECT method CONNECT

~~1391行目付近~~
# Deny requests to certain unsafe ports(Safe_ports以外のポートはproxy接続禁止)
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports(SSL通信(443ポート)以外はCONNECTメソッド利用禁止)
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*

# 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
# ★ここを変更:localnetを有効化
http_access allow localnet
http_access allow localhost

~~1906行目~~
#Proxyのポート番号を設定
# Squid normally listens to port 3128
http_port 3128
Vimの青文字が見えにくい様子
余談ですが、Vimのデフォルト設定だと「黒背景に青文字」のコメントアウトがものすごく見にくいですよね……。

設定変更が完了したら、service コマンドでSquidを起動します。

root@DESKTOP-0MO29FJ:~# service squid start
 * Starting Squid HTTP Proxy squid                                                                         [ OK ]

※なぜ systemctl コマンドを使わないのか?
WSL2で systemctl start squid を実行しようとすると、「System has not been booted with systemd as init system (PID 1). Can't operate.」というエラーが発生します。
これはエラー文の通り、WSL2の初期プロセス(PID 1)が systemd ではないことが原因です。無理やり systemd を動かす設定も可能ですが、少し手間がかかるため、今回はシンプルに service コマンドで実行しています。

4. 動作確認

別PC、もしくはホストOS(Windows)からプロキシが正常に使えるか確認します。
まずは curl コマンドの -x オプションを使ってテストしてみましょう。

root@DESKTOP-0MO29FJ:~# curl https://kaede.jp --head -x http://localhost:3128
HTTP/1.1 200 Connection established

HTTP/2 200
server: nginx
date: Sun, 01 Aug 2021 14:32:57 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
x-cached: Sun, 01 Aug 2021 14:32:57 GMT
last-modified: Sun, 01 Aug 2021 14:32:57 GMT
link: <https://kaede.jp/wp-json/>; rel="https://api.w.org/"
x-accel-expires: 86400
strict-transport-security: max-age=31536000; includeSubDomains
x-cache: MISS
access-control-allow-origin: https://kaede.jp
access-control-allow-methods: POST, GET, OPTIONS
access-control-allow-credentials: true
access-control-allow-headers: Origin, Authorization, Accept
x-frame-options: SAMEORIGIN
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
allow: GET, POST, HEAD

無事に通信できたら、Squidのアクセスログ(/var/log/squid/access.log)を確認し、アクセス履歴が残っているかチェックします。
HTTPSでの通信であるため、CONNECT メソッドとして記録されていますね。

1627828368.288   1069 127.0.0.1 TCP_TUNNEL/200 4913 CONNECT kaede.jp:443 - HIER_DIRECT/133.130.119.115 -

まとめ・雑感

WSL2でのSquidのインストールや設定自体は、パッケージ管理ツールを使って非常に簡単に完了しました。

ローカル環境内でSquidを経由させた通信テストなどを行う分には手軽で便利ですが、冒頭に記載した通り、ホストOSや外部の別PCからアクセスさせるためのプロキシサーバーとして本格的に運用しようとすると、ネットワーク分離の壁が厚くかなり大変です(需要も少なそうですね)。

WSL1でもSquidのインストール手順や難易度は同じです。もし別PCやホストOSからのアクセスを考慮したプロキシサーバーを構築したいのであれば、IPがブリッジされるWSL1での構築を推奨します。

-技術・開発
-, , , , , , ,