リバースプロキシ配下にSoftEther(結局できなかった)


やりたい事

tkp_GVRPJxTACbBI.png

上の図のように元々ネームベースバーチャルホストを使ってサイトを振り分けるリバースプロキシ(Apache)が立ち上がっていて、その配下にSoftEtherVPNを配置したいというお話。しかし結局できませんでした。

背景

自宅サーバーを運用しているとどうしても80番や443番ポートが足りないという事態に陥ります。Webサイトであればバーチャルホストで対処可能ですが、一般的なVPNやSSHなどはなかなかそういは行きません。そんな中、SoftEtherVPNは中身がほぼHTTPSの為リバースプロキシを通過できるんじゃないか?と思い、ぐぐって見たらやっている人が多数確認できたので自分でもやってみる事にしました。

概要

tkp_xk-npN.png

要はリバースプロキシでSoftEtherを配下に置くだけです。SoftEtherのパケットは見た目がHTTPSなのでプロキシに対して通過性があり、リバースプロキシの配下に置けば動くんじゃないか?そう思っていました。

Apacheの設定

今回は下記のように設定しました。ポイントとしては下記が挙げられます

<VirtualHost *:443>

       # バーチャルホストの設定
       # 今回vpn.nogisawa.netという架空の名前で設定を書いています。
       ServerAdmin webmaster@localhost
       ServerName vpn.nogisawa.net
       DocumentRoot /var/www/html
       ErrorLog ${APACHE_LOG_DIR}/vpn-error.log
       CustomLog ${APACHE_LOG_DIR}/vpn-access.log combined

       # SSL(サーバー側)の設定
       SSLEngine on
       <FilesMatch "\.(cgi|shtml|phtml|php)$">
          SSLOptions +StdEnvVars
       </FilesMatch>
       <Directory /usr/lib/cgi-bin>
          SSLOptions +StdEnvVars
       </Directory>
       SSLCertificateFile    /etc/tls-keys/fullchain.pem
       SSLCertificateKeyFile /etc/tls-keys/lets/privkey.pem
       Header set Strict-Transport-Security "max-age=0; includeSubDomains"

       # リバースプロキシの設定
       # 証明書のCN、期限、名前のチェックをしないオプションを加える
       SSLProxyEngine    on
       SSLProxyCheckPeerCN     Off
       SSLProxyCheckPeerExpire Off
       SSLProxyCheckPeerName   Off
       ProxyPreserveHost On
       ProxyPass / https://192.168.1.100:5555 timeout=3600

</VirtualHost>

SoftEtherにはHostヘッダがなかった

上記設定で試してみると接続を完了する事ができず。どうもSoftEtherの通信にはHostヘッダがないようでVirtuahHostによる振り分けはできなそうです。 ネームベースVirtualHostを諦めて単純なプロキシとして設定してみると接続は完了できるようになりましたが、全く通信ができません。

Apacheには下記のようなログが残ります。(長いので一部抜粋)

"POST /vpnsvc/connect.cgi HTTP/1.1" 200 5761 "-" "-"
"POST /vpnsvc/vpn.cgi HTTP/1.1" 200 931 "-" "-"
"\xff\xff\xff\xff" 400 0 "-" "-"
"POST /vpnsvc/connect.cgi HTTP/1.1" 200 5748 "-" "-"

途中まではHTTPに従ったPOSTリクエストを投げてましたが、途中で\xff\xff\xff\xffというHTTPに従わないよくわからないリクエストを投げてきます。これではリバースプロキシは通過できません。

結論:できない

ネームベースのリバースプロキシでは動作しないという結論に至りました。