Hatena::ブログ(Diary)

shibainu55日記

2010-02-20

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

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

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

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

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

f:id:shibainu55:20100228172817j:image

この場合の動作としては、プロキシサーバが自分自身(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 -

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/shibainu55/20100220/1267341365