クラウドへリモートアクセス環境を準備する場合,クラウドネイティブな方法もあるがVPN仮想アプライアンスをたててオンプレライクにSSLVPNで乗り込みたいシーンがよくある。(私の案件では)
クラウドにアカウントを作りたくない,プロトコルが対応していない等いくつか理由があるが,一番の理由は「クラウド構築担当している人がVPNとか全然分からんからNW部隊に丸投げしてくる。そんでもってユーザ管理や運用はそっちでやってね。」というもの。(怒
ぼやいても仕方ないので毎度VPN対応のFW仮想マシンをたてて構築するのだけれど,まぁ高いのなんの。そこで丁度よさそうなのがOPNsenseだったので構築手順を残しておく。
公式ドキュメントがあるので基本それに従って進めていく。
https://docs.opnsense.org/manual/how-tos/installazure.html
構成イメージ
バージョンは以下の通り。
サーバ側
OPNsense 24.1.1-amd64
FreeBSD 13.2-RELEASE-p9
OpenSSL 3.0.13
クライアント側
OpenVPN GUI v11.47.0.0
仮想マシン作成
ユーザ設定で認証を証明書にするとデプロイ失敗するのでパスワードを設定する。
パブリックIPとネットワークセキュリティグループを適切に設定してデプロイ完了したらHTTPSでログイン。
続いてSSLVPNの設定へ。
OPNsense設定
まずは認証関連の設定。今回は自己証明書で構成を組む。
CA作成
System: Trust: Authorities
※ 中身は省略
サーバ証明書作成
System: Trust: Certificates
※ 中身は省略
2FA用のGoogleAuth登録
System: Access: Servers
サーバ名を入れて,TypeでLocal+OTP。それ以外はそのまま。
SSLVPN Server作成
Serverを作成して~という流れはLegacyとあるのでインスタンスの作成。その前にTLS Keyを作成する。
認証用なのでAuthオンリーで。
入力したパラメータ一覧は以下の通り。それ以外は空欄ないしはデフォルトのまま。
GeneralSetting
- Role: Server
- Description: 適宜
- Server(IPv4):172.16.1.0/24
Trust
- Certificate: SSLVPN CRT(作成したサーバ証明書)
- Certificate Authority: SSLVPN CA(作成したローカルCA)
- Verify Client Certificate: none
- Certificate Depth:One(Client+Server)
- TLS static key: TSL-Key(作成したもの)
- Auth:SHA256
- Data Ciphers: AES-256-GCM
Authentication
- Authentication: Google Auth(先ほど作成したもの)
- Renegotiate time: 0 ※ OTP認証のため再接続になるとTokenが切れているため認証エラーとなってしまう。そのため,ここは「0」に設定する必要がある。OTPでなければ不要。
Routing
- Local Network: 10.0.0.0/16 (VNetにアクセスできれば良いのでVNetに割り当てたセグメント指定)
SNAT設定
VPNのトラフィックをインタフェースでSNATする。
Modeをマニュアルへ変更。
Interface,Source addressをそれぞれ設定。
結果。
リモートアクセスユーザ作成
ユーザ名,パスワードを入力し,OTP用の設定を入力する。
ここでSaveをするとユーザ証明書作成ページに跳ぶ。自己証明書作成を選択し、その他項目も適宜入力して作成する。
その後,GoogleAuthenticatorへ登録するためのQRコードが生成されるのでスマホアプリで登録する。
OpenVPNClient設定エクスポート
TypeはFileonly。Windowsの証明書ストアのオプションは外す。
一番下にあるユーザ用の構成ファイルをダウンロードして完了。
FW設定
今回,Azure上で構築しているので通信制御はNetworkSecurityGroupで対応することとして,OPNsenseのルールは全許可とした。よってここは省略。(LANとOpenVPNのIFにIN全許可ルールを1行入れたのみ)
接続試験(Windows11)
サーバ側でも設定した再認証させない設定をダウンロードしたファイルにも追記する必要がある。
dev tun
persist-tun
persist-key
auth SHA256
client
verb 5 # デバッグ用
ping-restart 0 # これ0に指定する必要がある
resolv-retry infinite
保存した設定ファイルをOpenVPNクライアントにインポートし,接続すると認証画面が出るので「 Token + Password 」の並びで入力する。これが分からなくてサーバ設定見直したりキャプチャ眺めたり,VM作り直したりとかなり迷走した orz。
無事に成功するとIPアドレスが割り当てられAzure内に通信できるようになる。
疎通確認
無事Pingも通った。
ping 172.16.1.1 # Tunnel対向
172.16.1.1 に ping を送信しています 32 バイトのデータ:
172.16.1.1 からの応答: バイト数 =32 時間 =187ms TTL=64
172.16.1.1 からの応答: バイト数 =32 時間 =186ms TTL=64
172.16.1.1 の ping 統計:
パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 186ms、最大 = 187ms、平均 = 186ms
Ctrl+C
^C
>ping 10.0.0.5 -t # VPNサーバAzure内部IP
10.0.0.5 に ping を送信しています 32 バイトのデータ:
10.0.0.5 からの応答: バイト数 =32 時間 =187ms TTL=64
10.0.0.5 からの応答: バイト数 =32 時間 =187ms TTL=64
10.0.0.5 の ping 統計:
パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 187ms、最大 = 187ms、平均 = 187ms
Ctrl+C
^C
>ping 10.0.0.4 -t # Azure内同一Subnet別インスタンス
10.0.0.4 に ping を送信しています 32 バイトのデータ:
10.0.0.4 からの応答: バイト数 =32 時間 =189ms TTL=63
10.0.0.4 からの応答: バイト数 =32 時間 =189ms TTL=63
10.0.0.4 の ping 統計:
パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 189ms、最大 = 189ms、平均 = 189ms
Ctrl+C
^C
以上で完了。おつかれさまでした。