【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

OpenVPNサーバを建ててスプリットトンネルさせないようにする備忘録とか(Ubuntu 22.04 LTS)

こんにちは
おしりからメモリリーク
システムソリューション部のかわです。

最近涼しいですね。四季というより二季みたいな今日このごろですが、いかがおすごしでしょうか。
今回はOpenVPNをUbuntuマシンにインストールした際にインターネット抜けできなくて詰まったので、
備忘録がてらに知見を共有したいと思います。

そもそもOpenVPNとは

*知ってる人は読み飛ばしてね

OpenVPNはOpenVPN Technologies Inc.が提供しているOSSのVPNソフトです。
Linuxマシン等にインストールすることでVPNサーバとして稼働させ、クライアントからのVPN接続が可能になります。
▼OpenVPN Japan公式
https://www.openvpn.jp/introduction/

インストール

■環境

# サーバ側
Ubuntu 24.04 LTS
OpenVPN 2.5.9

# クライアントOS
Windows 11 Pro

今回は、以下のページを参考に進めます。プロンプトで簡単に進められるのでめちゃ便利。
https://github.com/angristan/openvpn-install

まずは手順通り、curlでシェルスクリプトファイルを引っ張ってきます。
保存箇所は任意です。パーミッションを変更して実行できるようにします。

$ sudo curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 40923  100 40923    0     0   282k      0 --:--:-- --:--:-- --:--:--  281k

$ sudo chmod +x openvpn-install.sh

スクリプトを実行するとプロンプトが開始するので、ひとつずつ進んでいきます。
特段要件がない限りは基本デフォルトでいいと思います。

$ sudo ./openvpn-install.sh
Welcome to the OpenVPN installer!
The git repository is available at: https://github.com/angristan/openvpn-install

I need to ask you a few questions before starting the setup.
You can leave the default options and just press enter if you are ok with them.

いくつか情報を入力する箇所があるので、何を入れたらいいか不明な場合は下記コードブロック内のコメントアウト箇所を参照してください。

# 外部クライアントから繋ぐ際のWAN側(インターネット側に面している)IPアドレスを入力します。
I need to know the IPv4 address of the network interface you want OpenVPN listening to.
Unless your server is behind NAT, it should be your public IPv4 address.
IP address: 192.0.2.1

# IPv6を利用しない限りはn(デフォルト)を入力
Checking for IPv6 connectivity...

Your host does not appear to have IPv6 connectivity.

Do you want to enable IPv6 support (NAT)? [y/n]: n

# リッスンポートとしてUDP/1194がデフォルトで使用されるので、問題ない場合は1を選択
What port do you want OpenVPN to listen to?
   1) Default: 1194
   2) Custom
   3) Random [49152-65535]
Port choice [1-3]: 1

# UDP/TCPどちらを使用するかを聞かれるので、特段問題ない場合はデフォルトまま1(UDP)を選択
What protocol do you want OpenVPN to use?
UDP is faster. Unless it is not available, you shouldn't use TCP.
   1) UDP
   2) TCP
Protocol [1-2]: 1

# DNSリゾルバを選択します。筆者環境ではデフォルトで11でした。特に変更の必要がなければそのままでOK
What DNS resolvers do you want to use with the VPN?
   1) Current system resolvers (from /etc/resolv.conf)
   2) Self-hosted DNS Resolver (Unbound)
   3) Cloudflare (Anycast: worldwide)
   4) Quad9 (Anycast: worldwide)
   5) Quad9 uncensored (Anycast: worldwide)
   6) FDN (France)
   7) DNS.WATCH (Germany)
   8) OpenDNS (Anycast: worldwide)
   9) Google (Anycast: worldwide)
   10) Yandex Basic (Russia)
   11) AdGuard DNS (Anycast: worldwide)
   12) NextDNS (Anycast: worldwide)
   13) Custom
DNS [1-12]: 11

