Tech Note Plus

PC から Azure まで幅広い伝道を目指してます

OpenWrt で OpenVPN (トンネル/ブリッジ/クライアント) を設定する

この記事では OpenWrt の OpenVPN に関する設定を記載しています。既に OpenWrt を用いたインターネット接続は以下の記事にて完了しています。 cube309b.hatenablog.com

OpenVPN に求める要件

やりたいこと

OpenVPN は着信ポート可変で VPN が可能なので、非固定 IP の v6 プラス時代から市販ルーターで利用していました。 OpenWrt はその OpenVPN のサーバー/クライアント両方に対応可能なため、今回は以下の 2 つの要件を設定しました。

  • 外出先から自宅へのリモートログイン (サーバー)
  • 自宅から実家へのリモートログイン (クライアント)

TUN モードと TAP モード

OpenVPN を語る上でサーバー/クライアントの話と同様に大事なのは、TUN (トンネルモード) と TAP (ブリッジモード) です。

TUN で接続すると OpenVPN 用のセグメントに接続し、ルーティングによって LAN のセグメントと通信可能になります (L3)。 TAP で接続すると LAN のセグメントそのものに参加するのでルーティングもありません (同じセグメントなので)。ブロードキャストも受け取れます (L2)。

ブロードキャストも受け取れるブリッジモードであれば、LAN に直接接続していないと利用できないゲームや AV 系のソフトも利用可能になります。 ただ、残念ながら Android/iPhoneOS 側の仕様により利用できません。実際、エラーが出て接続できませんでした。

デフォルトゲートウェイOpenVPN へ向けるか否か

もう一つ OpenVPN で大事な点は、デフォルトゲートウェイOpenVPN 側に向けるかどうかという点で、 コンフィグ上に「redirect-gateway def1」オプションを含めるか否かです。

redirect-gateway def1 を有効にするとすべての通信が OpenVPN のトンネルを通ることになるため、 接続中は一般的なインターネットのパフォーマンスなどが低下する可能性があります。

最終的な要件

というわけで、最終的に以下の要件としました。TAP で統一したかったのですが見込みは薄そう。。。

  • Android を用いて外出先から自宅へのリモートログイン (サーバー/トンネルモード)
  • Windows を用いて外出先から自宅へのリモートログイン (サーバー/ブリッジモード)
  • 自宅から実家へのリモートログイン (クライアント/トンネルモード)
    ※ いずれも redirect-gateway def1 は無効です。

OpenWrt における OpenVPN の実装方法

OpenWrt では追加のモジュールを導入して設定をすることで、OpenVPN を構成できます。 OpenWrt では次の 2 通りの手法で OpenVPN を定義可能で、おすすめは後者です。情報が多い。

  • /etc/config/openvpn に全部定義して完結 (≒GUI で設定)
  • /etc/config/openvpn には実体のコンフィグファイルのパスを書いて、中身は外だしした .conf ファイルや .ovpn ファイルに定義

後者にするとパラメーター一つ一つを定義する形ではなくなり入力フィールドが一つになって、 ファイルの中身をその一つのフィールドに記載する形になります。以下の通りです。ファイルを GUI (Web) 上で開いているだけとも言えます。

ちなみに、前者のパラメーター単位入力は以下の感じです。

いちおうテンプレートが用意されているのでパラメーターにしても一からオプションを考えなくも良いは良いのですが・・・

OpenVPN の設定方法 (クライアント/サーバー共通)

OpenVPN、管理画面、管理画面日本語化、easy-rsa
  1. [システム]-[ソフトウェア] フィルターopenvpn-openssl と入力し、インストール を押します。
    ※ 一度 OS を再起動してしまうとパッケージリストの取り直しが必要なので、その場合は「リストを更新..」を実施してください。
  2. 依存関係の確認が行われるので インストール を押します。
  3. パッケージが読み込まれるので、閉じる を押します。
  4. 1-3 を繰り返します。パッケージ名は luci-app-openvpn です。
  5. 1-3 を繰り返します。パッケージ名は luci-i18n-openvpn-ja です。
  6. 1-3 を繰り返します。パッケージ名は openvpn-easy-rsa です。このモジュールはサーバーの .conf ファイルを生成するのに利用します。 逆に言うと、.conf がすでに出来上がった環境であればそのファイルをコピーすればよいので不要なモジュールということになります。
  7. ログアウトすると、画面上部に [VPN]-[OpenVPN] が出現します。なお、デフォルトで入っている 3 つの定義はサンプルなので、削除しても構いません。

