書類
OpenVPN構築つまづきポイントまとめ #OpenVPN

OpenVPN構築つまづきポイントまとめ #OpenVPN

2024-11-22 はじめ に OpenVPN構築の際に、つまずいたりハマってしまったポイントについて、メモとして書いていたものをまとめた記事です。あくまで自分用のメモをまとめたものなので、内容を保証することはできません。確実に正しい情報を知りたい場合は公式サイトを見ましょう。 ※この記事で "[ ]"(角括弧とい

Related articles

プロキシサーバーとVPNの違い | 安全なネットワーク接続に必要なのは? 【24年11月最新】中国で使えるVPNおすすめ最強決定戦!規制強化を回避し快適にネット接続ができる方法 ProtonVPNの評判はどう?料金やメリット・デメリットもくわしく解説 MillenVPNの評判|実際の使用感は?速度や性能を実機レビュー AzureVPN(P2S)でAzure証明書認証をする方法 VPNアプリをダウンロードしてインストールする方法

はじめ に

OpenVPN構築の際に、つまずいたりハマってしまったポイントについて、メモとして書いていたものをまとめた記事です。あくまで自分用のメモをまとめたものなので、内容を保証することはできません。確実に正しい情報を知りたい場合は公式サイトを見ましょう。

※この記事で “[ ]”(角括弧というらしいです)が出てきた時は、「自分の環境に合わせて入れてね」という意味で実際にこの記号を入れる必要は無いです。

どんな VPN を 構築 し た か

今回 、 VPN 構築 に あたる て の 要件 is 通り は 以下 の 通り 。

  1. 最高にセキュアなVPNであること(構築時点)
  2. フリーWi-Fi接続時に安全に通信できること
  3. ポート開放せずに、外出先から自宅内のネットワークにアクセスできること
  4. 接続元(クライアント)のIPアドレスを隠せること

これらの要件から、VPNサーバーはクラウド(Azure)上のVMに構築し、家の中に設置したVPNクライアントと常に接続させることで実現できると考えた。

環境

  • Ubuntu Server 22.04.4
  • OpenVPN 2.6.8

Azure 上 の VM に は 固定 IP を 割る 当てる て いる 。

ネットワーク図

OpenVPN構築つまづきポイントまとめ #OpenVPN

変更履歴

追記 し たり 、 変更 し なく て は いける ない とこ が あっ たら ここ に 書く 。

つまづきポイント

1. tar.gz からの構築

現象

要件1を満たすために、OpenVPNの最新版をインストールしたかった。(aptなどのパッケージ管理ツールからでは古いバージョンになってしまうため)

公式サイトから最新バージョンのtar.gzをダウンロードし、How Toに従って進めようとした。

しかし、./configure、make、make install を順に実行しても構築できなかった。

解決方法

エラー が 表示 さ れる の で それ を よく 見る 。

パッケージが足りない旨のエラーが表示されるので、それをもとに、aptで必要なパッケージを入れてから再度実行すれば構築できる。

私の環境の場合、足りなかったパッケージは以下の通り。

  • pkg -config
  • build-essential
  • libnl -genl -3 -dev
  • libcap-ng-dev
  • libssl-dev
  • liblz4-dev
  • liblzo2-dev
  • libpam-dev

また 、 sudo 権限 で . / configure など を 実行 する 必要 が ある こと に 注意 。

2. Azure上のVMから自宅内のPCにファイルを転送するには

現象

Azure 上 の VM から 、 自宅 内 に 設置 し た Ca に ファイル を 送る たい 。
しかし WAN 側 から 自宅 内 に 通信 する に は 、 ポート を 開放 し なけれ ば なら ない 。
めんどくさいし、ポート開放しないで自宅内に通信できるようにするのが今回の目的なので、一時的とはいえポート開放してしまえば本末転倒である。

解決方法

WinSCP を 使う 。
ドラッグ&ドロップでファイルを移動できる。

※Azure Filesを使う方法もあるがめんどくさいぞ

3. VPNサーバーの自動起動ができない

現象

systemdを使って、VM起動時に自動的にOpenVPNサーバーも立ち上がるようにしたい。
しかしエラーを吐いて起動しない。

解決 方法 1

まずはサーバーの秘密鍵にパスワードを設定していないか確認。
パスワード を 設定 し て いる 場合 は . Service の 設定 だけ で は 起動 でき ない 。
(パスワードが書かれたファイルを作成することで、パスワードが設定されていても起動できる方法があった気がするが果たして意味はあるのか・・・?)

解決方法2

秘密鍵にパスワードを設定していなければ、シェルスクリプトと .serviceを組み合わせた方法でやってみる。

まず は 好き な ディレクトリ に 任意 の 名前 の シェル スクリプト を 作成 。

[任意の名前].sh

# ! / bin / bash 
 openvpn / home / [ ユーザー 名 ] / openvpn -2 . 6 . 8 / Server . conf     # openvpn [ Server . conf まで の パス ] の 形 で 書く 

#!/bin/bashを 書く の を 忘れる ない こと

また 、 chmod 700 し て 実行 権限 を 付与 する こと 。

次に、/etc/systemd/system/に[任意の名前].serviceファイルを作成する。
中身 は 以下

[任意の名前].service

[Unit]
Description=[任意の名前]
After=network.target

[Service]
ExecStart=[作成した.shまでのパス]
Type=simple
Restart=no

[Install]
WantedBy=multi-user.target

※もちろん[Unit]、[Service]、[Install]には “[ ]” が必要です。

作成 後 、sudo systemctl enable [上で作成した任意の名前].serviceして 、 有効 化 する 。

その後再起動し、sudo systemctl status [任意の名前].serviceで、正常に実行されたか確認。
active (running) となっていればよし。

4 . サーバー を 構築 し た の に 接続 でき ない

現象

How Toどおりに構築したはずなのに、なぜかクライアントから接続できない。
クライアント上では「接続中」と出たまま、ログが繰り返される。
など など ・ ・ ・

ステップ 1

まず は ログ を しっかり 確認 し て みる 。
[ Server or client ] . conf の 中 に 、log [logの出力先とファイル名のパス]と、verb 4を書くことで、調査の手がかりを得やすくなる。

logの出力先はホームディレクトリがおすすめ。確認しやすい。
また、verbは”4″がおすすめ。数字を上げるともっと詳細なログが出力されるが、余計なもの(RwRwwwwRWrrrrwwwみたいなやつ) (パケットの読み書き(?)らしい)が出てくるので見づらい。

Serverの場合、正常に起動できれば、logの最後は Initialization Sequence Completed と表示される(はず・・・)。

それ 以外 の もの が 表示 さ れ て い たり 、 エラー が 出る て い たり する ば それ is 怪しい が 怪しい 。

ステップ 2

log を 確認 し 、 エラー が 出る て い た とき は 、 たいてい . conf の 記述 ミス だっ たり する 。

ありがちな記述ミスとして、

の 二 つ is ある が ある 。

前者 is 探し は 目 を 皿 の よう に し て 探す て ください 。

後者 is よい は この 記事 を 見る と よい 。

ここではハイフンが二つならんだ形のあとにオプション名が書いてあるが、.conf にオプションを書くときにはハイフンは要らない。

ブラウザのページ内検索機能を使って、自分が設定しているオプションの説明書きを見るとよい。たまに、「このオプションはクライアント側と合わせる必要がある」的なことが書いてある。圧縮の設定とかそうだった気がする。(違ってたらごめんなさい)

ステップ 3

logにエラーが出ていない人はネットワークの設定を疑いましょう。

ポイント

  • 通信 に 必要 な ポート is 空い は 空く て いる か ?
  • Serverから外に向けてpingは通るか?
  • (安全な環境の場合のみ) iptables や ufw のデフォルトポリシーをACCEPTにして試してみたか?
  • iptables で log を 取る 設定 に し て 、 drop さ れ た パケット を 見る て み た か ?
  • tapもしくはtunインターフェースは作成されているか?
  • ( iptables の 場合 ) filters テーブル の forward も 許可 する 設定 に なっ て いる か ?
  • 設定ファイルでフォワードは許可されているか?

特に最後の項目。
ufw を使っている人は、

/etc/default/ufw

-DEFAULT _ forward _ Policy="DROP"
+DEFAULT _ forward _ Policy=" accept "

/etc/ufw/sysctl.conf

-#net/ipv4/ip_forward=1
+net/ipv4/ip_forward=1

iptables を 使う て いる 人 は 、

/etc/sysctl.conf

-# NET . IPV 4 . IP _ forward
+net.ipv4.ip_forward

の設定を忘れずにすること。
これ を し ない と 、 ファイアウォール 上 は 許可 さ れ て いる の に 、 何故 か パケット が 捨てる られ てる と か いう 謎 現象 に 遭遇 し 、 時間 を 溶かす の で 要 注意 。

ステップ 4

これ ら ステップ を 経る て も 解決 し ない 場合 は 、 以下 を ループ し て やっ て み て ください 。

  1. (エラーが出ているときは、エラー文で検索してみる)
  2. 原因を考え切り分ける
  3. 解決策を考える
  4. 解決策を片っ端から試す
  5. 疲れる たら ベッド に 寝っ転がる て 、 頭 の 中 を 空っぽ に する

おすすめです。

5 . openvpn for Android から 接続 でき ない

現象

Android 端末 に openvpn for Android を 入れる 、 作成 し た . ovpn ファイル や 鍵 を スマホ に 転送 し 、 アプリ 上 で インポート も し た の に 接続 する こと が でき ない 。
「接続中」となっていたり、「Connecting」となっていて永遠に接続できない。

解決方法

他の端末(Windowsなど)からVPNサーバーに接続できるなら、恐らく原因は OpenVPN for Android 側にある。
私 の 場合 は 、 プロファイル 内 の 設定 の 、 以下 の 設定 is 原因 が 原因 だっ た 。

  • BASIC の中にある「LZO Compression」の無効化(サーバー側と設定を合わせる)
  • IP AND DNS の中にある「Pull Setting」の有効化(手動でIPアドレスやDNSを設定するのではなく、サーバーからそれらの設定を取得する設定)
  • AUTHENTICATION/ENCRYPTION の中にある「Encryption ciphers」の設定(サーバー側と設定を合わせる)
  • authentication / ENCRYPTION の 中 に ある 「 tls Security PROFILE 」 の 設定 ( 内容 を 確認 し て サーバー と 合わせる )

やはりサーバー側との設定の違いで接続できないことが多かった。

※余談だが、圧縮設定は行わない方が良いとの文を見かけた。
暗号と圧縮は、組み合わせてしまうと、ときに暗号を破る手掛かりになってしまうことがあるらしい。
しっかり暗号化することに重点を置くのか、パフォーマンスに重点を置くかによって、圧縮の設定をするか否か決めると良いだろう。

引用元:Openvpn24ManPage の –compress の一部

原文

Compression and encryption is a tricky combination. If an attacker knows or is able to control (parts of) the plaintext of packets that contain secrets, the attacker might be able to extract the secret if compression is enabled. See e.g. the CRIME and BREACH attacks on TLS which also leverage compression to break encryption. If you are NOT entirely sure that the above does NOT apply to your traffic, you are advised to NOT enable compression .

訳文(DeepL)

圧縮と暗号化は厄介な組み合わせである。攻撃者が秘密を含むパケットの平文(の一部)を知っているか、制御できる場合、圧縮が有効になっていると、攻撃者は秘密を引き出すことができるかもしれない。TLSに対するCRIME攻撃やBREACH攻撃も、圧縮を利用して暗号化を破っている。自分のトラフィックに上記が適用されないことが完全に確実でない場合は、圧縮を有効にしないことを推奨する。

6. VPNを自動的に再接続させるには?

現象

私の環境は、AzureのVMに作成したVPNサーバーと、自宅に設置したVPNクライアントとを常に接続することで、VPNに参加した端末が自宅にアクセスできるようにしている。
しかし、常にVMを起動しておくのはお金がかかる。
また、常時起動ではセキュリティが少し心配。(常に起動するということは、常に攻撃に曝されることになるということ)

と いう こと で 、 VM を 停止 さ せ た のち 再び 起動 し た とき で も 、 サーバー と 自宅 間 で 、 自動 的 に VPN が 張る れる よう に し たい の だ が 、 どう する ば よい の だろう か 。

解決方法

再接続に関するオプションを設定すればよい。

connect-retry n [max]がそのオプションである。
Openvpn24ManPage –connect-retry

n は接続を再試行するときの間隔(秒)
max is 設定 は 、 N 秒 間隔 の 再 試行 を 4 ~ 5 回 し た のち 、 最終 的 に 再 接続 の 間隔 を 何 秒 空ける か の 設定 。 4 ~ 5 回 の 再 試行 後 is 増え は 、 間隔 is 増え が 倍 に 増える て いく 。

例を示す。

上記 の 場合 は 、 再 試行 の 間隔 is なる は ずっと 1 秒 と なる 。

上記の場合では、言葉での説明がめんどいので以下に示す。

接続試行→5秒待つ→試行→5秒→試行→5秒→試行→5秒→試行→5秒→試行→10秒→試行→20秒→試行→30秒→試行→30秒→試行→30秒→・・・

といった形になる。

よっ て 、 この オプション を 自宅 の クライアント に 設定 し 、 好き な 間隔 を 指定 し て あげる ば 、 VM を 停止 さ せ て 再度 起動 し た とき で も 、 勝手に 接続 し て くれる 。

接続の試行の回数を設定できるオプションもあったので(確かデフォルトでは無限)、それと併用することをおすすめする。

ただし 、 この 方式 で は 1 つ だけ 問題 is ある が ある 。

ログが肥大化することだ。

永遠に接続を試行するので、接続に失敗したときにログが出力されてしまい、ちりつもでログが大きくなってしまう。
その ため 、 クライアント を 常時 起動 する 人 は ログ を 残す ない 設定 に する か 、 あるいは クライアント 起動 時 に 、 新しい ログ を 作る なおす 方式 の ログ の 出力 オプション に し て 、 定期 的 に 再 起動 さ せる と よい 。

ちなみに参考までに、私が(多分)1か月放置したときのログのサイズは、8メガバイト程度だった。

7. VPNサーバーを起動するとコマンドが打てなくなる!

現象

openvpn [server.confのパス] をすると、CLIが何も操作を受け付けなくなる!
Ctrl+C しちゃうと、コマンドは打てるようになるけどVPNサーバーも閉じちゃう!
クライアントでも同じ症状!!

解決方法

仕様です(多分)

SSHで繋いでいるなら、新しいウィンドウを開いて、そっちから接続しなおしましょう。

8. iptablesの設定をした後から起動が遅くなった

現象

iptablesでデフォルトポリシーを DROP にしてから、起動に時間がかかるようになった。
具体的には2分くらい。
SSH is 繋げ も 繋げる られ ない 。
時間が経てば普通に使える
なおAzureの場合のみ。

解決方法

あと で 別 の 記事 に まとめる て みる と 思う 。
簡単 に 言う と 、 169 . 254 . 169 . 254 と の 通信 を drop し ちゃっ て た ため 。

9. sudoを付けてコマンドを実行するとめちゃ遅い

現象

iptablesの設定をしてから、sudoを付けてコマンドを実行すると、正しく実行はされるものの応答が遅い。
なおAzureの場合のみ。

解決方法

あと で 別 の 記事 に まとめる て みる と 思う 。
これも簡単に言うと、168.63.129.16との通信をDROPしちゃってたため。

8. 自宅内にアクセスできるようにするには?

現象

外出先から自宅内のパソコンに安全にアクセスしたい!
でもルーターのポートは開けたくない!!

解決方法

時間 が あれ ば 、 後 で 別 の 記事 と し て 書く て みる と 思う 。
までもHow Toにしたがって設定をすればいいだけ。
1つつまづきそうなのが、クライアントのルーティングテーブルに、自宅側へ通信するためのルートを設定しなければいけないこと。

最後に

これ から openvpn で VPN を 構築 しよう と し て いる 人 や 、 現在 進行 形 で 詰む で て 困る てる 人 の 助け に なる ば 嬉しい です 。

以上。
間違ってるところなどありましたら教えていただけると幸いです。