CLOVER🍀

That was when it all began.

Ubuntu Linux 18.04 LTSにSquidをインストールして、フォワードプロキシサーバーとして使う

これは、なにをしたくて書いたもの?

ちょっとSquidをインストールして、簡単にプロキシサーバーとして立ててみようかな、と。

Squid

キャッシュサーバーの有名どころですね。

squid : Optimising Web Delivery

フォワードプロキシ、リバースプロキシとして利用できます。

設定が複雑なイメージがあってやや苦手な感があるのですが、ディレクティブに関するドキュメントはこちら。

Squid configuration directives

とりあえず、今回はフォワードプロキシとして簡単に設定してみます。

環境

今回の環境は、Ubuntu Linux 18.04。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:    18.04
Codename:   bionic

SquidをインストールするサーバーのIPアドレスは、192.168.33.10とします。

Squidのインストール

Squidのインストール。

$ sudo apt install squid

バージョンを確認。

$ squid -v
Squid Cache: Version 3.5.27
Service Name: squid
Ubuntu linux
configure options:  '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--libexecdir=${prefix}/lib/squid3' '--srcdir=.' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-silent-rules' 'BUILDCXXFLAGS=-g -O2 -fdebug-prefix-map=/build/squid3-VfiiQb/squid3-3.5.27=. -fstack-protector-strong -Wformat -Werror=format-security -Wno-error=deprecated -Wno-error=format-truncation -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed' '--datadir=/usr/share/squid' '--sysconfdir=/etc/squid' '--libexecdir=/usr/lib/squid' '--mandir=/usr/share/man' '--enable-inline' '--disable-arch-native' '--enable-async-io=8' '--enable-storeio=ufs,aufs,diskd,rock' '--enable-removal-policies=lru,heap' '--enable-delay-pools' '--enable-cache-digests' '--enable-icap-client' '--enable-follow-x-forwarded-for' '--enable-auth-basic=DB,fake,getpwnam,LDAP,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB' '--enable-auth-digest=file,LDAP' '--enable-auth-negotiate=kerberos,wrapper' '--enable-auth-ntlm=fake,smb_lm' '--enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,time_quota,unix_group,wbinfo_group' '--enable-url-rewrite-helpers=fake' '--enable-eui' '--enable-esi' '--enable-icmp' '--enable-zph-qos' '--enable-ecap' '--disable-translation' '--with-swapdir=/var/spool/squid' '--with-logdir=/var/log/squid' '--with-pidfile=/var/run/squid.pid' '--with-filedescriptors=65536' '--with-large-files' '--with-default-user=proxy' '--enable-build-info=Ubuntu linux' '--enable-linux-netfilter' 'build_alias=x86_64-linux-gnu' 'CFLAGS=-g -O2 -fdebug-prefix-map=/build/squid3-VfiiQb/squid3-3.5.27=. -fstack-protector-strong -Wformat -Werror=format-security -Wall' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' 'CXXFLAGS=-g -O2 -fdebug-prefix-map=/build/squid3-VfiiQb/squid3-3.5.27=. -fstack-protector-strong -Wformat -Werror=format-security -Wno-error=deprecated -Wno-error=format-truncation'

起動、停止、再起動、設定の再読込はsystemctlで行います。

$ sudo systemctl start squid

$ sudo systemctl stop squid

$ sudo systemctl restart squid

$ sudo systemctl reload squid

停止にやたら時間がかかりますが、これは「shutdown_lifetime」で設定することができます(最後に載せます)。

設定してみる

この方法でインストールされた、デフォルトのSquidの設定はこちら。

$  grep -v '^#' /etc/squid/squid.conf | grep -v '^$'
acl SSL_ports port 443
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
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp:       1440    20% 10080
refresh_pattern ^gopher:    1440    0%  1440
refresh_pattern -i (/cgi-bin/|\?) 0 0%  0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .       0   20% 4320

今回、ポート8080でリッスンし、192.168.0.2のクライアントからアクセスすることができるプロキシサーバーとして設定して
みましょう。

リッスンポートの設定は、「http_port」で指定します。

http_port 8080

デフォルトは、3128でした。

「localnet」という名前で、指定のCIDRからのアクセスを許可するためのACLを定義します。

acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

これを、「http_access」ディレクティブで許可します。

http_access allow localnet

この記述は、次の行よりも前に書くようにしましょう。

http_access deny all

これで、Squidをリロードします。

$ sudo systemctl reload squid

確認

