443以外のSSLポートをSquidでプロキシするには

気がつけば随分久しぶりの更新。書き留めたいネタも溜まってしまったので、徐々にまた書いていきます。今回はSquidを使用したプロキシで、443以外のポートを使ったSSLサイトへのプロキシの仕方について。

例として、こんな状況を考えます。

  1. 目的のサイト(443以外のSSL Listenポート)はソースIP制限がされている(仮にhttps://hoge.com:12345とします)
  2. 許可されたソースIPからのアクセスになるよう、クライアントマシンからは特定のプロキシサーバを経由する
  3. クライアントマシンはプロキシサーバに対してSSHトンネリングを行う

図にすると以下のようなイメージですね(少しややこしいですが)。

この場合の動作としては、プロキシサーバが自分自身(127.0.0.1)から自身のSquidを使用し目的のサイトにWebアクセスしようとします。通常SSLで使用される標準ポートであるTCP/443番ポートであれば問題なく接続できます。が、これが標準ポートでない場合には注意が必要です。

正しくプロキシできている場合には、通常Squidのログ(/var/log/squid/access.log)には以下のように出力される。


1265165875.974 421 127.0.0.1 TCP_MISS/200 178 GET http://foo.bar.com/_pixel [^] - DIRECT/192.168.***.*** image/gif
1265165997.086 603 127.0.0.1 TCP_MISS/200 11503 GET http://foo.bar.com/ [^] - DIRECT/192.168.***.*** text/html

Squidの設定(/etc/squid/squid.conf)は、デフォルトでは以下のようになっている。


(中略)
1817 #Recommended minimum configuration:
1818 acl all src 0.0.0.0/0.0.0.0
1819 acl manager proto cache_object
1820 acl localhost src 127.0.0.1/255.255.255.255
1821 acl to_localhost dst 127.0.0.0/8
1822 acl SSL_ports port 443 563
1823 acl Safe_ports port 80 # http
1824 acl Safe_ports port 21 # ftp
1825 acl Safe_ports port 443 563 # https, snews
1826 acl Safe_ports port 70 # gopher
1827 acl Safe_ports port 210 # wais
1828 acl Safe_ports port 1025-65535 # unregistered ports
1829 acl Safe_ports port 280 # http-mgmt
1830 acl Safe_ports port 488 # gss-http
1831 acl Safe_ports port 591 # filemaker
1832 acl Safe_ports port 777 # multiling http
1833 acl CONNECT method CONNECT
(中略)
1858 # Only allow cachemgr access from localhost
1859 http_access allow manager localhost
1860 http_access deny manager
1861 # Deny requests to unknown ports
1862 http_access deny !Safe_ports
1863 # Deny CONNECT to other than SSL ports
1864 http_access deny CONNECT !SSL_ports

(中略)

上記の設定を見るとわかるが、HTTPであれば「Safe_ports」として定義されているポートレンジ(1025-65535)であれば、デフォルト設定のままプロキシの利用が可能である。ただしSSLの場合、標準利用ポートの443番以外を使用する場合には「Safe_ports」とは別に「SSL_ports」に対象ポートが含まれている必要がある。つまり、デフォルトでは443以外のSSLサイトはプロキシ利用できないことになる。この状態でアクセスをすると、Squidのログには以下のように出力され、接続エラーになる。


1265165964.543 449 127.0.0.1 TCP_DENIED/403 1356 CONNECT hoge.com:12345 - NONE/- text/html
1265165989.934 114 127.0.0.1 TCP_DENIED/403 1356 CONNECT hoge.com:12345 - NONE/- text/html
1265165992.814 509 127.0.0.1 TCP_DENIED/403 1356 CONNECT hoge.com:12345 - NONE/- text/html

さてここまで説明すれば自明だが、この場合の対処は以下のようにSSL_portsに対象ポート(今回の例では12345番)を追加すればよい。なお、設定の変更後は当然Squidの再起動が必要。


変更前: acl SSL_ports port 443 563
変更後: acl SSL_ports port 443 563 2812

正常に動作すると、ログには以下のように出力される。以上、めでたしめでたし。


1267345692.537 94 127.0.0.1 TCP_MISS/200 2258 CONNECT hoge.com:12345 - DIRECT/203.212.47.206 -