OpenVPN クライアントの設定方法

方式概要

OpenVPN クライアントとして設定する際に必要なのは .ovpn ファイルで、このファイルは通常、OpenVPN サーバー側でサーバー設定と一緒に生成可能します。 そのため、サーバー側で作成した .ovpn ファイルを持ってきて OpenWrt に読み込ませれば設定可能です。

なお、x.auth ファイルは対象の OpenVPN サーバーにユーザー名とパスワードを用いて接続する際に必要となります。 (中身はユーザー名と対応するパスワードを書くだけというシンプルな構造)

設定環境

OpenWrt から接続する先は Synology RT2600ac となりまして、RT2600ac 側で既に .ovpn ファイルをエクスポートした状態から始まります。

コンフィグ (.ovpn) のアップロードと修正
  1. [VPN]-[OpenVPN] OVPN configuration file upload にて定義名を入力の上で .ovpn ファイルを選択し、アップロード を押します。
  2. [VPN]-[OpenVPN] 定義のアップロードが完了しました。
  3. [VPN]-[OpenVPN]-[定義名(編集)] 上段の入力ボックスで以下を確認します。
    バイス名 (tunx の x) は一意である必要性があるので、複数のコンフィグを生成する場合数字はカウントアップさせて重複させないようにしてください。 トンネルモードのサーバーも同じ tun を利用するのでこちらとも重複をしないように。

     dev tun5
     #redirect-gateway def1
     auth-user-pass /etc/openvpn/定義名.auth

    コメント
    dev tun5 tun の後の数字は覚えておく
    #redirect-gateway def1 「#」でコメントアウト
    auth-user-pass /etc/openvpn/定義名.auth auth-user-pass から記述を修正
  4. [VPN]-[OpenVPN]-[定義名(編集)] 下段の入力ボックスで以下を確認します。

    ユーザー名 #サーバー側でログイン可能なユーザー名を入力します
    パスワード #サーバー側でログイン可能なユーザーのパスワードを入力します
  5. 入力が完了したら、保存します。

  6. [VPN]-[OpenVPN] 定義名有効をチェックし、保存&適用を押します。この後、開始/停止stop となり続ければ成功です。 逆に一瞬だけなったり、一度もならずに start のままだと設定に失敗して接続できていません。 この場合は、[ステータス]-[システムログ] などを見て原因を除去してから再度実施してください。
インターフェースの登録
  1. [ネットワーク]-[インターフェース]-[インターフェース] インターフェースを新規作成を押します。
    ※ 画面は作成後ですので本来であればまだ tun5 は存在しない状態です。
  2. 名前:tun0 or tunx (前項で確認したデバイス名)プロトコル:アンマネージドバイス:tun0 or tunx (前項で確認したデバイス名) として、インターフェースを作成を押します。
  3. [ファイアウォール設定] ファイアウォールゾーンの作成または割り当てwan に変更し、保存 → 保存&適用を押します。
  4. この時点で接続できるようになっているはずですので、疎通確認を行ってください。

OpenVPN サーバーの設定方法

方式概要

OpenVPN サーバーとして設定する際に必要なのは .conf ファイルで、クライアント側で必要になる .ovpn ファイルもセットで生成します。

設定は CLI の方がおすすめです。

  • tls-crypt-v2 の設定が可能
  • サーバーとクライアントで対になるべき設定を間違えづらい
  • 接続用端末向けの .ovpn ファイルを一緒に作成できる

その上で、以下の公式 URL を参考にして独自に作成してみました。 ブリッジモードに対応したり、2 台目の接続端末向けの .ovpn ファイルを後から作成可能なようになっています。 openwrt.org

初期設定

