カテゴリー
FreeBSD

FreeBSDでLet’s Encryptな証明書でSoftEtherサーバを立てる

お出かけ先のWindows PCやAndroidスマホから、SSL-VPNを使いたいことが多々ありまして、VPNサーバを立ててます。

使い方として多いのは、カフェやファミレスのフリーWifiを生で使いたくないときや、腐ったWebプロキシ(だがSSLは空いている)を強制されてしまったときとか。

SoftEtherを選んでいるのは?

まず腐ったWifi環境を通過しないと行けないので、IPsecベースのものは使えないことが多いです。PPTP等もWebプロキシは越えられないので、SSLベースで構成されているVPNソフトウェアとなります。

あと、Windows PCに余計なソフトウェアを入れずに使えることも大事です。OpenVPNクライアントとか入れてたら、明らかにVPN使っているな感が出てしまって穏便な感じから遠ざかってしまいます。その点、SoftEtherでSSTPを喋らせておくと、Windowsの標準的なVPN設定だけで接続を構成出来ます。これ、すごい大事。

Androidスマホだと、SSTP VPN Clientってソフトを入れてます。色んなVPNソフトウェアがあるんですが、逆に通信を盗聴されるなんていうマルウェアもどきなものもあるのでこの辺は慎重に選ぶ必要がありますが。

FreeBSDベースを選んだわけは?

FreeBSDを使いたいから。いや、SoftEtherがpkgの中に入っているからインストールが楽なんですよ。
海外だとOpenVPNが主流なのもあって、なかなかパッケージマネージャの対象になっているのが少ないんですよね。

FreeBSDをインストールする

私は家に余ってたHyper-V上の仮想マシンに、ISOイメージからFreeBSDをインストールしました。

ここでのポイントは仮想NICを2個接続しておくことです。
VPNトンネル終端として受け付けるためのインターフェースと、カプセル化を解除したパケットを出すためのインターフェースは別である必要があります。
(画像はhr0とhr1の2つのNICが繋がっているの図)

OSインストールが終わったら、pkgコマンドでSoftEtherをインストールしておきます。

pkg install softether

インストールが終わったら、rc.confに自動起動の設定をしておきます。

vi /etc/rc.conf
softether_server_enable="yes"
softether_bridge_enable="yes"

SoftEtherを構成する

FreeBSDのシェル上で、vpncmdコマンドを使ってずっと構成しても委員ですが、、、、さすがに分かりにくい場合が多いので、適当なWindowsマシンにSoftEther管理ツールを入れてGUIで設定するのをおすすめします。
※初回設定したときは特に画面キャプチャも取らずに1年くらい前にやったのでもううろ覚えです。

SoftEther VPNサーバ管理マネージャの接続画面
新しい接続設定からVPNサーバのIPアドレスを指定して接続できる。
※初回接続時はパスワードの設定を求められる
SoftEther VPNサーバ管理マネージャのメイン画面
SSTPの設定は画面下部のOpenVPN/MS-SSTP設定から

ローカルブリッジは、外側がhr0で、内側がhr1だと下画面のような設定になる。(外に持ち出したPC等インターネット上からはhr0に着信する場合)

証明書周りは初期設定ウィザードで一度設定してもらっても良いですが、この後Let’s Encryptで発行したもので置き換えるのでどっちでも良いです。

Let’s Encryptの導入と証明書作成

Let’s Encryptで証明書を発行し、定期的に更新するためにcertbotを利用します。

pkg install py36-certbot

で、certbotを使って証明書を発行してもらいます。
※初回実行時はもっとLet’s Encryptアカウントの設定とかいろいろあった気がします。(が、このブログを書いている時はその当時の操作ログが見つからないので割愛)

# certbot-3.6 certonly

Saving debug log to /var/log/letsencrypt/letsencrypt.log
How would you like to authenticate with the ACME CA?
 1: Spin up a temporary webserver (standalone)
 2: Place files in webroot directory (webroot)
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Plugins selected: Authenticator standalone, Installer None
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c' to cancel):  vpn.example.com
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for vpn.example.com
Waiting for verification…
Cleaning up challenges
IMPORTANT NOTES:
 Congratulations! Your certificate and chain have been saved at:
 /usr/local/etc/letsencrypt/live/vpn.example.com/fullchain.pem
 Your key file has been saved at:
 /usr/local/etc/letsencrypt/live/vpn.example.com/privkey.pem
 Your cert will expire on 2020-05-09. To obtain a new or tweaked
 version of this certificate in the future, simply run certbot
 again. To non-interactively renew all of your certificates, run
 "certbot renew"
If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
Donating to EFF:                    https://eff.org/donate-le

# 

Let’s Encryptの証明書をSoftEtherに設定する

さて、証明書を発行してもそのままではSoftEtherは利用出来ません。Apache HTTPd Serverやnginxだとcertbotが証明書を配してサービスの再起動までセットで対応してくれるのだと思いますが、さすがにSoftEtherまでは対応していません。

SoftEther VPNサーバ管理マネージャのGUI上から手動で証明書を設定しても良いですが、それは更新忘れが必ず発生します。なので、自動化します。

vi renew_cert_softether.sh

#!/bin/sh
certbot-3.6 renew
vpncmd localhost:5555 /server /password:P@ssw0rd /CMD ServerCertSet /LOADCERT:/usr/local/etc/letsencrypt/live/vpn.example.com/fullchain.pem /LOADKEY:/usr/local/etc/letsencrypt/live/vpn.example.com/privkey.pem

まぁ、見たままですが、

  1. certbotで証明書を更新する (renew)
  2. vpncmdで、SoftEtherのサービスにSSL証明書を読み込ませる (LOADCERT&LOADKEY)

といった流れで実行させています。

おまけ: Windows 10でのSSTP VPNセットアップ

VPNの種類で、”Secure Socket トンネリング プロトコル (SSTP)”を選んで、ホスト名、ユーザ名、パスワードを入れるだけ。お手軽。