メインコンテンツへスキップ
  1. 記事/

pfSenseでホームネットワークを保護する - シンプルなウォークスルー

Ixonae
著者
Ixonae
目次

注意: この記事はLLMによって英語から翻訳されたものです。正確性については保証いたしかねますので、あらかじめご了承ください。英語の原文はこちら

数週間前、使っていないRaspberry PiをOpenWRTでVPN経由ですべてのトラフィックを通すWiFiルーターに変換する方法を説明する記事を投稿しました。今日の記事では、次のレベルに進み、より多くの制御、機能、パフォーマンスが必要な場合にホームネットワークを管理する方法を見ていきます。

このために、NetGateが管理するFreeBSDベースのファイアウォール/ルーターディストリビューションであるpfSenseを使用し、以下のことを行います:

  • pfSenseの基本的なセットアップを作成する
  • トラフィック(または少なくともその一部)をVPN経由でルーティングする
  • ローカルDNSリゾルバーを設定する
  • プライバシーを向上させるPiHole相当のpfBlockerNGをインストールする(広告やトラッカーがDNSレベルでブロックされます)
  • Snortで基本的なモニタリングを設定する

なお、私はProtectli FW4B(RAM 4GB、ハードドライブ32GB - 今のところ十分以上です)と、アクセスポイントモードで動作する基本的なWiFiルーターを使用しています。VLANをサポートするアクセスポイントを使用すれば、設定をさらに改善できるでしょう(特にAmazonデバイスなどを隔離したい場合)。この記事執筆時点で最新のpfSenseバージョン(2.6.0)を使用しています。

VPNについて一言触れておきましょう。最近VPNについて多くのことを耳にしますが… VPNはセキュリティを確保する魔法ではありません。VPNが主にすることは:

  1. ISPの代わりに、別の会社があなたのインターネットトラフィックを見ることになります。VPNプロバイダーをISPより信頼するなら、これは良いことです(また、VPNプロバイダーがあなたのトラフィックを実世界のIDに紐付けるのは難しくなります)
  2. 複数の人が同じIPを使用するため、ウェブサイトなどによる追跡が困難になります。また、実際の物理的な位置も隠されます(実際のIPアドレスからある程度特定できるため)

基本セットアップ
#

基本セットアップは非常にシンプルです。まずpfSenseのウェブサイトからイメージをダウンロードし(AMD64/DVD Image ISO Installerを使用しました)、ISOをUSBスティックに書き込み、WANポートにインターネット、LANポートにコンピューターを接続した状態でマシンを起動します(画面/キーボードを接続するか、COMポートを使用する必要もあります)。

インストールプロセスでは、かなり標準的な質問をされます。Protectliマシンを使用している場合は、ブート設定でUEFIを選択してください。インストールが完了したら、ブラウザからhttps://192.168.1.1で管理UIに接続し、ユーザー名admin、パスワードpfsenseでログインできます。

そこから、再びいくつかの標準的な質問をする設定画面が表示されます。ローカルリゾルバーを使用するため、Override DNSオプションのチェックを外し、DNSサーバーは入力しませんでした。

そこから、デバイスのLANポートからコンピューターを外し、代わりにアクセスポイントを接続してWiFi経由で接続できます。ファイアウォールにSSHで接続したい場合は、System/Advanced/Secure Shell Menuから許可する必要があります。

続ける前に、簡単な改善をしましょう:ダッシュボードにはウィジェットを配置するための列が2つしかないことに気づいたかもしれません。そのため、画面の大部分が無駄になっている可能性があります。System/General Setupに移動し、Dashboard Columnsの値を3に変更してスペースを有効活用しましょう。その後、ダッシュボードページの右上にある+を使って、新しいウィジェットで好きなようにダッシュボードを設定できます。

Protectli固有の設定
#

Protectliデバイスを使用している場合、メーカーはハードウェアをより活用するためにいくつかの設定変更を推奨しています(このページに詳細があります)。

System/Advanced/Miscellaneousで:

  • Power SavingsEnable PowerDにチェックを入れ、続く3つのフィールドをHiadaptiveに設定します -> これにより、ダッシュボードのThermal Sensorsウィジェットを使用して、CPUコアごとの温度を確認できるようになります
  • Cryptographic HardwareAES-NI and BSD Crypto Device (aesni, cryptodev)に設定します
  • Thermal SensorsIntel Core* CPI on-die thermal sensorに設定します

