上の図のように元々ネームベースバーチャルホストを使ってサイトを振り分けるリバースプロキシ(Apache)が立ち上がっていて、その配下にSoftEtherVPNを配置したいというお話。しかし結局できませんでした。
自宅サーバーを運用しているとどうしても80番や443番ポートが足りないという事態に陥ります。Webサイトであればバーチャルホストで対処可能ですが、一般的なVPNやSSHなどはなかなかそういは行きません。そんな中、SoftEtherVPNは中身がほぼHTTPSの為リバースプロキシを通過できるんじゃないか?と思い、ぐぐって見たらやっている人が多数確認できたので自分でもやってみる事にしました。
要はリバースプロキシでSoftEtherを配下に置くだけです。SoftEtherのパケットは見た目がHTTPSなのでプロキシに対して通過性があり、リバースプロキシの配下に置けば動くんじゃないか?そう思っていました。
今回は下記のように設定しました。ポイントとしては下記が挙げられます
<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ヘッダがないようで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に従わないよくわからないリクエストを投げてきます。これではリバースプロキシは通過できません。
ネームベースのリバースプロキシでは動作しないという結論に至りました。