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
ファイアウォールの紹介はこちらでご覧いただけます。