マシン使用時にCPU温度が50〜60度の間であることがありますが、これは想定内であり全く問題ありません。

DNSリゾルバー
#

マシンをDNSリゾルバーとして使用し、インターネット上のDNSは使用しないようにします。Services/DNS Resolver Menuに移動し、General Settingsで以下を確認してください:

  • Enable DNS Resolverにチェック
  • Network Interfaces -> All
  • Outgoing Network Interfaces -> All(VPN設定後に変更して、すべてのVPNリクエストがVPN経由になるようにします)
  • Struct Outgoing Network Interface Bindingのチェックを外す
  • Enable DNSSEC Supportにチェック
  • Enable Python Moduleにチェック
  • Enable Forwarding Modeのチェックを外す

Advanced SettingsQuery Name Minimizationにもチェックを入れます。

この時点で、独自のVPNを使用した機能的なネットワークがあり、アクセスポイントに接続したすべてのクライアントがデフォルトでこれを使用します。

DNSに関する補足
#

前述の設定により、独自のDNSリゾルバーを持つことになります。つまり、maps.google.comに接続しようとすると、リゾルバーは以下の手順を実行します:

  • ルートDNSに問い合わせて、.com TLDを管理するDNSの場所を尋ねる
  • .com TLDを管理するDNSに問い合わせて、googleの場所を尋ねる
  • googleに問い合わせて、mapsの場所を尋ねる

Query Name Minimizationが有効になっているため、リゾルバーは余分な情報を含まないクエリを送信します。例えば、ルートDNSに問い合わせる際は.com TLDの管理先を尋ねますが、解決しようとしているmaps.google.com全体は渡しません。同様に、.com TLDの管理先に問い合わせる際は、maps.google.comではなくgoogle.comを尋ねます。この方法でリゾルバーを使用すると、DNSリクエストはポート53で暗号化されずに行われます。

リゾルバーがDNSサーバーに(暗号化された方法で)結果を問い合わせるだけにしたい場合は、以下のようにできます:

  • Services/DNS Resolver/General Settingsで、Enable Forwarding ModeUse SSL/TLS for outgoing DNS Queries to Forwarding Serversにチェックを入れる
  • System/General Setupで、お好みのDNSサーバー(できればDNS over TLSをサポートするもの、例えばQuad9やCloudflare)を入力する
  • 同じGeneral Setupで、DNS Resolution BehaviorをローカルDNSのみを使用しリモートを無視するように設定する(そうしないと、VPN使用時にDNSリークが発生する可能性があります)

どちらの方法にも長所と短所があり、どちらが良いかについて強い意見はありません。

静的DHCPリース
#

すべてのマシンがVPN経由でインターネットに接続し、pfBlockerNGを使用するようにしたい場合は、このステップをスキップできます。基本的に、ネットワークに接続されたマシンが常に同じIPアドレスを持つようにして、特定のルールを設定できるようにしたいのです(つまり、特別なルールを設定したくないマシンについてはこれを行う必要はありません)。

まず、Services/DHCP Serverメニューに移動します。デフォルト設定を使用している場合、おそらく以下のようなものが表示されるでしょう:

デフォルトのDHCP範囲

DHCPで割り当てられるIPが192.168.1.100から192.168.1.245になるように範囲を編集します。これにより、192.168.1.2から192.168.1.99の間のIPをマシンに手動で割り当てることができます。

次に、ページ下部のDHCP Static Mapping for this Interfaceにエントリを追加します。マシンが既にネットワークに接続されている場合は、Status/DHCP Leasesに移動して該当するエントリのAdd Static Mappingをクリックすると、MACアドレスとホスト名を手動で入力する必要がなくなります。以下のスクリーンショットのように設定してください。なお、UIがホスト名をIPアドレスで自動入力することがあります(主にホスト名が不明な場合)。これはpfSenseに問題を引き起こすため、避けてください。

静的マッピングの設定

pfBlockerNG
#

誰もが広告やトラッキングを嫌います。これについても対策しましょう。pfBlockerNGはpfSenseにインストールできるモジュールで、PiHoleと同じこと(既知のトラッカー/広告ドメインのDNSクエリを解決しないこと、その他多くのこと)ができます。

