彷徨えるフジワラ

年がら年中さまよってます

Squid@Cygwin で HTTP Proxy

とある事情から、MS-Windows 上で HTTP Proxy を動かす必要が。

CgywinSquid の場合、「動かない」という話もあるけれど:

  • 随分古い版の Cygwin での稼動報告(独自ビルド版?)
  • サービス化の可否の話と混じっている

という感じで、最新の Cygwin 上で単に HTTP Proxy として稼動させる分には特に問題無いような予感が。ApacheX Window サーバをちゃんと動くようにしてバイナリ配布している連中が、動かない Squid を放置しているとは思えない、という推測の元での話だけど。
兎にも角にも CygwinSquid を入手して、設定ファイルの検討に着手。

…………うぇー、長い〜。

セキュリティと性能を両立させる必要があるわけだから、仕方無いと言えば仕方無い話なのだが。

とりあえず方針は 2 つ。

  • キャッシュはしない(必要無い+余計な地雷を踏みたくない)
  • 外部ホストの ssh ポートに対して CONNECT メソッドを発行したい

前者に関しては:

@@ -2372,9 +2382,8 @@
 #      NOT be cached.
 #
 #      Default is to allow all to be cached
-#We recommend you to use the following two lines.
-acl QUERY urlpath_regex cgi-bin \?
-cache deny QUERY
+acl ANY_URL url_regex .
+cache deny ANY_URL
 
 #  TAG: refresh_pattern
 #      usage: refresh_pattern [-i] regex min percent max [options]

こんな感じで、全ての URL へのアクセスを cache deny してしまおうかと。

他にも、キャッシュ格納先指定での消費量制限や、キャッシュ対象のサイズ上限/下限指定とかも念のために調整しているけど、多分上記の設定でキャッシュレス化してくれるんじゃないかな?

後者に関しては:

@@ -575,9 +575,11 @@
 acl manager proto cache_object
 acl localhost src 127.0.0.1/255.255.255.255
 acl to_localhost dst 127.0.0.0/8
-acl SSL_ports port 443
+acl Secure_ports port 22    # ssh
+acl Secure_ports port 443   # https
 acl Safe_ports port 80      # http
 acl Safe_ports port 21      # ftp
+acl Safe_ports port 22      # ssh
 acl Safe_ports port 443     # https
 acl Safe_ports port 70      # gopher
 acl Safe_ports port 210     # wais
@@ -617,15 +619,18 @@
 # Deny requests to unknown ports
 http_access deny !Safe_ports
 # Deny CONNECT to other than SSL ports
-http_access deny CONNECT !SSL_ports
+http_access deny CONNECT !Secure_ports
 #
 # We strongly recommend the following be uncommented to protect innocent
 # web applications running on the proxy server who think the only
 # one who can access services on "localhost" is a local user
-#http_access deny to_localhost
+http_access deny to_localhost
 #
 # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
 
+# "allow Safe_ports" also includes "allow CONNECT Secure_ports"
+http_access allow Safe_ports
+
 # Example rule allowing access from your local networks. Adapt
 # to list your (internal) IP networks from where browsing should
 # be allowed

こんな感じで。

当初の設定では、デフォルトで入っている"http_access deny !Safe_ports" 記述で deny されるのを失念していて、Safe_portsssh を加え忘れていたため、ssh ポートへの CONNECT が全く受け付けてもらえなかったのは内緒。

幾つかのページを Squid 経由でブラウジングしてから、キャッシュ領域をチェックした限りでは、キャッシュファイルは格納されていなかったので、キャッシュレス化はとりあえず上手く行っている模様。

但し、Squid は名前解決の際に直接 DNS に問い合わせに行くらしく、Windows 上で直接解決して欲しい名前がある場合は上手く機能しない。

応答性能とかを考えたら、そういった仕組みも仕方無いとは言えるけど、今回の用途的にはそれは勘弁して欲しいんだよなぁ。

とりあえず、ホスト名とアドレスの関係は固定的であることがわかっているので、アドレス〜ホスト名の対応を /etc/hosts 形式で書いたファイルを、hosts_file 設定で指定することで解決。

最初からアドレスを直接使用すれば良いのでは?

という話も有って、確かに sshftptelnetのようなサービスであればそれでも十分なのだけど、イマドキの WEB サーバはHTTP の Host ヘッダを使ったホスティングをやっていることが多々あるため、アドレス直打ちだと「あなたの予想に反して〜」という Apache のトップページが表示されて終わり、みたいなことになるんだよなぁ。

この Squid の挙動だと、MS-Windows ネイティブなバイナリでも自前で DNS を引きに行っちゃうだろうから、今回の用途的には駄目な予感が。

stone を使おうかとも思ったけど:

  • Linux 向け設定を始め、Cygwin と互換性のある設定が無い
  • 現時点で最新の VC++ (無償ダウンロード可能な奴ね)だとコンパイルできない

ということで、そもそもビルドするのが茨の道っぽいので、今回はパス。

簡素さから言うと、Squid よりもこっちの方が目的には向いているんだけどなぁ。