CLOVER🍀

That was when it all began.

Squidをリバースプロキシサーバーとして使う

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

この前、Squidをインストールしてフォワードプロキシを構成してみました。

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

今度は、リバースプロキシを構成してみようと思います。最低限の設定でいってみましょう。

お題

Squidの裏にnginxを置いて、こちらにクライアントからアクセスしてみます。

環境

今回の環境は、こちら。Ubuntu Linux 18.04 LTSです。

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

Squidのバージョンは、3.5.27。

$ 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'

nginxのバージョンは、こちら。

$ nginx -v
nginx version: nginx/1.17.4

各サーバーのIPアドレスは、以下とします。

  • Squid … 172.17.0.2
  • nginx … 172.17.0.3
  • クライアント … 172.17.0.4

Squidをリバースプロキシとして設定する

では、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

設定の最初の方で、アクセス許可のためにACLの定義を行います。

acl localnet src 172.17.0.0/16

続いて、「http_access deny all」の前に定義したACLをallowで設定します。

http_access allow localnet
http_access allow localhost
http_access deny all

次に、Squidを「Accelerator / reverse proxy mode」に設定します。「http_port」で、「accel」を加えればOKです。

http_port 3128 accel

squid : http_port configuration directive

プロキシ先のサーバーの定義は、「cache_peer」で行います。

cache_peer 172.17.0.3 parent 80 0 no-query originserver

squid : cache_peer configuration directive

オリジンサーバーに単純に向けるので、typeを「parent」として転送先ポートを80、ICPはポートを0、オプションをno-queryにします。
originserverは、Acceleratorでのオリジンサーバーを指します。

ICPというのは、Internet Cache Protocolのことでキャッシュサーバー間で使用されます。RFCもあります。

http://www5d.biglobe.ne.jp/stssk/nro/rfc2186-j.txt

http://www5d.biglobe.ne.jp/stssk/nro/rfc2187-j.txt

今回は、ICPについてはパス。

これでSquidに設定を反映すれば、リバースプロキシのできあがりです。

$ curl 172.17.0.2:3128
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

この状態でもキャッシュは効くので、これを無効(オリジンサーバーへ常にアクセスさせる)にしたければ、cache denyを設定します。

acl ignore_cache urlpath_regex .+
cache deny ignore_cache

今回は、どのリクエストパスであってもキャッシュを使わないようにしました。

squid : cache configuration directive

これで、どのリクエストもオリジンサーバーまでアクセスが行われるようになります。

「/squid-internal-dynamic/netdb」?「/squid-internal-periodic/store_digest」?

ところで、この状態でSquid経由でnginxにアクセスすると、nginx側のアクセスログに、こんな感じの内容が出力されます。

172.17.0.2 - - [07/Oct/2019:14:20:24 +0000] "GET /squid-internal-dynamic/netdb HTTP/1.1" 404 153 "-" "-" "::"

「/squid-internal-dynamic/netdb」というファイルにアクセスしようとしているようです。

また、少し設定を変えると、以下のようなログが出たり。

172.17.0.2 - - [07/Oct/2019:14:31:26 +0000] "GET /squid-internal-periodic/store_digest HTTP/1.1" 404 153 "-" "-" "::"

これは、キャッシュダイジェストのリクエスト(store_digest)と、ICMP RTTデータベースへのリクエスト(netdb)を無効にすると
(nginx側に)出力されなくなくなります。

cache_peer 172.17.0.3 parent 80 0 no-query originserver no-digest no-netdb-exchange

「no-digest」でstore_digest、「no-netdb-exchange」でnetdbへのアクセスが抑止されます。

今回は複数のSquidを協調させるわけでもないので、オフにしてもよいでしょう。