MullvadとopnSenseで隔離された安全なネットワークを作る

🇺🇦 ウクライナに栄光あれ 🇺🇦

昨今、暴走老害のせいで世界情勢が厳しくなっているが、一応双方の公式発表は見てみたい。
ロシアのサイトを巡回するのは普通に怖いので、VM内に隔離すると共にネットワークを分離する。

VMwareの設定

今回使うネットワークを作る。
編集 > 仮想ネットワーク エディタから、ネットワークを追加をクリック。
適当なVMnetを追加し、ホストオンリーを選択。
ホスト仮想アダプタをこのネットワークに接続するのチェックを外す。

ゲストOSの準備

今回は適当にUbuntuでやった。
ネットワーク アダプタだけ最初に作ったVMnetにするのを忘れずに。

opnSenseの準備

ダウンロード

https://opnsense.org/download/ から、

  • Architecture: amd64
  • Select the image type: dvd
  • Mirror: 西側諸国の好きなとこ

でインストール用のiso.bz2を入手する。
7zなどで解凍すればisoができる。
sha256もチェックすること。

VM

FreeBSD(64bit)に設定して、2vCPU / 2GBくらいのVMを作る。
CD/DVDにダウンロードしたisoファイルを設定する。
ネットワークアダプタを追加して、片方をブリッジ、もう片方を最初に作ったVMnetにする。

インストール

基本的に適当でOK。
WAN / LANの自動検出が上手くいかないことがあるので、その場合はブリッジ側のNICをWANに、ホストオンリー側のNICをLANに設定して進める。

設定

一旦適当なVMを作って、ネットワーク アダプタを最初に作ったVMnetに設定する。
Ubuntuで192.168.1.1にアクセスしてWebGUIを開く。

日本語化

System > Settings > GeneralからSystem > LanguageJapaneseにする。

WANからWebGUIにアクセスできるようにする

インターフェース > [WAN]からGeneric configuration > プライベートネットワークを拒否のチェックを外す

ファイアウォール > ルール > WANにルールを追加

  • 動作: 許可
  • インターフェース: WAN
  • 方向: in
  • TCP/IPバージョン: IPv4
  • プロトコル: TCP
  • 送信元: 任意
  • 送信先: WANアドレス
  • 送信先ポート範囲: HTTPS / HTTPS

で保存。
WAN側のアドレスにHTTPSでアクセスして、WebGUIが返ってきたらOK。
LAN側のマシンは全て信頼できないので、WebGUIのListenをWANのみにする。

システム > 設定 > 管理からweb GUI > リスンインターフェースWANにする。

必ずWAN側からアクセスできるのを確認してからやれよな!!俺は間違いなく言ったぞ!!!ロックアウトされても知らねーからな!!!!!!

Mullvadに接続

opnSenseのドキュメントに詳しくまとまっている。
https://docs.opnsense.org/manual/how-tos/wireguard-client-mullvad.html

WireGuardをインストール

システム > ファームウェア > プラグインos-wireguardを検索して、右側の+ボタンをクリックしてインストールする。
出てこないときとかエラーが出たときは更新タブからパッケージのアップデートをして再起動すると大抵直る。

ブラウザをリロードしてWireGuardの設定画面を開けるようにしておく。

接続先サーバーの設定

VPN > WireGuardからEndpointsタブに移動して、+ボタンをクリックして設定を追加する。

https://mullvad.net/servers/ から接続先のサーバーを選ぶ。
今回はとりあえず香港3に繋ぎたいので、以下のような設定を入れる。

  • 名前: Mullvad-HK3
  • Public Key: i/7J2fCZq0lyB/tIDUz9sZGmaJ9FZPh93mARV/gZ9xo=
  • 秘密共有鍵: 空のまま
  • Allowed IPs: 0.0.0.0/0
  • Endpoint Address: hk3-wireguard.mullvad.net
  • Endpoint Port: 51820
  • Keepalive: 60

ローカル設定

VPN > WireGuardからローカルタブに移動して、+ボタンをクリックして設定を追加する。
詳細モードを有効にしないとDNSの設定ができないので注意。

  • 名前: Mullvad
  • Public Key: 空のまま
  • Private Key: 空のまま
  • リスンポート: 51821
  • DNS サーバ: 1.1.1.1, 1.0.0.1 または好きなDNSサーバー
  • Tunnel Address: 192.168.1.254/32
  • ピア: Mullvad-HK3
  • Disable Routes: チェックを外したまま

保存したら編集ボタンをクリックして、生成されたPublic Keyをコピーする。
適当なshellから、

curl -sSL https://api.mullvad.net/app/v1/wireguard-keys -H "Content-Type: application/json" -H "Authorization: Token 【MullvadのアカウントID】" -d '{"pubkey":"【生成されたPublic Key】"}'

を叩く。

{
  "id": "P9oL%2BaDkAAAAAAAA%2FdBOExpBBBBBBBBBBYt1k3i8TkY%3D",
  "pubkey": "P9oL+aDkAAAAAAAA/dBOExpBBBBBBBBBBYt1k3i8TkY=",
  "ipv4_address": "10.108.38.XXX/32",
  "ipv6_address": "fc00:bbbb:bbbb:bb01::YY:ZZZZ/128"
}

のようなJSONが返ってくるので、Tunnel Addressipv4_addressを貼り付けて保存する。

接続

VPN > WireGuardから全般タブに移動して、Enable WireGuardにチェックを入れて適用する。

List Configurationタブに移動して、

interface: wg0
  public key: P9oL+aDkAAAAAAAA/dBOExpBBBBBBBBBBYt1k3i8TkY=
  private key: (hidden)
  listening port: 51821

peer: i/7J2fCZq0lyB/tIDUz9sZGmaJ9FZPh93mARV/gZ9xo=
  endpoint: 89.45.6.98:51820
  allowed ips: 0.0.0.0/0
  latest handshake: 25 seconds ago
  transfer: 72.39 MiB received, 130.20 MiB sent
  persistent keepalive: every 1 minute

のような表示が出ていればOK。

NAT

ファイアウォール > NAT > 外向きからモード手動外向き NAT ルール生成にして保存する。

Manual rulesの+ボタンをクリックして設定を追加する。

  • インタフェース: WireGuard (Group)
  • TCP/IP バージョン: IPv4
  • プロトコル: any
  • 送信元アドレス: LANネット
  • 送信元ポート: 任意
  • 送信先アドレス: 任意
  • 送信先ポート: 任意
  • トランスレーション / ターゲット: インタフェースアドレス

この状態になっていればOK。
全てのトラフィックがMullvadのWireGuardを通るようになるし、WAN側にも漏れない。
万が一ゲストOSが乗っ取られても、物理マシンにはほぼ影響がない。

ロシアのサイトに繋ぐ

ロシア国内のVPSとか有料のプロキシとかを使って規制を突破する。
対策されたら嫌なので、どこを使えばいいかは書かない。

マジでネオナチ呼ばわりしてるよ……正気か……?