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