現在、わたしの自宅LANは、IPv6(IPoE)でインターネット接続しております。具体的にはtransixサービスになります。
IPv4(PPPoE)接続とは異なり、IPv6(IPoE)は市販のVPNルータを使用できません。VPNリモートアクセスによる、外出先から自宅LANへのアクセスはできなくなりました。自宅にサーバを置きたい場合、少し不便な状態です。
一方。先日、Raspberry Pi 4にFedora Serverをインストールして、IPv6(IPoE)環境の中から、PPPoE接続ができる環境を構築しました。
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月現在、次の方式を検討しました。
- IKEv2
- IKEv1 XAUTH with PSK
- 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からIPv4(PPPoE)接続
もしも、IPv6(IPoE)環境では無く、IPv4(PPPoe)でインターネットに接続している場合は、VPNサーバ機能を持つWi-Fiルータを設置すれば、外出先から自宅LANにアクセス可能だと思います。
そうではなく、IPv6(IPoE)環境で、VPNルータを設置できない状況を想定しております。
IPv6(IPoE)の契約とは別に、IPv4(PPPoe)のISP(インターネット・サービス・プロバイダ)契約が必要です。PPPoEアカウント(ユーザ名/パスワード)をご用意頂いた状況で、Raspberry PiからIPv4(PPPoE)接続します。
こちらの記事になります。
ISP契約のオプションとして、グローバルな静的IPアドレスを契約した場合は、常に同じIPアドレスが割り当てられるため、Dynamic DNSは不要です。
PPPoE接続を行うたびに、異なるグローバルIPアドレスが割り当たる場合、別途Dynamic DNSの設定が必要になります。
IPアドレスが変わっても、外出先からホスト名でアクセスできるように、Dynamic DNSサーバの自動登録を行おうと思います。
こちらの記事は、no-ipによるDynamic DNS自動登録の手順になります。
以上で、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
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つで行われる設定になります。
- PSK
- この記事の設定では「ExampleSecret」
- ユーザ名/パスワード
- 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つほど、設定が必要のようです。
- IPSec関連のファイアウォール・サービス追加(着信可能な設定)
- ポートフォワーディングの有効化
- ファイアウォールのゾーン設定調整(自宅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のゾーン設定を行っています。
- externalゾーン
- 上述のように、ppp0に紐付けました。
- 自宅LANのセグメント、192.168.xxx.0/24をソースに追加することで、インターネットへのアクセスと、自宅LAN機器へのアクセスが可能になりました。
- 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プラス環境に外出先からアクセスするために、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設定を作成します。
- 設定→一般→VPNとデバイス管理→VPN
- VPN構成を追加
- タイプ:IPSec
- 説明:自宅VPN等任意
- サーバ:Raspberry PiのDDNS名を入力
- アカウント:Raspberry Piログイン時のユーザ名を入力
- パスワード:Raspberry Piログイン時のパスワードを入力
- シークレット:/etc/ipsec.secretに記入したPSKを入力
- 「完了」をクリックして設定を保存します。
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を起動し、設定を作成します。
- Generalタブ→Host Name or IP Address欄に、Dynamic DNSホスト名を入力します。
- Authenticationタブ→Authentication Methodは「Mutual PSK + XAuth」を選択します。
- CredentialsタブPre Shared Key欄にPSKを入力します。
- Phase 1タブ、ExchangeTypeを「main」に変更します。今回のipsec.conf設定は、aggressiveモードでは通信できない設定のため、mainを選んだかたちです。
- Saveボタンを押下して設定を保存します。
- 接続時、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の設定がまだ完成していない状況のため、もうしばらくお待ち下さい。