Article delegate-ja/515 of [1-661] on the server localhost:119
  upper oldest olders older1 this newer1 newers latest
search
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
[Reference:<_A513@delegate-ja.ML_>]
Newsgroups: mail-lists.delegate-ja

[DeleGate-Ja] Re: SSL リバースプロクシで SSLを MOUNT
26 Dec 2010 17:23:00 GMT ysato@delegate.org (Yutaka Sato)
The DeleGate Project


In message <_A513@delegate-ja.ML_> on 12/15/10(09:23:07)
you Shigeharu Kondo <ppiaabrv6-7pld3vr44trr.ml@ml.delegate.org> wrote:
 | 近藤です。回答ありがとうございました。
 | 早速やってみたのですが、小吉でした。
...
 |>  | 特定の SSL URL を、社内 LAN の SSL サーバへリバースプロクシ (MOUNT)
 |>  |したいと思い、実験しましたが、ブラウザからみて応答が返ってこない状況で
 |>  |す。(ie が回ったまま)
 |>  | SSL - リバース - SSL です。
 |>  |
 |>  |■ 気になる点
 |>  |(1) DeleGate の設定が間違っているか?
 |> ...
 |>  |■ DeleGate の設定
 |>  |-P443
 |>  |SERVER=https
 |>  |STLS=fcl
 |>  |MOUNT="/XXX/* https://192.168.99.99/* nvserv=server1..."
 |> 
 |> STLS=fsv:https
 |> 
 |> (HTTPSサーバに対してはSSLを適用する、の意)というのを加えると吉
 |> ではないかと思います。
 |
 |STLS=fcl,fsv:https
...
 | 上記に変更すると、https 出来ました。
 | ただ、LAN の https サーバからのレスポンスに埋め込まれた (href, action)
 |https://... が、書き換わりません。(LAN 内のアドレスのまま)
 | http://... は、書き換わっています。
 |
 | まだ、なにか、設定が不足していますでしょうか?

自分用の備忘録兼用に書きますので、説明が長くなってしまいますが、
要するに以下の★のように回避、あるいは、修正することができます。
まず、DeleGateのMOUNTは以下のように指定しますね。

  MOUNT="vURL rURL mountOptions"

ここで、mountOptions はオプショナルです。
このようなMOUNTによって、HTTP(またはHTTPS)の要求や応答に含まれる
URLの書き換えが行われます。
応答メッセージに対する書き換えの対象となるURLは、応答中のヘッダ
(Location)やボディ(HTMLであればhrefやactionやsrc)に含まれるURLです。
応答中のURLへの書き換えが行われる条件は、そのURLがMOUNTの右辺の
rURLにパターン的にマッチすることであり、マッチした場合には、左辺の
vURLに書き換えられます。
rURLのマッチングにおいて、mountOption として nvserv が指定されて
いた場合には、rURL (https://server/path のように指定される) の
サーバ部分ではなく、nvserv=a.b.c のように指定されているホスト名
によってマッチングを行います。つまり、

  MOUNT="/xxx/* https://x.x.x.x/* nvserv=a.b.c"

の場合、応答中の URL が例えば https://a.b.c/def というようなもので
あった場合、nvserv=a.b.c によりマッチングに成功し、
左辺により https://DeleGate/xxx/def に書き換えられます。

さて、問題はこの nvserv と、書き換え候補のURLのマッチングにあり
ました。nvserv=a.b.c という指定は実装上 nvserv=a.b.c[:port] の
省略形になっています。このようにポート指定を省略した場合、2つの
解釈を行うことができます。ひとつは「任意のポートのサーバにマッチ
する」ことで、もうひとつは「対象サーバのポート番号がプロトコルの
標準のポート番号であった場合にマッチする」というものです。
DeleGate/9.8.2 でこの nvserv を実装した際に、このどちらにすべきか
迷ったような記憶もあります。結局後者よりの解釈にしたようです。
というか、これはサーバに送る仮想ホスト名(Hostフィールド)の生成
にも使われるので、当然そうなるということなんでしょうね。
ところが、その際の実装が、
http://a.b.c:80 の場合にはマッチするけど、
https://a.b.c:443 の場合にはマッチしない、ようになっていました。

★ということで、9.9.8-pre19 では、同封のパッチのように修正します。
★なお、このパッチ無しで、以下のようにサーバのポート番号を明示する
 ことで回避することもできます。

  MOUNT="/xxx/* https://x.x.x.x/* nvserv=a.b.c:443"

なお「http://...は書き換わって」いるというのは不思議です。
前出のMOUNTでは、https 以外は書き換えないはずだからです。

                   9 9  
┌─┐┬┌──┬┐ //\^^ ( e ); {Do the more with the less -- B. Fuller}
├─┤│└─┐│ / 877m\_<   >_ <URL:http://www.delegate.org/delegate/>
┴ └┴──┘┴──────────────────────────────
佐藤豊@情報技術研究部門.産総研 (IEEE-CSDP, ITIL-v3-F, OCUP-A, Security+)

*** dist/src/delegate9.9.8-pre18/src/mount.c	Thu Sep 30 15:04:32 2010
--- new/mount.c	Mon Dec 27 01:17:13 2010
***************
*** 2789,2794 ****
--- 2789,2795 ----
  				/* nvserv=host */
  				if( pp = strheadstrX(vserv,host,1) ){
  					if( *pp == 0   && iport == 80
+ 					 || *pp == 0   && iport == 443
  					 || *pp == ':' && iport == atoi(pp+1)
  					){
  						goto PATHMATCH;

  admin search upper oldest olders older1 this newer1 newers latest
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
@_@V