Raspberry Pi 4でVPNルータを作成するには Fedora 37 + IKEv1 XAUTH PSK版

現在、わたしの自宅LANは、IPv6(IPoE)でインターネット接続しております。具体的にはtransixサービスになります。

IPv4(PPPoE)接続とは異なり、IPv6(IPoE)は市販のVPNルータを使用できません。VPNリモートアクセスによる、外出先から自宅LANへのアクセスはできなくなりました。自宅にサーバを置きたい場合、少し不便な状態です。

一方。先日、Raspberry Pi 4にFedora Serverをインストールして、IPv6(IPoE)環境の中から、PPPoE接続ができる環境を構築しました。

Raspberry Pi 4のFedora 37でPPPoE接続するには
先日、Fedora 37 Serverのサポート対象として、Raspberry Pi 4が正式サポートされました。 またRaspber...

PPPoE接続により、IPV6(IPoE)とは別のセッションを作成することで、インターネット側からRaspberry Piに直接アクセスできるようになりました。

次のステップとしまして。

こちらのRaspberry Pi 4をVPNサーバにすることで、IPv6(IPoE)環境の自宅LANに、外出先からアクセス可能となりました。Raspberry PiがVPNルータの役割をしてくれています。

そのような、Raspberry Pi 4でVPNルータを構築する手順を記録させて頂こうと思います。