インストールするには、System/Package Manager/Available Packagesに移動し、pfBlockerNG-develを検索してインストールをクリックします。pfBlockerNGバージョンもありますが、devel版の方がより多くの機能が使えます。

設定はFirewall/pfBlockerNGで行えます。

Generalメニュー
#

一般設定で、pfBlockerNGEnableチェックボックスにチェックを入れ、その他の設定はデフォルトのままにします。Log Settingsでは、リクエスト履歴をどれだけ保持するか定義できます。

IPメニュー
#

このメニューは、不審なIPアドレスや特定の地理的位置のIPアドレスとの接続を防止するなど、さまざまな用途に使用できますが、今日はこれについては触れません。

DNSサーバーが解決したIPの位置統計を取得したい場合は、無料のMaxMindライセンスキーを取得してGeoIPを使用し、適切なメニューに記録できます。

DNSBLとFeedsメニュー
#

これがDNSブロックリストを有効にするために使用する機能です。以下の設定を行ってください:

  • Enable DNSBLにチェック
  • DNSBL Mode -> Unbound python mode(より良いパフォーマンスと機能(特定のIPをDNSブロッキングから除外するなど)が利用可能になります)
  • DNS Reply Loggingにチェック(どのドメイン名が解決されているかの統計を取得したい場合。時々有効にしてマシンの状況を監査するのに便利です)
  • DNSBL Blockingにチェック
  • HSTS Modeにチェック
  • Python Group Policyを有効に(一部のマシンでDNSフィルタリングを使用したくない場合)

Python Group Policyチェックボックスにチェックを入れた場合、このページに同名のメニューとテキストボックスが表示されます。1行に1つのIPを追加でき、これらのIPはDNSBLを使用しません。

また、ブロックしたくないドメインを追加できるDNSBL Whitelistセクションにも注目してください。

DNSBLグループ
#

このサブメニューでは、リストのグループと更新頻度を設定できます。例えば、アドブロッカーで人気のあるEasyListを使用するようにDNSBLを設定すると、以下のようになるはずです。

EasyList用のDNSBLグループ

Logging/Blockingモードを変更して、ブロックされたドメインの記録を残さないようにすることもできます。リストの更新頻度も設定できます。

グループを作成して手動で追加したい場合は、ドメイン名を一覧表示できるDNSBL Custom_Listを使用して行うこともできます。

私はネットワークからコンテンツを検閲することには興味がありませんが、そうしたい場合はDNSBL CategoryDNSBL SafeSearchサブメニューを使用して、カテゴリ別(例:ポルノ、ドラッグ、銀行、ハッキング、ガーデニング…かなり多くのフィルターの選択肢があります)にブロックできます。

Feeds
#

グループやブロックリストを手動で追加するのは良いですが、あまり楽しくありません。幸いなことに、pfBlockerNGにはFeedsメニューから有効にできるリストのセットが付属しています。関心のあるものの+アイコンをクリックするだけで、ソフトウェアがDNSBL Groupsフォームを事前入力してくれます。

Reports
#

設定が完了したので、結果を見てみましょう。その前に(モジュールを初めて使用する場合)、Updateメニューに移動して強制リロードを行い、すべてのリストをアクティブにしてください。

ログ記録を許可した場合、以下のサブメニューを使用できます:

  • Unified - IPブロッキングとDNSBLに関連するすべてのアクティビティを表示
  • Alerts - ブロックされたもののリストを表示
  • DNS Reply - 行われたDNSクエリを表示
  • DNS Reply Stats - DNSアクティビティに関するグラフを表示
  • DNSBL Block Stats - ブロックされたDNSクエリについて詳しく知る

どこまで過去を遡れるかは、ログに保存を許可した行数に依存します。

VPN設定
#

次に、インターネットへのすべての接続がVPN経由になるようにpfSenseを設定しましょう。OpenVPNクライアントのインスタンス設定の詳細については、使用するプロバイダーによって若干異なるため、ここでは省略します。Mullvad、ProtonVPN、PIAのガイドへのリンクをこの記事の参考資料に掲載しています。独自のDNSを使用するため、OpenVPN接続でDNSを設定しないよう注意してください(Pull DNSオプションにチェックを入れないでください)。

