投稿

ラベル(OpenVPN)が付いた投稿を表示しています

OpenWrt の OpenVPN(サーバー)についての包括的メモ

イメージ
一応、公式に基本ガイド(👉 OpenVPN Basic )があるが、「 OpenWrt の OpenVPN 基本ガイドの徹底解析 」で先日述べたように何かと不満があるので、自分用を兼ねて包括的なメモを記しておくことにする。 情報の鮮度的には、古い方のルーター(OpenWrt v18.06.2)が OpenVPN v2.4.5、新しい方のルーター(OpenWrt v19.07-SNAPSHOT)が OpenVPN v2.4.7 である。 また、クライアント側は、macOS の Tunnelblick を使用している。 ソフトウェア openvpn-openssl と openvpn-easy-rsa(と luci-app-openvpn)を LuCI からインストールした。 PKI PKI については基本ガイドや巷の情報でほとんど十分だと思うので基本的に割愛する(👉 Easy-RSA 3 Quickstart 、 Easy-RSA 3 )。PKI 用の easyrsa コマンドは /etc/easy-rsa で実行し、PKI のパスが /etc/easy-rsa/pki となりその以下に各ファイルが配置されている。ただし、openvpn コマンドで作成する tlscrypt.key のみ、/etc/openvpn に置いている。 cd /etc/easy-rsa easyrsa init-pki easyrsa build-ca nopass easyrsa build-server-full openvpn-server nopass easyrsa build-client-full openvpn-client nopass easyrsa gen-dh openvpn --genkey --secret /etc/openvpn/tlscrypt.key TAP サーバーとして動かす場合 TAP サーバーとして設定するのは特に難しくなく、既存の情報で何か不足するようなこともない。 tap0 の準備 OpenVPN 自体の設定に一所懸命になっていると、この作業を思わず忘れてしまっていて動かずに原因がわからずに悩む場合があるが、仮想のものではあるとは言っても、まずは tap0 というインターフェースを用意してア

OpenWrt の OpenVPN 基本ガイドの徹底解析

イメージ
OpenWrt 公式の OpenVPN の基本ガイド(👉 OpenVPN Basic )について。(日本人にとっては英語情報であるということ以前に、たとえネイティブであってとしても)ただ単に設定方法のシェルコマンドが掲載してあるだけで、ほとんど説明がされていないので、今回はかなり細かく解析して検証してみたいと思う。 ソフトウェアのインストール opkg update opkg install openvpn-openssl openvpn-easy-rsa これは一目瞭然だと思うが、openvpn-openssl と openvpn-easy-rsa パッケージをインストールしているだけ。LuCI からアプリをインストールするのと何ら違いはない。 openvpn-openssl が OpenVPN サーバー本体。openvpn-easy-rsa は証明書と鍵を生成するための認証局用のプログラム(easyrsa コマンドを使えるようにする)。この OpenWrt ルーターで証明書・鍵を直接発行せずに、他の PC 等で別途用意した証明書・鍵をルーターに持ってきて使用する場合には、openvpn-easy-rsa の方のインストールは必ずしも必要ではないのかもしれない。 証明書・鍵の発行 これだけが openvpn-easy-rsa に関する作業で、OpenVPN 本体とは直接関係がない、下準備に関する話ので、先に説明を済ませておくことにする。 easyrsa init-pki easyrsa gen-dh easyrsa build-ca nopass easyrsa build-server-full server nopass easyrsa build-client-full client nopass openvpn --genkey --secret /etc/easy-rsa/pki/tc.pem 各コマンドの意義は原文のコメントにある通り: Remove and re-initialize the PKI directory Generate DH parameters Create a new CA Generate a keypair and sign locally for a server Gen

OpenWrt on WZR-HP-AG300H: VPN サーバー