最初の一回のみ行う作業で、初期化したり認証局を作ったり dh キーを生成したり。
SSH で OpenWrt に接続し、以下を入力します。基本的にはおまじないだと思ってください。

export EASYRSA_PKI="/etc/easy-rsa/pki"
export EASYRSA_REQ_CN="ovpnca"
export EASYRSA_CERT_EXPIRE="3650"
export EASYRSA_BATCH="1"
easyrsa init-pki
easyrsa gen-dh
easyrsa build-ca nopass

トンネルモード用サーバーコンフィグ (.conf) の作成

基本的には一回しか行いません。SSH で OpenWrt に接続し、以下を入力します。

VPN_SDEF="tunserver"
VPN_DEV="dev tun0"
VPN_PORT="51234"
VPN_PROTO="udp"
VPN_POOL="192.168.110.0 255.255.255.0"
VPN_LAN="10.0.0.0 255.255.255.0"
export EASYRSA_PKI="/etc/easy-rsa/pki"
export EASYRSA_REQ_CN="ovpnca"
export EASYRSA_CERT_EXPIRE="3650"
export EASYRSA_BATCH="1" 
easyrsa build-server-full ${VPN_SDEF} nopass openvpn --genkey tls-crypt-v2-server /etc/easy-rsa/pki/private/${VPN_SDEF}.pem
umask go= cat << EOF > /etc/openvpn/${VPN_SDEF}.conf user nobody group nogroup ${VPN_DEV} port ${VPN_PORT} proto ${VPN_PROTO} server ${VPN_POOL} topology subnet client-to-client remote-cert-tls client keepalive 10 60 persist-tun persist-key push "persist-tun" push "persist-key" push "route ${VPN_LAN}" <dh> $(cat /etc/easy-rsa/pki/dh.pem) </dh> <tls-crypt-v2> $(cat /etc/easy-rsa/pki/private/${VPN_SDEF}.pem) </tls-crypt-v2> <key> $(cat /etc/easy-rsa/pki/private/${VPN_SDEF}.key) </key> <cert> $(openssl x509 -in /etc/easy-rsa/pki/issued/${VPN_SDEF}.crt) </cert> <ca> $(openssl x509 -in /etc/easy-rsa/pki/ca.crt) </ca> EOF
cat << EOF >> /etc/config/openvpn config openvpn ${VPN_SDEF} option config '/etc/openvpn/${VPN_SDEF}.conf' option enabled '1'
EOF
/etc/init.d/openvpn restart

コメント
VPN_SDEF 定義の名前。わかりやすく
VPN_DEV バイス名。他の設定と重複不可。数字は覚えておく
VPN_PORT 着信ポート番号。数字は覚えておく
VPN_PROTO UDP で変更の必要なし
VPN_POOL 接続してきた OpenVPN クライアント用のセグメント サブネットマスク
VPN_LAN 既存 LAN のネットワークアドレス サブネットマスク

※ トンネルモードなので、OpenVPN クライアント向けに新しいセグメントを払い出し、既存の LAN へルーティングする形です。

トンネルモード用クライアントコンフィグ (.ovpn) の作成

クライアントの台数分行います。SSH で OpenWrt に接続し、以下を入力します。

VPN_SDEF="tunserver"
VPN_CDEF="tunclient1"
VPN_DEV="dev tun0"
VPN_SERV="1.2.3.4"
VPN_PORT="51234"
VPN_PROTO="udp"
export EASYRSA_PKI="/etc/easy-rsa/pki"
export EASYRSA_REQ_CN="ovpnca"
export EASYRSA_CERT_EXPIRE="3650"
export EASYRSA_BATCH="1" 
easyrsa build-client-full ${VPN_CDEF} nopass openvpn --tls-crypt-v2 /etc/easy-rsa/pki/private/${VPN_SDEF}.pem --genkey tls-crypt-v2-client /etc/easy-rsa/pki/private/${VPN_CDEF}.pem
umask go= cat << EOF > /etc/openvpn/${VPN_CDEF}.ovpn user nobody group nogroup ${VPN_DEV} nobind client remote ${VPN_SERV} ${VPN_PORT} ${VPN_PROTO} auth-nocache remote-cert-tls server <tls-crypt-v2> $(cat /etc/easy-rsa/pki/private/${VPN_CDEF}.pem) </tls-crypt-v2> <key> $(cat /etc/easy-rsa/pki/private/${VPN_CDEF}.key) </key> <cert> $(openssl x509 -in /etc/easy-rsa/pki/issued/${VPN_CDEF}.crt) </cert> <ca> $(openssl x509 -in /etc/easy-rsa/pki/ca.crt) </ca> EOF