クライアントの設定が完了し、正常に動作したら、Interfaces/Interface Assignmentsに移動してクライアント用のインターフェースを追加します。その設定ページに移動し、VPN1(またはお好みの名前)と名前を付け、Block bogon networkボックスにチェックを入れます。

次に、Firewall/NAT/Outboundに移動し、モードをManual Outbound NAT rule generationに選択して保存します。新しいマッピングが表示されるはずです。最後の2つのルール(以下のスクリーンショットのようなもの)を変更します。

変更すべき元のNATルール

以下のようになるようにします(インターフェースをWANからVPN1に変更し、IPv6ルールを無効にするだけです)。

変更後のNATルール

次に、Firewall/Rules/LANで、IPv6ルールを無効にし(右側のアイコン)、Default allow LAN to any ruleルールのゲートウェイをVPN1インターフェースに変更します。

変更後のファイアウォールLANルール

最後に、ローカルDNSがVPN接続を通じてクエリを送信していることを確認します。Services/DNS Resolverに移動し、Outgoing Network InterfacesVPN1のみ選択するように変更します。

OpenVPNクライアントを再起動すると、正しいIPを持っていることを確認できるはずです。DNSリークテストを実行して、DNSがリークしていないことも確認できます(結果にはVPN IPのみが表示されるはずです)。

特定のデバイスをVPNから除外する
#

何らかの理由でデバイスをインターネットに直接接続させたい場合、いくつかのルールを設定することで可能です。まず、Firewall/NAT/Outboundの設定が必要です。先ほど変更したルールのコピーを作成しますが、今回はインターフェースとして(元の)WANを設定します。最終的に以下のようなルールになるはずです。

最終的なOutgoing NATルール

次に、VPNなしで使用したい各デバイスについて、Firewall/Rules/LANにファイアウォールルールを追加します(Add rule to the top of the listを使用してください。そうしないと機能しません)。新しいルールを作成する際に以下のフィールドを変更してください:

  • Source(Single host or alias) -> デバイスのIP(前にDHCPで静的に設定したもの)
  • Description -> 自分用のメモ
  • Gateway -> WANインターフェース

Snort
#

最後に、ネットワークにセキュリティモニタリングを追加しましょう。System/Package Manager/Available Packagesに移動し、snort(オープンソースのネットワーク侵入検知・防御システム)をインストールします。すると、新しいメニューServices/Snortが表示されます。以下の設定を行います:

  • Global Settingsで、関心のあるルールを有効にし、更新間隔を6時間に設定
  • Updatesで、Update Rulesをクリックし、すべてが正しくダウンロードされていることを確認

これが完了したら、Snortインターフェースを作成しましょう。LAN用に1つ、WAN用に1つ。以下の設定を行います:

  • インターフェースを有効にする
  • アラート調査時により多くのコンテキストを確認できるようEnable Packet Capturesにチェック

アラートをトリガーしたBlock Offendersのオプションもあります。ホームファイアウォールを設定する場合、多くの誤検知が発生し、正当な理由なくマシンがブロックされる可能性が高いため、チェックしないことをお勧めします。

これで動作するSnortができ、ホームダッシュボードにウィジェットを追加して最新のアラートを確認できます。Snortについては後で記事を書く予定なので、ここでは詳しく説明しません。記事が公開されたらここにリンクを追加します。

設定のバックアップ
#

すべての設定が完了したので、問題が発生した場合にすべてを復元できるようバックアップファイルをエクスポートしましょう。これはDiagnostics/Backup & Restoreメニューで行えます。

さらに詳しく
#

pfSenseの可能性についてさらに学びたい場合は、こちらの記事が参考になるかもしれません。そこでは、オンラインのセルフホストサービスにアクセスするためにWireGuard接続を必須にする方法と、pfSenseをWireGuardに接続してトラフィックをルーティングする方法を説明しています。

また、最近この設定の改善点をまとめた新しい記事を書きました(Home Network and pfSense Improvements)。VPN障害時にインターネットが使えなくなることに対してpfSenseをより堅牢にしたい場合や、マシンのVPN使用/不使用の切り替えを簡単にしたい場合に参考になるでしょう。


参考資料とクレジット
#

参考資料
#

クレジット
#