□IPv6接続用OpenVPNルーターの構築
ホームゲートウェイなどの一次ルーターの下に、NanoPiやRasPiなどのOpenVPNルーター:二次ルーターを構築することで、外部(WAN)からはIPv6でVPN接続をするが、内部(LAN)内にはIPv4アドレスでアクセスするための構築記事です。
・はじめに
昨今のインターネット接続環境はIPoE方式が主流となり、IPv4グローバルIPアドレスが複数のユーザーで共有されるようになっている。このため、かつてのPPPoE接続のように「自分専用のIPv4アドレスを使って、外部から自由に任意のポートを開放する」ことが困難になっている。
もちろん、プロバイダーを厳選してPPPoE接続を維持したり、IPoE接続でも追加料金で固定IPv4オプションを利用したりする方法もある。しかし、やりたいことはIPv4でのWebサーバーの公開などではなく、外出先から自宅(192.168.xx.xx)のWindows 11へリモートデスクトップ接続をしたいだけなので、
そこまで手間も費用も掛ける事ははばかられる。
当初、YAMAHA RTXシリーズを用いたVPN構築を検討したが、WAN側がIPv6環境(IPoE)となると、IPv4を前提としたL2TP/IPsecは利用できない。また、IPv6ネイティブで動作するIKEv2による構築も検討したが、Windows 11標準クライアントのセキュリティ要件(証明書の厳格な運用など)が非常に高く、個人での構築・維持はこれもまた現実的ではない。
そこで、WAN側がIPv6でも問題のないOpenVPNルーターを構築して、Windows11にもOpenVPNクライアントソフトをインストールして、VPN接続する。
・ホームゲートウェイ(一次ルーター)
NTT東のフレッツネクスト等では、IPv6のWAN側からLAN側へのアクセスはホームゲートウェイでフィルターされている。これに対して、ほかの接続回線、特にスマホのような直接IPv6接続している場合には、AndroidOSのように基本的にフィルター無しとしているモノもあるので注意したい。
(Androidはアプリ次第、iPhoneはOSがデフォルトでフィルターしている)
今回はNTT東のXG-100NEで話を勧めていくが、適宜自分の環境や機器に読み替えて欲しい。
OpenVPNが接続を待ち受けるのはデフォルトでは「UDP:1194番ポート」なので、NTT東のXG-100NEの設定画面に入り、メニューのルーター設定にある「IPv6 パケットフィルタ設定(IPoE)」を選択する。すると「IPv6ファイアーウォール機能」が「有効」、さらに「IPv6セキュリティのレベル」が「標準」になっているはず。
その下にある「IPv6 パケットフィルタ設定(IPoE)」の空いているエントリ番号の「編集」を選択して
・フィルタ種別 許可
・通信方向 IPoE→LAN
・プロトコル UDP
・送信元IPv6プレフィックス/プレフィックス長 全て指定
・宛先IPv6プレフィックス/プレフィックス長 全て指定
・送信元ポート 全て指定
・宛先ポート ポート番号指定 1194
・ICMPv6タイプ 全て指定
・ICMPv6コード 全て指定
として、WAN側からの「UDP:1194番ポート」を許可する設定をする。
ここで忘れてはいけないのは「設定」ボタンを押して「IPv6 パケットフィルタ設定(IPoE)」に戻ったら、
今設定したエントリの「有効」にチェックして、あらためて「設定」ボタンを押さないと、ポート開放されないので注意すること。
これで外部からOpenVPNサーバーの待ち受けポートへの穴は開いたので、あとはOpenVPNルーターを構築していくことになる。
・OpenVPNサーバー(二次ルーター)
ホームゲートウェイなどの一次ルーターの下に、NanoPiやRasPiなどで別途OpenVPNルーターを構築していく。たまたま手元にNanoPi R2Sという二つのポートをもつSoCがあったのでこれで話を勧めていくが、適宜自分の環境や機器に読み替えて欲しい。LANポートが二つあれば、人間からすると物理的にポートが分かれているので判りやすいが、マシンとしてはIPv4とIPv6は別口なので、ポートが一つでも問題ない。
0) NanoPiのへのArmbianのインストール
NanoPiというとOSはArmbian一択、OpenVPNサーバーしかしないならArmbianはminimalを選択して、あとからパッケージをインストールすればOK。NanoPiやArmbianのセットアップ方法については割愛する。(そもそもNanoPi持っているなら知っているはず)
RasPiの場合にはRaspberry Pi Imagerがあるし、Armbianも最近はArmbian Imagerというのが出てきたので、起動イメージを作ること自体は昔に比べたら楽になりました。
どちらにしてもOS(RaspbianやArmbian)が起動したらあとはLinuxの話なので、Linuxの知識は必須です。このあとの作業はrootになってやった方が楽なので、sudoではなくて
su -
でルートにユーザーを切り替えることをおススメ。
1) パッケージいろいろインストール
apt -y install net-tools traceroute bind9-dnsutils build-essential emacs
nanoに慣れていないのEmacsも入れた。
2) ネットワーク設定とブリッジポートの作成
Armbianのネットワークは「netplan」が「systemd-networkd」で管理しているので、NetworkManagerは使わない方が良い。
まずはブリッジの作成。
ip a
で、NanoPi R2SのWAN(end0とか)と、LAN(enxMACADDRESS)を確認して、以下の設定ファイルを編集すること。
apt -y install bridge-utils
cp /etc/netplan/10-dhcp-all-interfaces.yaml /etc/netplan/10-dhcp-all-interfaces.yaml.org
emacs /etc/netplan/10-dhcp-all-interfaces.yaml
# Added by Armbian
#
# Reference: https://netplan.readthedocs.io/en/stable/netplan-yaml/
#
# Let systemd-networkd manage all Ethernet devices on this system, but be configured by Netplan.
network:
version: 2
renderer: networkd
ethernets:
# WAN: 内蔵ポート (IPv6のみRAで受け取り、ひかり電話を契約している場合にはaccept-raはnoがいい場合も)
end0:
dhcp4: no
dhcp6: yes
accept-ra: yes
# LAN: USBポート接続 (ブリッジでアドレス設定をするので実際にはここには何も設定しない)
enxMACADDRESS:
dhcp4: no
dhcp6: no
bridges:
# Bridge: ブリッジポート (IPv4固定アドレス)
br0:
interfaces: [enxMACADDRESS]
addresses:
- 192.168.100.2/24
parameters:
stp: false
forward-delay: 0
dhcp4: no
dhcp6: no
※デバイス名を「match: “~”」で指定しようとしても、最初の一文字だけしか見ていないのか、
end0にもenx*のaddressesが適用されてしまうため、具体的にデバイス名を指定しないといけない
netplan try
で(Bridgeは復元をサポートしてないからどうなっても知らんで、と言われるけど)OKなら、再起動して改めて
ip a
でWAN側ポートでIPv6アドレスが取得出来ていること、ブリッジポートにLAN側アドレスが設定されていることを確認すること。
二分経過してもコマンドプロンプトが戻らない場合には設定を間違えている可能性が高いので、
中に入って編集しなおすか、OSを焼き直して最初からやり直し。
3) MyDNS.JPの設定
MyDNS.JPに登録してMasterIDとPasswordを取得したら、ログインしてOpenVPNの接続先ホスト名を決めてDOMAIN INFOで「openvpn.hogehoge.mydns.jp」のようにして設定する。
ホスト名を決めて設定したら、OpenVPNルーター(二次ルーター)からMyDNS.JPに対してIPv6アドレスの通知をする。
cat > /root/mydns.sh
#!/bin/sh
#
# openvpn.hogehoge.mydns.jp (IPv6のみ通知)
/usr/bin/wget -O - 'https://MasterID:Password@ipv6.mydns.jp/login.html'
として実行権限をつけたら
/root/mydns.sh
として実行してきちんと通知できていることを確認。
あとは
crontab -e
として
#
# IP Notify to MyDNS.JP
12,22,32,42,52 * * * * /root/mydns.sh 1> /var/log/mydns.log 2> /dev/null
#
※毎時12分から10分ごとに通知
として定期的に通知をするようにして、OpenVPNの接続先ホスト名のIPv6アドレスがきちんと引けていることを確認する。
ip a
dig openvpn.hogehoge.mydns.jp AAAA
OpenVPNルーターに割り当てられたIPv6アドレス(ip aで確認したもの)とMyDNS.JPに通知しているIPv6アドレスが同じならOK。
4) OpenVPN
ホームゲートウェイ(一次ルーター)でIPv6のIDP:1194番ポートに穴をあけて、OpenVPNルーター(二次ルーター)でOSの設定もして、IPv6アドレスとホスト名の関連付けもできるようになったら、OpenVPNのインストール。
apt -y install openvpn
インストール出来たら、インストールツールも取得して実行。
cd /root/
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
./openvpn-install.sh
インストール出来たら、
emacs /etc/openvpn/server/server.conf
proto udp6 dev tap0 server-bridge 192.168.100.1 255.255.255.0 192.168.100.91 192.168.70.99 script-security 2 up "/etc/openvpn/server/up.sh" down "/etc/openvpn/server/down.sh"
※VPN接続の待ち受けはUDP:IPv6で。
※Windows11からの接続はtunではなくてtapで。
※OpenVPNサーバーからクライアントへのIPアドレスの割り当ては192.168.100.91~99/24で。
※OpenVPNサービスの再起動でブリッジとの関連付けをし直すスクリプトの指定と…
ブリッジとの関連付けをし直すスクリプトを用意。
cat > /etc/openvpn/server/up.sh
#!/bin/sh
ip link set "$1" up
ip link set "$1" master br0
cat > /etc/openvpn/server/down.sh
#!/bin/sh
ip link set "$1" nomaster
ip link set "$1" down
chmod +x /etc/openvpn/server/*.sh
systemctl restart openvpn-server@server
これでエラーがでなければ、OpenVPNサーバーは無事に起動している。
あとはOpenVPNサーバーでのIPv4の転送を許可すれば
emacs /etc/sysctl.conf
net.ipv4.conf.all.forwarding=1
としたら、
sysctl -p
これでOpenVPNサーバーの準備が完了したので、あとはWindows11にクライアントソフトを入れるだけ。
5) Windows11
からOpenVPNをダウンロード。
インストール時に「COSTOMIZE」を選択して、ブリッジ接続(tap)用の「TAPドライバ」を忘れずにインストール。インストールが完了したら、Windowsのネットワークの詳細設定を開き、「OpenVPN-TAP-Windows6」アダプターが存在することを確認。
そしたらサーバー側で
./openvpn-install.sh interactive
として、サーバー側に実在するユーザー(USERID)を追加する。
パスフレーズ無しでもできるが、念のためパスフレーズを有効にした認証鍵を作る。
するとそのユーザーのホームディレクトリに「USERID.ovpn」という認証鍵が書かれたファイルができている。
あとはWindows11で、「C:\Program Files\OpenVPN\sample-config\client.ovpn」を、
「C:\Users\USERID\OpenVPN\config\任意の名前.ovpn」としてコピーしてから、
先の認証鍵のファイル(USERID.ovpn)と合体して、以下のように設定を編集する。
C:\Users\USERID\OpenVPN\config\任意の名前.ovpn
client
dev tap
proto udp6
remote openvpn.hogehoge.mydns.jp 1194
(USERID.ovpnの中身をコピペ)
verb 3
route-delay 2
※devのtunをtapに。
※protoのudpをudp6に。
※remoteでOpenVPNサーバーのホスト名とポート番号を指定。
※何処でもいいのでUSERID.ovpnの中身をコピペ。
※route-delay 2とすると、Windowsでの接続が安定するらしい
あとはOpenVPNのクライアントソフト(タスクバーにこっそり隠れているので右クリック)で接続しようとすると、パスフレーズが求められるので、正しく入力すれば、サクッと接続できるはず。
接続出来たら、コマンドプロンプトなどでWindows11にIPアドレスの割り当てがされているかを確認。
OKなら、実際にリモートデスクトップ接続をしてみればよい。