コメント
VPN_SDEF サーバー側の定義と同一の必要がある
VPN_CDEF 定義の名前。わかりやすく
VPN_DEV サーバー側の定義と同一の必要がある
VPN_SERV 接続先の (グローバル) IP アドレス
VPN_PORT サーバー側の定義と同一の必要がある
VPN_PROTO サーバー側の定義と同一の必要がある

※ 複数台接続する場合には、VPN_CDEF を変更してください。

トンネルモード用インターフェースの登録
  1. [ネットワーク]-[インターフェース]-[インターフェース] インターフェースを新規作成を押します。
  2. 名前:tunx (前項で確認したデバイス名)プロトコル:アンマネージドバイス:tunx (前項で確認したデバイス名) として、インターフェースを作成を押します。
  3. [ファイアウォール設定] ファイアウォールゾーンの作成または割り当てlan に変更し、保存 → 保存&適用を押します。
トンネルモード通信の許可
  1. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール] 追加を押します。

  2. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[一般設定] 以下の設定を行います。

    設定項目 設定値
    名前 定義の名前。わかりやすく
    プロトコル サーバー側の定義と同一の必要がある
    送信元ゾーン wan
    宛先ゾーン バイス (入力)
    宛先ポート サーバー側の定義と同一の必要がある

  3. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[詳細設定] アドレスファミリの制限IPv4 のみに変更し、保存 → 保存&適用を押します。

  4. この時点で接続できるようになっているはずですので、疎通確認を行ってください。

ブリッジモード用サーバーコンフィグ (.conf) の作成

基本的には一回しか行いません。SSH で OpenWrt に接続し、以下を入力します。

VPN_SDEF="tapserver"
VPN_DEV="dev tap0"
VPN_PORT="52345"
VPN_PROTO="udp"
VPN_POOL="10.0.0.254 255.255.255.0 10.0.0.11 10.0.0.15"
export EASYRSA_PKI="/etc/easy-rsa/pki"
export EASYRSA_REQ_CN="ovpnca"
export EASYRSA_CERT_EXPIRE="3650"
export EASYRSA_BATCH="1" 
easyrsa build-server-full ${VPN_SDEF} nopass openvpn --genkey tls-crypt-v2-server /etc/easy-rsa/pki/private/${VPN_SDEF}.pem
umask go= cat << EOF > /etc/openvpn/${VPN_SDEF}.conf user nobody group nogroup ${VPN_DEV} port ${VPN_PORT} proto ${VPN_PROTO} server-bridge ${VPN_POOL} client-to-client remote-cert-tls client keepalive 10 60 persist-tun persist-key push "persist-tun" push "persist-key" <dh> $(cat /etc/easy-rsa/pki/dh.pem) </dh> <tls-crypt-v2> $(cat /etc/easy-rsa/pki/private/${VPN_SDEF}.pem) </tls-crypt-v2> <key> $(cat /etc/easy-rsa/pki/private/${VPN_SDEF}.key) </key> <cert> $(openssl x509 -in /etc/easy-rsa/pki/issued/${VPN_SDEF}.crt) </cert> <ca> $(openssl x509 -in /etc/easy-rsa/pki/ca.crt) </ca> EOF
cat << EOF >> /etc/config/openvpn config openvpn ${VPN_SDEF} option config '/etc/openvpn/${VPN_SDEF}.conf' option enabled '1'
EOF
/etc/init.d/openvpn restart