イメージ
VPN は tun モードでセットアップした(が、それとは別に tap モードでもセットアップし、両立させた)。基本的には OpenWrt 公式のガイド(👉 OpenVPN Basic )に従ったが、必ずしも公式ガイドその通りに uci コマンドを使ってセットアップせずとも、コンフィグファイルを直接編集したり、一部の操作は LuCI でも代用できると思う。 PKI の準備 PKI をセットアップ(= Easy-RSA をインストール)し、必要な証明書等を生成する。これはガイドの通りにそのまま。 👉 OpenVPN Basic: PKI VPN 用の仮想の物理インターフェースの作成と、論理インターフェースの作成 仮想の物理インターフェース tun0 を紐付けた論理インターフェース vpn_router を作成する。プロトコルは none(LuCI 上では Unmanaged と表示される)👉 OpenVPN Basic: Network また、これは独自にやり方を見出したが、tap モードでセットアップすることもでき、物理インターフェース tap0 を作った場合は、論理インターフェースを新設せず、論理インターフェース lan の物理インターフェースの一つとして tap0 を追加するだけで良い(上のスクリーンショット。論理的に lan の一部として存在するので、tun モードの場合のように、Firewall の設定をする必要はない)。 OpenVPN Services OpenVPN サービスをセットアップ(= openvpn-openssl をインストール)し、設定する。ガイドでは uci コマンドを使っているが、luci-app-openvpn をインストールすれば、LuCI の GUI でも代用できないことはないと思う。ガイドの uci コマンドでは環境変数を使って自動化している部分があり、何らかの理由で不具合がある場合には、あとで適宜設定を修正する必要があるかもしれない。また、VPN 用のネットワークアドレスも、自分で使いたいものに修正する。👉 OpenVPN Basic: VPN-Service ポート番号が重複しないようにすれば、同時に、tun と tap のサーバー(上のスクリーンショットの router_server と

OpenVPN を TAP(ブリッジ)→ TUN(ルーター)へ変更

イメージ
基本的に VPN と NFS を使った利用環境は構築できたので、最後に少しでも VPN を最適化しておきたくなり、OpenVPN のモードを TAP(ブリッジ)から TUN(ルーター)へ変更することにした。 .ovpn まずはサーバー(DD-WRT)側と、クライアント側(Mac、Linux)双方で、.ovpn 中の dev 設定を tap から tun に変えることが基本となる。 dev tun クライアント側はこれだけで他にやることはない。一方、サーバー側ではルーターモード制に伴ういくつかの副作用的な状況を解決するための設定が必要となる。 サーバー(DD-WRT)側 設定中で tun にする以外に、VPN 専用のサブネットの設定が必要になる。DD-WRT の設定の、TUN / TAP を選択する直下の Network と Netmask の部分がそれである。ここの例では 192.168.11.0/24 としてみた。 ブリッジモードではクライアントはそのままサーバー側のサブネット(192.168.0.0/24 とする)に参加する形となり、VPN サーバーが DHCP サーバーとしてクライアントに IP プールの中から一つ割り当てる形だった。ルーターモードでは、VPN 用のサブネット(192.168.11.0/24)丸ごとが IP プールとなりそれをクライアントに割り当てる。なので、VPN クライアントはサーバー側の本来のサブネットには直接参加しない形となるので、VPN 用のサブネットからサーバー側の本来のサブネットへとアクセスするためのルーティング設定が必要となる。そのために、DD-WRT の Additional Config においてクライアントにプッシュする形でルーティング設定をセットする。 push "redirect-gateway def1 bypass-dhcp" ※ "route 192.168.11.0 255.255.255.0" を別途 push する必要はない。redirect-gateway でリダイレクトされる Gateway 設定に同じ route 情報は含まれている。 さらに、これで VPN サブネット側のクライアントがサーバー側の本来のサブネットにアクセスでき

VPN 接続(Tunnelblick)と NFS マウントの自動化

👉 先の記事 で sudo がパスワード入力なしで実行できるようになったので、それを前提として VPN 接続に連動して NFS のマウント/アンマウントを自動化する方法を確立した。 (Tunnelblick のベースである)OpenVPN 自体の仕様で .ovpn ファイルの設定で up / down 用のスクリプトを指定できるようになっている。この仕様に加えて、Tunnelblick では、connected.sh と pre-disconnect.sh という名前のスクリプトをそれぞれ up / down 用スクリプトとして割り当てることによって「接続後」「切断前」に実行するスクリプトとし扱ってくれるようだ。 なので、connected.sh と pre-disconnect.sh を用意し、それぞれにおいて、NFS をマウント/切断する処理を記述しておいた。 connected.sh #!/bin/sh sudo mkdir /Volumes/NFS sudo mount_nfs -P 192.168.0.1:/share /Volumes/NFS pre-disconnect.sh #!/bin/sh sudo umount /Volumes/NFS ※ umount 時に /Volumes/NFS は自動的に rmdir されるので、rmdir は明示的に行う必要はない。 以上の 2 種のスクリプトを用意した上で、.ovpn に .ovpn up ~/OpenVPN/connected.sh down ~/OpenVPN/pre-disconnect.sh といったような形式の設定を追加する。 最後に、Tunnelblick で .ovpn をインポートする。これだけである。 ※ .ovpn や .sh を修正した場合、都度 Tunnelblick にインポートし直す必要がある点に注意する。Tunnelblick はインポート時に自前で .ovpn や .sh をコピーしてそれを直接使うので、インポート元の .ovpn や .sh を修正しただけでは Tunnelblick の挙動に反映されない。 Mac から NFS を使ってみた結果…… iCloud ドライブや Google ドライブのような感覚で使いたいと思

VPN 環境の OpenVPN 化

イメージ
Mac をいじり出して、iCloud を軸にした標準アプリの設計思想が非常に気に入ってしまった。一般のユーザー視点なら無料 5GB で十分である。 ところが、Mac をメイン機とするならば、僕の場合、エンジニア(プログラマー)的側面も、一般ユーザーとしての立場に加えて必要になってくる。外にも持ち歩く MacBook に、開発中のデータが入っているのは非常にリスクが高いから、データの保管場所が MacBook の実機に依存するのは避けたい。だが、アプリを開発するためのプロジェクトファイルを iCloud ドライブにぶち込んでしまうと、どうやってもすぐに無料で利用できる 5GB の限界に達してしまう。かといって課金までして iCloud を増量したいとも思わない。 となると、せっかく実家で運用している QNAP 製の NAS があるので、それを使って iCloud のような運用ができないかと考えた。これまではデータを随時バックアップするという用途に NAS を使っていたのだが、クラウド的に、データ本体を常に NAS 側に置いておいて、それを端末側で参照するという形である。 ところが、写真などのマルテメディアデータはそのような専用のアプリが存在するのだが、ファイル一般となると iCloud ドライブのような使い方のできるオープンなアプリが存在しない。iCloud ドライブは macOS 専用だし、Google Drive にしても専用アプリをインストールする必要があり、それも Windows と macOS のみで Linux では使えない。 また、昔からある SMB の場合、LAN での利用を前提としていて、クラウドよりも一昔前のスタイルのまま停滞している感がある。 WebDAV 選択肢が限られていたので、まず最初に QNAP NAS で使える WebDAV を使ってみることにした。これは、macOS でも Linux でも標準で使えて、ネットワークドライブとして iCloud ドライブや Google Drive のようにアクセスが可能である。 ところが、WebDAV にはバグがあり、それは WebDAV が依存している apache のバグに由来するようだが、フォルダに index.html のファイルが存在すると、そのフォルダが空っぽ状態でファイル