# 通信データを圧縮している環境ではVORACLE攻撃という脆弱性が存在するようです。この項目はNOが推奨されているためデフォルトでいきます。
# 参考:https://openvpn.net/security-advisory/the-voracle-attack-vulnerability/
Do you want to use compression? It is not recommended since the VORACLE attack makes use of it.
Enable compression? [y/n]: n

# 暗号化設定はデフォルトで ECDSA with prime256v1 になっていて十分強固なのでそのままでいきます。
Do you want to customize encryption settings?
Unless you know what you're doing, you should stick with the default parameters provided by the script.
Note that whatever you choose, all the choices presented in the script are safe. (Unlike OpenVPN's defaults)
See https://github.com/angristan/openvpn-install#security-and-encryption to learn more.

Customize encryption settings? [y/n]: n

# これで完了。Enter等押すとインストールと構成が開始されるので、お茶でも飲みながら待ちます。
Okay, that was all I needed. We are ready to setup your OpenVPN server now.
You will be able to generate a client at the end of the installation.
Press any key to continue...

インストールが完了すると、クライアントに配布する用のovpnファイル(プロファイル)生成に進みます。

# 接続用のユーザ名を指定します(今後複数ユーザを発行する場合は名前の重複に注意)。
Tell me a name for the client.
The name must consist of alphanumeric character. It may also include an underscore or a dash.
Client name: test

# クライアントプロファイルにパスフレーズを付与するかを聞かれます。デフォルトでいきます(2を選択した場合の流れは後述)。
Do you want to protect the configuration file with a password?
(e.g. encrypt the private key with a password)
   1) Add a passwordless client
   2) Use a password for the client
Select an option [1-2]: 1

The configuration file has been written to /home/hamchan/test.ovpn.
Download the .ovpn file and import it in your OpenVPN client.

/home/hamchan/test.ovpn にプロファイルが生成されました。

パスフレーズ付与のタイミングで2を選択すると、以下のような流れになります。
こちらを選択してパスフレーズを付与すると、毎接続でクライアントはパスフレーズを入力する必要があります。
なので万一プロファイルが漏洩しても、パスフレーズが分からなければ第三者に接続されることはありません。

Do you want to protect the configuration file with a password?
(e.g. encrypt the private key with a password)
   1) Add a passwordless client
   2) Use a password for the client
Select an option [1-2]: 2

# パスフレーズを設定します。確認用と2回聞かれます。
⚠️ You will be asked for the client password below ⚠️

* Using SSL: openssl OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)

* Using Easy-RSA configuration: /etc/openvpn/easy-rsa/vars

* The preferred location for 'vars' is within the PKI folder.
  To silence this message move your 'vars' file to your PKI
  or declare your 'vars' file with option: --vars=<FILE>
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----

Notice
------
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/pki/reqs/test2.req
key: /etc/openvpn/easy-rsa/pki/private/test2.key
Using configuration from /etc/openvpn/easy-rsa/pki/3e6d0991/temp.484dbf11
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'test2'
Certificate is to be certified until Sep 25 03:20:30 2034 GMT (3650 days)

Write out database with 1 new entries
Database updated

Notice
------
Certificate created at:
* /etc/openvpn/easy-rsa/pki/issued/test2-chan.crt

Notice
------
Inline file created:
* /etc/openvpn/easy-rsa/pki/inline/test2.inline
Client test2 added.

The configuration file has been written to /home/hamchan/test2.ovpn.
Download the .ovpn file and import it in your OpenVPN client.

クライアントからの接続

以下からクライアントソフトをダウンロード/インストールします。筆者環境はWindows 11です。
https://www.openvpn.jp/
また、先ほど作成したovpnのクライアントプロファイルをコピってきます(test.ovpn)

タスクトレイからOpenVPNのアイコン(PCのディスプレイみたいなの)を右クリックし、インポートからovpnファイルを選択します。

インポートが完了したら、プロファイル名から接続を行います。ステータスが緑(接続状態)になればOKです。

webページ開かねえ

ここまではスムーズにいけたんですが、インターネットに繋がらない問題が発生しました。