コメント
VPN_SDEF 定義の名前。わかりやすく
VPN_DEV バイス名。他の設定と重複不可。数字は覚えておく
VPN_PORT 着信ポート番号。数字は覚えておく
VPN_PROTO UDP で変更の必要なし
VPN_POOL ルーターアドレス サブネットマスク DHCP で配布する開始アドレス 終了アドレス

※ ブリッジモードなので、入力する情報は今使っている LAN の情報です。このアドレスは実際に DHCP 機能でクライアントに配布されるため、既存の LAN 内で利用していたり DHCP サーバーの配布範囲に入っていないことを確認してください。

ブリッジモード用クライアントコンフィグ (.ovpn) の作成

クライアントの台数分行います。SSH で OpenWrt に接続し、以下を入力します。

VPN_SDEF="tapserver"
VPN_CDEF="tapclient1"
VPN_DEV="dev tap0"
VPN_SERV="1.2.3.4"
VPN_PORT="52345"
VPN_PROTO="udp"
export EASYRSA_PKI="/etc/easy-rsa/pki"
export EASYRSA_REQ_CN="ovpnca"
export EASYRSA_CERT_EXPIRE="3650"
export EASYRSA_BATCH="1" 
easyrsa build-client-full ${VPN_CDEF} nopass openvpn --tls-crypt-v2 /etc/easy-rsa/pki/private/${VPN_SDEF}.pem --genkey tls-crypt-v2-client /etc/easy-rsa/pki/private/${VPN_CDEF}.pem
umask go= cat << EOF > /etc/openvpn/${VPN_CDEF}.ovpn user nobody group nogroup ${VPN_DEV} nobind client remote ${VPN_SERV} ${VPN_PORT} ${VPN_PROTO} auth-nocache remote-cert-tls server <tls-crypt-v2> $(cat /etc/easy-rsa/pki/private/${VPN_CDEF}.pem) </tls-crypt-v2> <key> $(cat /etc/easy-rsa/pki/private/${VPN_CDEF}.key) </key> <cert> $(openssl x509 -in /etc/easy-rsa/pki/issued/${VPN_CDEF}.crt) </cert> <ca> $(openssl x509 -in /etc/easy-rsa/pki/ca.crt) </ca> EOF

コメント
VPN_SDEF サーバー側の定義と同一の必要がある
VPN_CDEF 定義の名前。わかりやすく
VPN_DEV サーバー側の定義と同一の必要がある
VPN_SERV 接続先の (グローバル) IP アドレス
VPN_PORT サーバー側の定義と同一の必要がある
VPN_PROTO サーバー側の定義と同一の必要がある

※ 複数台接続する場合には、VPN_CDEF を変更してください。

ブリッジモード用インターフェースを既存のブリッジポートに追加

[ネットワーク]-[インターフェース]-[デバイス]-[br-lan (設定)]-[デバイスの一般オプション] ブリッジポートtapx (前項で確認したデバイス名) を追加し、保存 → 保存&適用を押します。

ブリッジモード通信の許可
  1. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール] 追加を押します。

  2. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[一般設定] 以下の設定を行います。

    設定項目 設定値
    名前 定義の名前。わかりやすく
    プロトコル サーバー側の定義と同一の必要がある
    送信元ゾーン wan
    宛先ゾーン バイス (入力)
    宛先ポート サーバー側の定義と同一の必要がある

  3. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[詳細設定] アドレスファミリの制限IPv4 のみに変更し、保存 → 保存&適用を押します。

  4. この時点で接続できるようになっているはずですので、疎通確認を行ってください。

おまけ

出来上がった .ovpn ファイルを持ち出す際の注意事項

pscp.exe を使ってファイルを持ち出す場合、裏で sftp サーバーを要求しているようなので、 OpenWrt 側に openssh-sftp-server モジュールが必要です。

設定のための参考サイト

設定に当たっては、以下の情報を参考にしました。

openwrt.org

OpenWrt の OpenVPN 設定を終えて

こうして OpenWrt を使って OpenVPN でリモートアクセス可能になりました。いよいよ IPsec VPN で Azure にプライベート接続することになり、次節に続いていきます。

cube309b.hatenablog.com


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。