これは、なにをしたくて書いたもの?
ちょっと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
とりあえず、こんなところで。