※23.1.18現在:Firewalldの設定が不完全のため、まだ完成していない状況です。VPNアクセスの機能上は問題はありませんが、FedoraにSSHログインができなくなります。(致命的


VPNの方式はIKEv1 XAUTH with PSKを選択

「VPN」という機能を実現する方法は、本当にたくさん、何種類も存在します。

たとえばPPTPは、過去にはVPN方式の主役でした。今はセキュリティの問題から、使われなくなりました。

VPNサーバ(ルータ)を新たに構築するにあたり。令和5年(2023年)1月現在、次の方式を検討しました。

  1. IKEv2
  2. IKEv1 XAUTH with PSK
  3. IKEv1 with L2TP

現在、一般的なVPN機能付きWi-Fiルータを購入した場合。恐らく、3番の「IKEv1 with L2TP」方式の機種が多いように思います。IPSecはIKEv1を表す場合があるため、IPSec/L2TPという表記が一般的かもしれません。Windows、iOS、macOS、Android等、多くの機器で広くサポートされているようです。

しかし、セキュリティの面から見ますと。現在の基準では、IPSec/L2TPもベストな選択では無い感じがします。現在、IPSec/L2TPのセキュリティの強度は、それほど高くない、という印象です。

では、セキュリティの強度は高いものは?

最強はIKEv2方式であると思われます。シンプルかつ強力です。セキュリティに強く最新、ということで、実際にIKEv2方式で、VPNサーバを構築したのですが。iPhoneによる接続で嵌まりました。

高いセキュリティであるが故に、証明書の扱いが難しく。サーバは構築できたものの、iPhoneでの接続は(私は)諦めました。

そのような過程を経まして。

この記事は、「IKEv1 XAUTH with PSK」でVPNサーバ(ルータ)を構築します。

  • iOS / macOS対応 →iPhoneは接続確認済み
  • Windows対応 → サードパーティのVPNクライアントが必要ですが、接続確認済み
  • Android →接続未確認。対応しているそうですが、Aggressive Modeに注意。

こちらの方式で、iPhoneとWindows PCにて、外出先からおうちLANにアクセスできることを実際に確認済みです。

サードパーティのVPNクライアントを使用したくない、Windows PC標準のVPNで接続したい場合は、IPSec/L2TPまたはIKEv2が必要になります。この記事は該当しませんのでご注意下さい。

この記事で構築するVPNサーバですが、iPhoneは比較的簡単にVPN接続できます。外部のアプリは不要です。

Windows PCは、IKEv1対応のVPNクライアントアプリを別途インストールすることで、外出先から問題なく自宅LANにアクセスできるようになりました。では実際にVPNサーバの構築を始めたいと思います。


Raspberry Pi 4のOSはFedora 37 Serverを選択

もしかすると、Debianベースの、公式Raspberry Pi OSでも構築できるかもしれませんが。

この記事では、セキュリティを重視し、SELinuxやfirewalldを実装した、Fedora 37 Serverを使用しました。(SELinuxはdisabledだkd

ブートメディアは、半年程度で壊れる可能性がありますmicroSDカードは使用せずに、USBストレージから起動しておりますので、長期間の運用に耐えるかと思います。

Fedora 37 Serverのインストール手順はこちらの記事になります。

Raspberry Pi 4でFedora 37 Serverを起動してみました
Raspberry Pi 4で。 64ビット版Fedora 37 Serverを起動してみました。 起動用microSDカードの作成...

Raspberry PiからIPv4(PPPoE)接続

もしも、IPv6(IPoE)環境では無く、IPv4(PPPoe)でインターネットに接続している場合は、VPNサーバ機能を持つWi-Fiルータを設置すれば、外出先から自宅LANにアクセス可能だと思います。

そうではなく、IPv6(IPoE)環境で、VPNルータを設置できない状況を想定しております。

IPv6(IPoE)の契約とは別に、IPv4(PPPoe)のISP(インターネット・サービス・プロバイダ)契約が必要です。PPPoEアカウント(ユーザ名/パスワード)をご用意頂いた状況で、Raspberry PiからIPv4(PPPoE)接続します。

こちらの記事になります。

Raspberry Pi 4のFedora 37でPPPoE接続するには
先日、Fedora 37 Serverのサポート対象として、Raspberry Pi 4が正式サポートされました。 またRaspber...

ISP契約のオプションとして、グローバルな静的IPアドレスを契約した場合は、常に同じIPアドレスが割り当てられるため、Dynamic DNSは不要です。

PPPoE接続を行うたびに、異なるグローバルIPアドレスが割り当たる場合、別途Dynamic DNSの設定が必要になります。

IPアドレスが変わっても、外出先からホスト名でアクセスできるように、Dynamic DNSサーバの自動登録を行おうと思います。

こちらの記事は、no-ipによるDynamic DNS自動登録の手順になります。

Raspberry Piでno-ipのホスト名を自動更新するには Fedora 37版
先日、Raspberry Pi 4からPPPoE接続を行う設定を行いました。 外出先からRaspberry Piへホスト名でア...

以上で、Fedora 37 Server環境で、IPv4(PPPoE)接続を行い、no-ipによるDynamic DNS登録を行い、ホスト名でRaspberry Piにアクセスできるようになりました。


Fedora 37 ServerのIKEv1 XAUTH with PSK VPNサーバ構築手順

VPNサーバの構築ですが。IKEv2は、証明書を作ったりなんだり大変でした。

一方、IKEv1 XAUTH with PSKは、それほど大変ではありません。基本的に、configファイルを作って終わりです。

構築は簡単。セキュリティ性能も高いということで。令和5年(2023年)1月現在、最もお勧めの方法になります。

Libreswanのインストール

VPNの実装は、Libreswanを使用させて頂きました。

こちらをインストールします。

sudo dnf install -y libreswan NetworkManager-libreswan

(NetworkManagerは、今考えたら使っていませんので、不要かもしれません。libreswanだけでも大丈夫かもしれません。インストール後、ipsec.serviceが起動するかどうか確認しました。

sudo systemctl daemon-reload
sudo systemctl enable ipsec.service --now

特に問題なくipsec.serviceが起動しました。

サービスが問題なく起動する事がわかりましたので。

configを作成し、クライアントから着信可能に設定を進めたいと思います。

構築時、参考にさせて頂いた資料は、Libreswan公式ドキュメントになります。

https://libreswan.org/wiki/Main_Page


/etc/ipsec.confファイル作成

今回の主役となる、/etc/ipsec.confファイルを作成します。

sudo vi /etc/ipsec.conf

次の内容になります。

# /etc/ipsec.conf - Libreswan 4.0 configuration file
config setup
  protostack=netkey
  # exclude networks used on server side by adding %v4:!a.b.c.0/24
  virtual-private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:!10.231.247.0/24,%v4:!10.231.246.0/24
  # PSK clients can have the same ID if they send it based on IP address.
  uniqueids=no

conn xauth-psk
    authby=secret
    pfs=no
    auto=add
    rekey=no
    left=%defaultroute
    leftsubnet=0.0.0.0/0
# おうちLANのセグメントを使用します。xxx部分は適宜変更して下さい。
# DHCP割当と重ならない範囲を指定します。
    rightaddresspool=192.168.xxx.92-192.168.xxx.127
    right=%any
    # make cisco clients happy
    cisco-unity=yes
    # address of your internal DNS server
# DNSサーバを指定します カンマ区切りで連続で記入
    modecfgdns=192.168.xxx.1,8.8.8.8
    leftxauthserver=yes
    rightxauthclient=yes
    leftmodecfgserver=yes
    rightmodecfgclient=yes
    modecfgpull=yes
    #configure pam via /etc/pam.d/pluto
    xauthby=pam
    # xauthby=alwaysok MUST NOT be used with PSK
    # Can be played with below
    #dpddelay=30
    #dpdtimeout=120
    #dpdaction=clear
    # xauthfail=soft
    ikev2=never

ipsec.confファイルは、上記の内容のみ記述したかたちです。include行はすべて削除しました。include行があると、接続に失敗するため、すべて削除しました。

16行目のrightaddresspool行と、21行目のmodecfgdns行は、自宅LANのルータの設定に合わせて設定して下さい。xxxを含めたIPアドレス部分を書き換える必要があります。

rightaddresspoolは、使用していないIPアドレスの範囲を指定します。具体的には。ルータのDHCP割当範囲と重ならない範囲を指定しておきます。おうちのルータは、第四オクテット128から254までをDHCP割り当てで使用しております。このため、VPNでは92-127までを割り当てました。(重ならなければOK

modecfgdnsは、DNSサーバのアドレスを指定します。複数指定する場合、カンマ区切りで指定し、空白は入れずに続けて指定します。(空白があるとipsec.serviceが起動しなくなります


/etc/ipsec.secretsファイル作成

次に、PSK(Pre-Shared Key)を記述する/etc/ipsec.secretsファイルを作成します。

sudo vi /etc/ipsec.secrets

次の内容になります。

%any : PSK "ExampleSecret"

セキュリティ的には、こちらにVPNサーバのIPアドレスを埋め込む必要がありますが。静的なグローバルIPアドレスが割り振れない環境では、上記の設定になる感じかと思います。

こちらのサンプルは、「ExampleSecret」がPSKになります。運用時は、そのまま使用せずに、6文字以上の、一意の文字列に変更しておいて下さい。


/etc/pam.d/plutoファイルの確認

最初に作成しました、/etc/ipsec.confファイルに、認証手順として下記の1行を指定してあります。

xauthby=pam

この場合、ユーザ認証に、/etc/pam.d/plutoファイルの設定が使用されます。

既定でこのような内容かと思います。

使用する設定はsystem-authが基本になっています。つまり、fedora 37 serverにログインできるアカウントで、vpnにログインできますよ、という設定になっています。

VPNの認証は、次の2つで行われる設定になります。

  1. PSK
    • この記事の設定では「ExampleSecret」
  2. ユーザ名/パスワード
    • Fedora 37 Serverで作成したユーザ名
    • この記事ではユーザ名:hideと、そのパスワードでVPNを利用可能

VPNアクセスを許可するユーザを増やす場合、「adduser」コマンドで新規ユーザを作成するかたちになります。


ipsec設定のベリファイ

作成した設定が、正しいものなのか?

確認してみましょう

sudo ipsec verify

このような形で[OK]と表示されましたら、設定に問題はなさそうです。

ipsec設定の反映

それでは、実際にVPNクライアントが着信できるように、ipsec.serviceを再起動しましょう。

sudo systemctl restart ipsec.service

無事に再起動しましたでしょうか?

libreswanの設定は、以上で完了となりますが。

実際にクライアントがVPNサーバに接続して、自宅LANにアクセスするためには。

あと3つほど、設定が必要のようです。

  1. IPSec関連のファイアウォール・サービス追加(着信可能な設定)
  2. ポートフォワーディングの有効化
  3. ファイアウォールのゾーン設定調整(自宅LAN機器へアクセス可能な設定)

VPNサーバ向けFedora 37 Server設定調整

IPSec関連のファイアウォール・サービス追加

iPhoneやWindows PC等、VPNクライアントからIPSecの着信(リクエスト)を受信できるように、ファイアウォールの設定を調整します。

今後、IPv4(PPPoE)側のファイアウォール設定を管理しやすいように。firewalldのゾーン「external」を、ppp0インタフェースに割り当てましょう。

externalゾーンのipsecサービスを有効化すると同時に、たとえばssh等のipsec以外のサービスは無効に設定します。ssh接続したい場合は、VPNで接続してから行えば問題ありません。

今のところ、ipsec以外のサービスはすべて弾く設定にしました。VPNのみ着信可能という状態です。

# externalゾーンにppp0を割り当て
sudo firewall-cmd --zone=external --change-interface=ppp0
sudo firewall-cmd --zone=external --change-interface=ppp0 --permanent 
# 確認
sudo firewall-cmd --list-all --zone=external
# externalゾーンのsshサービス削除
sudo firewall-cmd --zone=external --remove-service="ssh"
sudo firewall-cmd --zone=external --remove-service="ssh" --permanent
# ipsecサービス追加
sudo firewall-cmd --zone=external --add-service="ipsec"
sudo firewall-cmd --zone=external --add-service="ipsec" --permanent 
# 確認
sudo firewall-cmd --list-all --zone=external
# 設定反映
sudo firewall-cmd --reload

ちなみに、ipsecサービスは、IKEプロトコル、ESPプロトコル、AHプロトコルで使用される500/UDPと4500/UDPを表すそうです。ipsecサービスを指定することで、一通りのパケットが許可されるようです。

firewalldの設定変更はこれで終わりではありません。追って、VPNリモートアクセスに必要な設定を再度行う予定です。


IPフォワードの有効化

ipsec.confファイルのrightaddresspoolに、おうちLANのセグメントの空きIPアドレスを指定しました。

VPNクライアントに割り当てられたIPアドレスから、自宅LANの機器にアクセスできるように、Fedora 37 ServerのIPフォワードを有効にしました。

sudo /sbin/sysctl -w net.ipv4.ip_forward=1

再起動後もIPフォワードが有効になるように、/etc/sysctl.confファイルを編集しました。

sudo vi /etc/sysctl.conf

次の1行を追加しました。

net.ipv4.ip_forward=1

こちらの設定で、再起動後もIPフォワードが有効になりました。

# IPフォワードの状態確認
sudo /sbin/sysctl net.ipv4.ip_forward

firewalldのゾーン設定・・・もう少し調整が必要です。

※23.1.17追記:

外出先で、iPhoneやPCからRaspberry PiのVPNサーバに接続した時。

インターネットへのアクセスが可能で、かつ自宅LANの機器へのアクセスも可能にしたい場合。

今のところ、次のようなfirewalldのゾーン設定を行っています。

  1. externalゾーン
    • 上述のように、ppp0に紐付けました。
    • 自宅LANのセグメント、192.168.xxx.0/24をソースに追加することで、インターネットへのアクセスと、自宅LAN機器へのアクセスが可能になりました。
  2. FedoraServerゾーン
    • eth0に紐付きます。
    • 既定の設定です。

具体的には、次のコマンドを入力します。

※注意が御座います。こちらのコマンドを実行しますと、LAN内からSSH接続できなくなります。シリアルコンソールが必要です。・・・・対策を考え中です。

# xxxの部分は、自宅LANのセグメントに合わせて変更して下さい。
# 暫定の設定になります。現状、実行後、SSH接続できなくなります。
# 実行せずに、設定調整までお待ち下さい。
sudo firewall-cmd --zone=external --add-source=192.168.xxx.0/24
sudo firewall-cmd --zone=external --add-source=192.168.xxx.0/24 --permanent
sudo firewall-cmd --reload

設定変更後、次のコマンドで確認しました。

sudo firewall-cmd --list-all --zone=external
sudo firewall-cmd --list-all --zone=FedoraServer

これでなんとか、VPN接続したクライアントから、インターネットと自宅LAN機器の両方にアクセスできると思います。

なんとか、という理由ですが。お察しの通り、少し特殊な設定になっています。

理由は、自宅LANのセグメントと同じIPアドレスを、VPNクライアントに割り当てているためです。

192.168.xxx.0/24のセグメントのIPアドレスが、eth0インタフェースと、ppp0インタフェースの両方に割当られるため、ゾーン設定の整合が取れていない感じです。

そのような理由から、綺麗な設計では無いのですが・・・・VPNの機能上問題はありません。

管理上は問題が残っています。繰り返しになりますが、上記のソースを適用すると、自宅LAN内でSSH接続できなくなります・・・。

もう少し設定の調整が必要です。お待ち下さい。


IPv6(IPoE)ルータの設定変更は不要

昔、VPSにOpenVPNルータを構築した時は。

V6プラス自宅LANに外出先からアクセス①設計編
①設計編 ②VPS基本設定 ③OpenVPNサーバ構築 ④ルータ役PCの設定 ⑤リモートアクセスPCの設定 ...

V6プラス環境に外出先からアクセスするために、Wi-Fiルータの設定を変更して、ルーティングを追加する必要がありました。

この記事の、Fedora 37 ServerによるIPv4(PPPoE)接続+LibreswanによるVPNサーバ(ルータ)構築では、Wi-Fiルータの設定変更は必要ありませんでした。

Raspberry Pi 4サーバが、VPNクライアントのIPアドレスを使用して、すべての通信を行ってくれている感じです。前述のeth0とppp0のフォワーディングのおかげかと思います。


VPNクライアント設定

VPNサーバの構築が完了しましたので。

VPNクライアントとして、iPhoneとWindows 10 PCを設定してみたいと思います。

iPhoneから接続

次の手順でVPN設定を作成します。

  1. 設定→一般→VPNとデバイス管理→VPN
  2. VPN構成を追加
    1. タイプ:IPSec
    2. 説明:自宅VPN等任意
    3. サーバ:Raspberry PiのDDNS名を入力
    4. アカウント:Raspberry Piログイン時のユーザ名を入力
    5. パスワード:Raspberry Piログイン時のパスワードを入力
    6. シークレット:/etc/ipsec.secretに記入したPSKを入力
  3. 「完了」をクリックして設定を保存します。

iPhoneの場合、以上でVPN接続できるようになりました。

IPアドレス欄に、確かにおうちLANのアドレスが割り振られています。

IPフォワードを有効にしましたので、おうちLAN内の機器に、外出先からiphoneでアクセスできるようになりました。


Windows PCから接続

Windows PCで、IKEv1 XAUTH with PSKサーバにアクセスしたい場合、クライアントアプリのインストールが必要です。

https://www.shrew.net/download/vpn

こちらからダウンロードさせて頂きました。

インストール時「Standard Edition」を選択します。

インストール完了後、VPN Access Mangerを起動し、設定を作成します。

  1. Generalタブ→Host Name or IP Address欄に、Dynamic DNSホスト名を入力します。
  2. Authenticationタブ→Authentication Methodは「Mutual PSK + XAuth」を選択します。
  3. CredentialsタブPre Shared Key欄にPSKを入力します。
  4. Phase 1タブ、ExchangeTypeを「main」に変更します。今回のipsec.conf設定は、aggressiveモードでは通信できない設定のため、mainを選んだかたちです。
  5. Saveボタンを押下して設定を保存します。
  6. 接続時、UsernameとPasswordを入力、「Connect」ボタンを押下します。

無事接続できましたでしょうか?


Fedora再起動後のPPPoE再接続

以上のように、Raspberry Pi 4でVPNサーバを構築してみましたが。

Raspberry Piを再起動すると、どうもPPPoE接続が切断されてしまい、VPNサーバに接続できなくなってしまいます。

このあたりは、まだ課題があります。

回避策としまして、再起動後に次のコマンドでPPPoE、Dynamic DNS登録、VPNサーバを再起動しています。

sudo pppoe-start
sudo systemctl restart noip2.service
sudo systemctl restart ipsec.service

この後は、VPNクライアントが再接続できるようになりましたが。

systemd関連の設定をチューニングする必要がありそうです。

とはいえ、ひとまずVPNサーバの構築は以上で完了です。


IPv6(IPoE)環境にて。

Raspberry Pi 4でIPv4(PPPoE)接続を行い。

ipsec.serviceを起動し、外出先のiPhoneやWindows PCから、おうちLANにリモートアクセスできるようにしてみました。

なお、今回作成した/etc/ipsec.confでは、Aggressiveモードでは接続できません。

Androidで接続する場合も、Aggressiveモードではなく、Mainを選択する必要がありますのでご注意下さい。(豆

IPSec/L2TPでサーバを構築すれば、Windows PCからも簡単にアクセスできるのかもしれませんが。昨今のセキュリティ事情を考え、今回は一つ上のグレードである、IKEv1 XAUTH with PSKを使用させて頂きました。

VPNサーバの構築は、IKEv2でも試しましたが、証明書の扱いがとても大変とわかりました。管理面で問題があると言いますか。今回のIKEv1 XAUTH with PSKは管理が容易なうえ、当分は機能的・セキュリティ的に十分なスペックかなと思います。

IPv6(IPoE)導入で、ほぼ諦めていた、おうちLANへのVPNアクセスが、何年かぶりに復活しました。これで自宅サーバの構築が捗りそうです。

まあVPN接続中のインターネットアクセス速度は10Mbps程度に低下するのですが・・・・自宅LANへのアクセスが最優先ですので、仕方がない感じがします。

※23.1.18追記:

firewalldの設定がまだ完成していない状況のため、もうしばらくお待ち下さい。

スポンサーリンク

フォローする

スポンサーリンク