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"対策