それでは、確認してみましょう。

ところで、Squidには以下の2つのログがあります。「access.log」は、アクセスログですね。今回、こちらを使って確認しましょう。

$ sudo ls -1 /var/log/squid
access.log
cache.log

HTTPSでのアクセス。

$ https_proxy=http://192.168.33.10:8080 curl -I https://www.google.com
HTTP/1.1 200 Connection established

HTTP/2 200 
date: Thu, 03 Oct 2019 15:23:33 GMT
expires: -1
cache-control: private, max-age=0
content-type: text/html; charset=ISO-8859-1
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=2019-10-03-15; expires=Sat, 02-Nov-2019 15:23:33 GMT; path=/; domain=.google.com; SameSite=none
set-cookie: NID=188=BqXO54g8aSDgUlMjx2RB9J1rLJ6-xmDZ1YdaSMdC1CAG4yC5i5UsR8EaqLlviW-lXljaEgRgq8aRvkOZxxYFkTpZzdgNLedxDUFq_5B3I3GVZMwoFD7GeW5W77KwD99QjGv64U-L3uWyRitJBpU1XkNcb_2UaJDe8QWJf5V8mgc; expires=Fri, 03-Apr-2020 15:23:33 GMT; path=/; domain=.google.com; HttpOnly
alt-svc: quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
accept-ranges: none
vary: Accept-Encoding

アクセスログを見ると、CONNECTメソッドでの利用が確認できます。

1570116213.753    121 192.168.33.1 TCP_TUNNEL/200 3936 CONNECT www.google.com:443 - HIER_DIRECT/172.217.31.164 -

ところで、CONNECTメソッドが使えるのは、次の設定があるからです。

acl SSL_ports port 443

acl CONNECT method CONNECT

http_access deny CONNECT !SSL_ports

プロキシ先が443ポートの場合に、CONNECTメソッドが利用できるようにデフォルトで設定されています。実際にはこの後に続くACL、http_accessの
設定で、プロキシサーバーを利用できる対象が絞り込まれますが。

HTTPでのアクセス。

$ http_proxy=http://192.168.33.10:8080 curl -I http://www.metro.tokyo.jp/

こちらもOKです。

1570116307.024     28 192.168.33.1 TCP_MISS/200 466 HEAD http://www.metro.tokyo.jp/ - HIER_DIRECT/27.110.42.248 text/html

ちなみに、もう1回アクセスすると、キャッシュヒットします。

1570116312.059      0 192.168.33.1 TCP_MEM_HIT/200 472 HEAD http://www.metro.tokyo.jp/ - HIER_NONE/- text/html

HTTPでのアクセスについては、こちらの設定ですね。

acl Safe_ports port 80        # http

〜省略〜

http_access deny !Safe_ports

「Safe_ports」として定義されたACL以外のリモートポートへのプロキシは拒否するようになっています。加えて、後続のACL、http_accessの設定が
合わせて評価されるのも、CONNECTメソッドの時と同じですね。

アクセスログのフォーマットを変更する

ところで、このアクセスログのフォーマットは読みづらいですね。

デフォルトのフォーマットは、こちら。

access_log daemon:/var/log/squid/access.log squid

「common」というフォーマットに変更してみましょう。

access_log daemon:/var/log/squid/access.log common

こんな感じになります。

192.168.33.1 - - [03/Oct/2019:15:28:25 +0000] "HEAD http://www.metro.tokyo.jp/ HTTP/1.1" 200 474 TCP_MEM_HIT:HIER_NONE

この時のフォーマットは、こちら(事前定義してあります)。

logformat common     %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh

続いて、「combined」。

access_log daemon:/var/log/squid/access.log combined

この場合、こんな感じのフォーマットになります。

192.168.33.1 - - [03/Oct/2019:15:29:44 +0000] "HEAD http://www.metro.tokyo.jp/ HTTP/1.1" 200 474 "-" "curl/7.58.0" TCP_MEM_HIT:HIER_NONE

フォーマットは、こちら(これも事前定義済みです)。

logformat combined   %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh

シャットダウン時にかかる時間を短くする

インストールしたままの状態では、Squidの停止、再起動は異様に時間がかかります。

$ sudo systemctl stop squid

$ sudo systemctl restart squid

これは、「shutdown_lifetime」のデフォルト値が30秒だからです。

shutdown_lifetime 30 seconds

これを縮めると、停止にかかる時間が短くなります。

shutdown_lifetime 5 seconds

とりあえず、こんなところで。