Raspberry Piを利用したL2TPでのVPN構築
この記事は2022/04/05に作成されました。
VPNを構築する場合、一番簡単な方法はルーターに付属しているVPN機能を利用する方法ではありますが、ルーターにVPN機能が無い場合やVPNのセキュリティなどが弱い可能性がある場合、ルーター自体の性能が低い場合などは別途VPNサーバーを構築した方が良い場合があります。
VPNは、L2TP/IPsec(L2TP自体に暗号化通信機能が無いため、暗号化機能を提供するIPsecと組み合わせるためこの表記をするのが一般的です。TCP/IPなどの表記と同じですね。)、PPTP、SSTP、OpenVPNなどいくつかの種類があります。セキュリティの強度や使いやすさなどを考えると、L2TP/IPsecやOpenVPNが現状では一番利用しやすいものでしょう。
L2TP/IPsecはWindowsなどでデフォルトにサポートされているため、追加のソフトウェア無しで接続できますが、OpenVPNでは通常クライアントソフトを別途インストールして利用する必要があります。また、状況にもよりますが、OpenVPNは若干通信速度がでないように感じます。L2TP/IPsecも通信速度自体は暗号化処理が多く、比較的低速とされているため、速度を重視される場合は、IKEv2などの新しいプロトコルを利用する手もあります。但し、現時点では互換性が低いため、どのPCや端末でも利用できない点が難点です。
今回は必要に迫られてL2TP/IPsecによるVPN構築をRaspberry Piで行ったので、そのときの実装方法を記します。
Raspberry PiへのOSインストールと設定
利用したのはRaspberry Pi3 ModelB+です。最近Raspberry Piの売り切れが多く、入手しづらいですが、どこの家にも1つはあるでしょうから問題無いでしょう。無ければ、がんばって入手しましょう。今回はRasberry Pi3 ModelB+を利用しましたが、Rasberry Pi2とかでも恐らく動きます。
まずは、Raspberry Pi OSをインストールします。Raspberry Pi Imagerで書き込めるので便利になりました。今回は32Bit版を利用しています。64Bit版でも恐らく動くとは思いますが、検証していません。
今回は、このRasberry PiをVPNサーバーとします。
SDカードに書き込んだRaspberry Pi OSを起動し、
$sudo raspi-config
で設定画面を表示し、最低限の設定をしておきます。SSHは不許可にしておいた方が無難でしょう。
ついでにパッケージもアップデートしておきます。
$sudo apt upgrade
IPアドレスは初期状態だとDHCPから取得するようになっていますが、これは固定しておいた方が良いでしょう。
$sudo nano /etc/dhcpcd.conf または $sudo vi /etc/dhcpd.conf
で編集を行います。
一番末尾にinterface eth0
static ip_address=固定したいIPアドレス/ネットマスク値
static routers=デフォルトゲートウエイのIPアドレス
static domain_name_servers=DNSサーバーのIPアドレス(通常はデフォルトゲートウエイのIPアドレスでOK)
を追記します。なお、無線LANで接続したい場合は、eth0のところがwlan0になります。
これを保存し、
$sudo reboot
で一度Raspberry Piを再起動すれば固定IPが適用されます。
Raspberry PiへのVPNサーバーソフトの導入と設定
後はいろいろとパッケージを入れて、L2TP環境を揃えていくのですが、結構紹介されている記事などに従って設定しても上手く動作しない可能性が高いです。
そのため、今回は、
https://github.com/hwdsl2/setup-ipsec-vpn
にて提供されているL2TP/IPsec環境をほぼ自動で作成してくれるscriptを利用します。
L2TPで接続したときのユーザー名やパスワードをランダムで生成し、設定して貰う方法が一番簡単ですが、それは以下のコマンド$wget https://git.io/vpnsetup -O vpnsetup.sh && sudo sh vpnsetup.sh
でOKです。wgetが無い、エラーが出たら$sudo apt install wget
でインストールしておきましょう。
これだけで自動的に必要なパッケージをダウンロードして設定まで完了してくれます。
完了画面に接続のためのIPアドレス、ユーザー名とパスワードが表示されるので、その情報を使ってWindowsなどから接続をします。このときに接続するWindowsマシンなどはVPNクライアントとなります。
もし、ユーザー名やパスワードを手動で設定したい場合は、$wget https://git.io/vpnsetup -O vpnsetup.sh
で一度設定ファイルのみをダウンロードします。$vi vpnsetup.shまたは$nano vpnsetup.sh
でvpnsetup.shを編集します。
書き換えるところは3カ所で、
YOUR_IPSEC_PSK,YOUR_USERNAME,YOUR_PASSWORD
の=の後に''で括りながら記述します。
この場合のVPNはユーザー名とパスワードだけで接続できてしまい、悪意のある人に万が一接続されてしまっては大変な状態を引き起こす可能性があるため、できるだけ強固なユーザー名とパスワードを組み合わせ、必要に応じて別のセキュリティソリューションを組み合わせるなどした方が良いでしょう。
IPSEC_PSKはある程度の長さの適当な英数字を入れておけばOKです。
保存し終わったら、$sudo sh vpnsetup.sh
でVPNを設定してもらいます。
ルーターの設定とVPN接続
設定が完了したら、ルーターの設定を変更します。ここからはルーターによって設定が異なるので、必要に応じてルーターのマニュアル等を参照してください。
ファイヤーウォールが有効な場合は、UDPの500番とUDPの4500番ポート、UDPの1701番を開け、ポートフォーワーディングで500番と4500番、1701番へのアクセスをVPNサーバーに対して指定した固定IPへ振り向くように設定します。
ルーターによっては、NATパススルーでIPSecとL2TPのパススルーを設定する必要があります。設定可能なルーターであれば、有効化してパススルーするようにします。
問題が無ければこれでWindowsなどでVPN接続が可能です。
Windows10であれば、「ネットワークとインターネット」から「VPN」を選択し、「VPN接続を追加する」を選択します。
後は図表のように必要事項を入力します。サーバー名またはアドレスは、VPNサーバーが置いてある環境のグローバルIPアドレスを指定します。VPNサーバーのIPアドレスではない点、注意が必要です。VPNサーバーと同じネットワークにあるマシンからhttps://www.cman.jp/network/support/go_access.cgiなどへアクセスすることで確認できます。
VPNクライアントに割り振るIPアドレス範囲の設定
VPNサーバーに接続したVPNクライアント側には自動的にIPアドレスが割り振られますが、このIPアドレスを変更したい場合は、$sudo nano /etc/xl2tpd/xl2tpd.confまたは$sudo vi /etc/xl2tpd/xl2tpd.conf
で編集を行います。
ip rangeのところがVPNクライアントに割り振るIPアドレス領域なので、ここを編集します。
もし、VPNサーバーと同じネットワーク内のリソースにアクセスしたいのであれば、VPNサーバーと同じネットワークに属するようにIPアドレスを振るようにします。
例えば、192.168.0.10がVPNサーバーであれば、192.168.0.100-192.168.0.200のように設定します。
local ipはVPNサーバーに対して設定したIPアドレスになっていることを確認します。違っていたら変更しておきましょう。
編集が終わったら保存しておきます。
設定が問題無ければこれで接続ができます。接続ができない場合、ほとんどのケースでルーターの設定が間違えている可能性が高いでしょう。設定を見直しても直らない場合は、VPNサーバーをDMZに配置するようにルーターを設定すると上手くいくことが多いです。(セキュリティリスクが高くなるので運用上のリスクを計算した上で行ってください)
終わりに
接続ができれば、後は普通のLAN内に居るときと同じように扱うことができます。快適なVPNライフを。
コムセントでは、VPNに限らずネットワーク同士を連携してサービスを運用したり、クラウドシステムと社内ネットワークを接続して運用するシステム構築も担っています。
現状を変更したい、改良したいシステムなどがあればお気軽にお問い合わせください。
CTO/sekiguchi