Raspberry Pi で VPN サーバーをセットアップする

胡金庫 2022年4月14日
Raspberry Pi で VPN サーバーをセットアップする

この記事では、Raspberry Pi デバイスでの VPN サーバーのセットアップについて説明します。

Raspberry Pi OS で WireGuardVPN パッケージを構成する

一般に、VPN サーバーにはさまざまなプロトコルと実装がありますが、この記事では、現在の一般的なオプションとして WireGuard ソフトウェアを選択しました。

ソフトウェアパッケージは通常、デフォルトのリポジトリで利用可能であり、次のコマンドを使用してインストールできるはずです。

sudo apt install wireguard

wireguard パッケージをインストールすると、WireGuard の構成とインターフェイスを操作するためのいくつかのコマンドラインツールが Raspberry Pi システムで利用できるようになります。

WireGuard は通常、システムに新しい仮想ネットワークインターフェイスを追加します。WireGuard は、公開鍵と秘密鍵を各ピアに関連付けることで示される CryptoKey ルーティングの概念を実装しています。

つまり、ピアは VPN トンネル内の単なるアクターであり、それぞれが一意の公開鍵によって識別されます。したがって、これらのキーを生成し、対応する構成ファイルに含める必要があります。

構成ファイルと秘密鍵は機密情報と見なす必要があるため、鍵を生成して/etc/wireguard ディレクトリに保存する前に umask 0700 コマンドを呼び出します。

したがって、これらのファイルの所有者のみが後でコンテンツの読み取り/書き込みを行うことができます。

umask 0700; wg genkey | sudo tee /etc/wireguard/private.key

サンプル出力:

2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=

前のコマンドは、キーを private.key ファイルに保存し、出力して簡単にコピーします。

次に、同じ/etc/wireguard ディレクトリに wg0.conf という名前の構成ファイルを作成し、その中に次の内容を含めます。

[Interface]
PrivateKey = 2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=
Address = 10.10.10.1/24
ListenPort = 51820

この構成ファイルは Raspberry Pi ピア用であり、必要に応じて wg0 部分の名前を変更できることに注意してください。

PrivateKey 値を前のコマンドで生成されたキーにコピーして置き換えます。また、着信接続を受け入れるポートとピアのアドレスを指定できます。

これで、他のピア(Peer A)に移動できます。このピアは、Raspberry Pi に接続する必要があります。この時点で、他のマシンは Linux ベースであり、それに応じて WireGuard パッケージがインストールされていると想定しています。

ピア A 構成は、同じ手順に従ってコマンドを再利用して公開鍵を生成し、実行します。キーは 1 台のマシンで生成できますが、秘密キーは秘密にすることを目的としているため、対応するピアマシンで開発していることに注意してください。

秘密鍵が生成されたら、/etc/wireguard ディレクトリに構成ファイル(例:wg0.conf)を作成し、次の行を挿入します。

[Interface]
PrivateKey = 9jalV3EEBnVXahro0pRMQ+cHlmjE33Slo9tddzCVtCw=
Address = 10.10.10.2/32

ここでの PrivateKey 値は任意であり、有効な値に置き換える必要があることに注意してください。同時に、特定のネットワーク構成が必要な場合は、IP アドレスが変更される可能性があります。

この後、公開鍵を生成して構成ファイルに保存する必要があります。公開鍵は秘密鍵から派生しており、この場合、両方のデバイスで生成する必要があります。

次のコマンドを使用して、Raspberry Pi で 1つの公開鍵を生成し、他のマシンで 2 番目の公開鍵を生成します。

sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

それでは、ピアセクションを構成ファイルに挿入しましょう。次の行を Raspberry Pi/etc/wireguard/wg0.conf ファイルに追加する必要があります。

[Peer]
PublicKey = PRIVATE_KEY_OF_PEER_A
AllowedIPs = 10.10.10.2/32

AllowedIPs 値は、ピア A 構成ファイルの Address 値で指定された IP アドレスと同じであることに注意してください。

さらに、PRIVATE_KEY_OF_PEER_A をピア A で生成された秘密鍵に置き換えます。一方、ピア A マシンの wg0.conf ファイルに次の行を追加します。

秘密鍵の値を対応する値に置き換え、エンドポイントアドレスを Raspberry Pi デバイスのアドレスに置き換えてください。ピア A のみが Raspberry Pi ネットワークにアクセスするため、次の構成では VPN 接続が一方的になることに注意してください。

[Peer]
PublicKey = PRIVATE_KEY_OF_RASPBERRY
AllowedIPs = 0.0.0.0/0
Endpoint = 172.16.0.134:51820

最後に、次のコマンドを使用して、Raspberry Pi 側で対応するサービスを開始する必要があります。

sudo systemctl enable wg-quick@wg0.service

ピア A は、トンネルインターフェイスを作成して接続するたびに、次のコマンドを使用します。

sudo wg-quick up wg0

次のコマンドを使用して、インターフェイスを削除し、ピア A からの既存の接続を終了できます。

sudo wg-quick down wg0

すべての Peer A トラフィックを Raspberry Pi 経由でルーティングする方法

この時点で、ピア A はインターネットにアクセスできなくなり、Raspberry Pi ネットワークのみにアクセスできるようになります。これを実現するには、構成ファイルにパラメーターを追加する必要があります。

Peer A wg0.conf ファイルから始めて、[Interface] セクションに次の行を追加しましょう。

DNS = DNS_ADDRESS_USED_BY_RASPBERRY

この DNS アドレス値はネットワーク構成に依存するため、現在アクティブな DNS アドレスを取得し、何らかの理由で将来変更された場合は更新する必要があります。

一方、これらの余分な行を Raspberry Pi wg0.conf ファイルに追加する必要があります。

PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

構成ファイルに別のファイル名を作成する場合は、これらの行で wg0 名を変更する必要があることに注意してください。

wg0.conf の変更を保存したら、/etc/sysctl.conf ファイルを開き、次の行のコメントを解除/変更します。

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

通常、net.ipv6.conf.all.forwarding は、構成ファイルに IPv6 アドレスも含める場合にのみ必要です。この後、変更を有効にするには、次のコマンドを実行する必要があります。

sudo sysctl -p

ここで、ピア A から Raspberry Pi を介してすべてのインターネットトラフィックを接続して転送する必要があります。ただし、Raspberry Pi でファイアウォールを実行している場合は、ピア A に対応するルールを設定してください。そうしないと、ネットワークにまったくアクセスできなくなります。

ufw ファイアウォールの紹介はこちらでご覧いただけます。

著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - Raspberry Pi