ubuntu 18.04 squid3 SSL/HTTPS Transparent proxy (SSL Bump)

1.squid3をSSL/HTTPSに対応するようリビルド

Sourceファイルをダウンロード出来るようにaptを編集

標準でaptからインストールされるsquid3はHTTPS/SSLに対応していないので、sourceをダウンロードしオプションを追加してあげることで対応する。

まずはじめに、sourceをダウンロードできるようにリポジトリをaptに追加する。

/etc/apt/sources.list

に以下を追加して、

deb-src http://jp.archive.ubuntu.com/ubuntu/ bionic main restricted

apt-get update

build用のパッケージをいくつかインストール

sudo apt install devscripts build-essential fakeroot libssl-dev libldap2-dev libpam0g-dev libdb-dev cdbs libsasl2-dev debhelper libcppunit-dev libkrb5-dev comerr-dev libcap2-dev libecap3-dev 

ソースの取得とオプションの編集

apt source squid3

実行したディレクトリの直下に「/squid3-3.5.27」というフォルダが出来る。

cd squid3-3.5.27

debian/rulesを編集。ここに「DEB_CONFIGURE_EXTRA_FLAGS」という形でオプションが書いてあるので、以下3つのオプションを追加。

--with-openssl \
--enable-ssl \
--enable-ssl-crtd \

あとは、これをビルドしてdebパッケージにする。

./configure
debuild -us -uc -b

ここで

Unmet dependencies エラーが出る場合があるが、上記のbuild用のパッケージが足りないのが原因。その都度追加してやり直す。

 

また、以下のエラーがビルド中に出ることがある。

error: ‘CRYPTO_LOCK_X509’ was not declared in this scope

 

どうもSquid 3.5はOpenSSL v1.1に対応していないのが原因

Squid - Users - Build errors with Squid 3.5.24 under Debian

sudo apt remove libssl1.0-dev
sudo apt install libssl1.0-dev

 

CA証明書の作成

下記を参照のこと。このうち、「/etc/ipsec.d/cacert/cacert.pem」「/etc/ipsec.d/private/caprivatekey.pem」を用いる。

caprivatekey.pemは、以下のコマンドで作成することが可能。

openssl rsa -in caprivatekey.der -inform der -out caprivatekey.pem

さくらVPS上のUbuntuにstrongswanでIKEv2 VPNサーバー(証明書認証)を構築する | web net FORCE



SSL用のキャッシュディレクトリ作成

以下の要領で作成。

/usr/lib/squid3/ssl_crtd -c -s ~/pki/ssl_db
sudo mv ~/pki/ssl_db /var/lib/ssl_db chown proxy:proxy -R /var/lib/ssl_db

squidの設定

/etc/squid/squid.confを開き、今回の構成にあうように設定をする。

acl all src all
acl localhost src 127.0.0.1/32
#acl localnet src 10.0.0.0/8
#acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
#acl localnet src fc00::/7
#acl localnet src fe80::/10

acl SSL_ports port 443
acl Safe_ports port 80

acl CONNECT method CONNECT


http_access allow localnet
http_access allow localhost

http_port 3178 intercept
https_port 3179 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/ipsec.d/cacerts/cacert.pem key=/etc/ipsec.d/private/caprivatekey.pem

always_direct allow all


acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl nobumpSites ssl::server_name [hostname]
ssl_bump peek step1
ssl_bump splice step2 nobumpSites
ssl_bump bump all

sslcrtd_program /usr/lib/squid3/ssl_crtd -s /var/lib/ssl_db -M 4MB


request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
reply_header_access X-Forwarded-For deny all
reply_header_access Via deny all
reply_header_access Cache-Control deny all

forwarded_for off
via off

cache_mem 1024 MB

cache_dir ufs /var/spool/squid 1024 32 512

maximum_object_size 65536 KB

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 10080 90% 43200 ignore-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(iso|avi|wav|mp3|mp4|mpeg|swf|flv|x-flv)$ 43200 90% 432000 ignore-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(deb|rpm|exe|zip|tar|tgz|ram|rar|bin|ppt|doc|tiff)$ 10080 90% 43200 ignore-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.index.(html|htm)$ 0 40% 10080
refresh_pattern -i \.(html|htm|css|js)$ 1440 40% 40320
refresh_pattern . 0 40% 40320

acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
hosts_file /etc/hosts
coredump_dir /var/spool/squid
access_log /var/log/squid/access.log squid
hierarchy_stoplist cgi-bin ?

iptablesの設定

今回、squidは80番ポート用(HTTP通信用)を3178ポートで、443ポート用(SSL通信用)を3179ポートで動かしているので、それぞれをiptablesを用いて転送するように設定。一部squidがエラーを吐き出したので、一番したの2行を追加している。

iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 80 -j REDIRECT --to-port 3178
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 3179
iptables -t filter -A INPUT -p tcp --dport 3178 -j ACCEPT #squidの"No forward-proxy ports configured"対策
iptables -t filter -A INPUT -p tcp --dport 3179 -j ACCEPT #squidの"No forward-proxy ports configured"対策