上の図のように元々ネームベースバーチャルホストを使ってサイトを振り分けるリバースプロキシ(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に従わないよくわからないリクエストを投げてきます。これではリバースプロキシは通過できません。
ネームベースのリバースプロキシでは動作しないという結論に至りました。