問題点としては
・webページ開かねえ
・名前解決(nslookup)できねえ
・ソースIPがOpenVPNサーバのWAN側IPになってる

という状況でした。たぶんデフォでスプリットトンネルになってる?
ゼロルートかつインターネット抜けできないとなると、かなり使い勝手の悪い状況でした。こりゃいかん。

スプリットトンネルを回避する

スプリットトンネルの状況を打破するしかない。
ということで調べると、意外とクライアントプロファイルに数行書き足せばいい感じでした。
以下はデフォルトの何もいじってない状態のプロファイル

client
proto udp
explicit-exit-notify
remote 192.0.2.1 1194
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name server_RsYFZmapV3EjCl7k name
auth SHA256
auth-nocache
cipher AES-128-GCM
tls-client
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
ignore-unknown-option block-outside-dns
setenv opt block-outside-dns # Prevent Windows 10 DNS leak
verb 3

このプロファイルに以下の2点を加えます。
※OpenVPN導入時にデフォルトで10.8.0.0/24が構成されるので、既存環境と重複がある場合は/etc/openvpn/server.conf側を書き換える必要あり。

# OpenVPNサーバへの経路情報
route 10.8.0.0 255.255.255.0
# リダイレクトゲートウェイ無視(VPN接続先に、インターネット宛のトラフィックをルーティングさせない)
pull-filter ignore "redirect-gateway"

ちなみにこちらのmethod1を使用しました。
https://community.openvpn.net/openvpn/wiki/IgnoreRedirectGateway

これで勝つる!
と思ってたんですが、インターネット抜けは既存ローカル環境の回線を経由、10.8.0.0/24へのみOpenVPNサーバ宛にはなったものの、
未だに名前解決ができずwebページが開かない事象は継続してしまっている状況でした。

色々試行錯誤しているうちにデフォルト設定の下記2点がどうやら影響していることが判明。
コメントアウトすることで解消しました。

;ignore-unknown-option block-outside-dns
;setenv opt block-outside-dns # Prevent Windows 10 DNS leak

これについてはWindows 10時代の名残りのようで、
https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/

----
--block-outside-dns
Block DNS servers on other network adapters to prevent DNS leaks. This option prevents any application from accessing TCP or UDP port 53 except one inside the tunnel. It uses Windows Filtering Platform (WFP) and works on Windows Vista or later.This option is considered unknown on non-Windows platforms and unsupported on Windows XP, resulting in fatal error. You may want to use --setenv opt or --ignore-unknown-option (not suitable for Windows XP) to ignore said error. Note that pushing unknown options from server does not trigger fatal errors.
----

過去のWindows OSで見られたDNSリークのバグを抑制する設定みたいでした。その影響でトンネルのDNS通信(TCP/UDP53)を阻害していた模様。
ただしWindowsOSのみで認識されるオプションなので、他OSでは気にしなくてよいみたいです。

最終的に以下のようなプロファイルになりました。

client
proto udp
explicit-exit-notify
remote 192.0.2.1 1194
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verify-x509-name server_RsYFZmapV3EjCl7k name
auth SHA256
auth-nocache
cipher AES-128-GCM
tls-client
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
;ignore-unknown-option block-outside-dns
;setenv opt block-outside-dns # Prevent Windows 10 DNS leak
route 10.8.0.0 255.255.255.0
pull-filter ignore "redirect-gateway"
verb 3

でめたしでめたし

おまけ

他にも、用途や環境によってはMTUサイズ等が影響してくるケースもあるみたいです。
その場合は以下マニュアルを参考にしてみてください。
https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/

また、サーバ側の/etc/openvpn/server.confにデフォルトではログオプションが入っていないので、以下のような設定を追記すると幸せになれます。

# ログレベルをひとつ上げとく
verb 4
# 接続ログをファイルに書き出し
log /var/log/openvpn/debug.log
この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
2
読み込み中...
2 票, 平均: 1.00 / 12
17
X facebook はてなブックマーク pocket
【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author

かわ けん

システムソリューション部所属
好奇心旺盛ポケ○ン