「Linux コンテナ/VPN の使用」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) 細 (Kusanaginoturugi がページ「Linux Containers/VPN の使用」を「Linux コンテナ/VPN の使用」に移動しました: 親ページの変更に追従) |
Kusanaginoturugi (トーク | 投稿記録) (リンクを修正) |
||
10行目: | 10行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
− | この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として [[Linux |
+ | この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として [[Linux コンテナ]] を使って OpenVPN をクライアントモードで動作させるように設定する方法を説明します。[[VirtualBox]] や [[QEMU]] などの完全な仮想化を使うよりもリソースのオーバーヘッドを最小限にして低性能のデバイスでも動かすことができるというメリットがあります。 |
== コンテナの設定 == |
== コンテナの設定 == |
2024年7月10日 (水) 19:02時点における版
この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として Linux コンテナ を使って OpenVPN をクライアントモードで動作させるように設定する方法を説明します。VirtualBox や QEMU などの完全な仮想化を使うよりもリソースのオーバーヘッドを最小限にして低性能のデバイスでも動かすことができるというメリットがあります。
目次
コンテナの設定
Linux Containers の基本的な設定と理解が必要になります。この記事では読者がベースとなる LXC のセットアップを既に作っていて操作できる状態になっていることが前提です。初心者は Linux Containers の記事を読んで下さい。
サーバーモードの OpenVPN
このサブセクションでは、コンテナ内で OpenVPN を提供するために必要な追加のセットアップについて詳しく説明します。提供された OpenVPN プロファイルを使用したいユーザーは、このサブセクションを読む必要はありません。
ホストのセットアップ
- コンテナを実行できるようにするには、ホスト OS にブリッジイーサネットセットアップが必要です。これについては、Linux Containers#ホストネットワーク設定 を参照してください。
- パケット転送を有効にする必要があります。これについては、インターネット共有#パケット転送の有効化 を参照してください。
- 厳密には必須ではありませんが、ファイアウォールを使用することを強くお勧めします。
クライアントモードでの OpenVPN
OpenVPN を使用するには、コンテナの設定を次のように変更する必要があります:
/var/lib/lxc/playtime/config
... ## for OpenVPN lxc.mount.entry = /dev/net dev/net none bind,create=dir lxc.cgroup2.devices.allow = c 10:200 rwm
openvpn をインストールします。コンテナを使用してサードパーティ VPN プロバイダに接続する場合は、設定ファイル foo.conf
を /etc/openvpn/client/foo.conf
に配置するだけで使用できます。コンテナ内の OpenVPN 機能を確認するには、openvpn-client@foo.service
経由で OpenVPN を 起動 し、条件が満たされたら 有効化 します。
他の使用例とセットアップについては、OpenVPN を参照してください。
WireGuard
wireguard-tools をインストールします。ユーザーは、サードパーティの VPN サービスによって提供される WireGuard 設定を使用するか、この役割を果たすように WireGuard をセットアップすることになります。コンテナを使用して VPN プロバイダに接続する場合は、設定ファイル foo.conf
を /etc/wireguard/
に配置するだけで使用できます。
コンテナ内の WireGuard 機能を確認するには、wg-quick@foo.service
経由で WireGuard を 起動 し、条件が満たされたら有効化 します。
他の使用例については、WireGuard を参照してください。
コンテナ内のファイアウォール設定
コンテナ内で適切に構成された ファイアウォール を実行することを 強く お勧めします。コンテナ内でのファイアウォールの役割は 2 つあります。
- VPN への接続が失敗した場合にプライバシーを維持するために、機能的な "キルスイッチ" を提供します。
- 不快なものを排除。
このガイドでは、設定が簡単な ufw を使用していますが、他の例も使用できます。
機能的な "キルスイッチ" の戦略は、単純に拒否ポリシーを設定し、VPN デバイス上でのみ特定のサービスとトラフィックを許可することです。こうすることで、デバイスの接続が中断された場合でも、ローカルフォールバックは発生しません。
/etc/default/ufw
を編集し、DEFAULT_OUTPUT_POLICY を ACCEPT から DROP に変更します。
/etc/default/ufw
DEFAULT_OUTPUT_POLICY="DROP"
拒否ポリシーを設定します:
ufw default deny outgoing ufw default deny incoming
必要に応じて、/etc/ufw/applications.d/custom
などのファイルに定義されている事前定義ルールまたはカスタム ルールを追加します:
ufw allow ssh ufw allow from my-custom-app1 ufw allow from my-custom-app2
オプションで、内部 LAN IP 範囲または単一の IP アドレスからのアクセスをさらに制限します:
ufw allow from 192.168.1.0/24
WireGuard のユーザーは、それぞれの設定ファイルと同じ名前のインターフェースを作成します (例: /etc/wireguard/foo.conf
) 一方、OpenVPN ユーザーはおそらく tun0
を使用します。以下の行で、foo を WireGuard 設定の名前 (.conf サフィックスを省略) に置き換えるか、OpenVPN を使用している場合は、foo を tun0 または使用されているデバイスに置き換えます。
ufw allow out on foo from any to any
最後に、予想されるポートで VPN プロバイダーの IP アドレスへのアクセスを許可し、予想されるプロトコルを定義します。以下の行には、そのように定義されているとみなされる 3 つの変数があります:
- 'xxx' は、WireGuard ピア/OpenVPN サーバーの IP アドレスを表します。これは、VPN プロバイダーによって提供されるそれぞれの設定ファイルで定義されます。
- 'yyy' は通信が行われるポートを表します。繰り返しますが、これは設定ファイルに含まれます。
- 'zzz' は使用するプロトコルを表し、udp または tcp のいずれかを選択します。WireGuard は udp のみをサポートしますが、OpenVPN はどちらもサポートすることに注意してください。
ufw allow out to xxx port yyy proto zzz
ufw をufw.service
を 起動/有効化 します。
プロファイルで VPN のドメイン名を使用するためのハッキングな回避策
VPN プロファイルでドメイン名を使用したい場合は、ホスト上のシェルスクリプトで数値 IP に事前解決し、その IP アドレスをコンテナ内のファイルに書き込まれる変数に格納することでコンテナに渡すことができます。そのファイルは、変更された VPN systemd サービスによって読み取ることができます。機能しますが、少しハック的です。
ユースケースに対応するコンテナ名とサーバー名に一致するように 2 つの変数を編集します:
ホスト上で
bind (dig に必要) をインストールし、次のスクリプトを作成します:
/path/to/container-start.sh
#!/bin/bash # this script should be called as root container=foo server=www.myvpnserver.org if ! systemctl is-active lxc@"$container" &>/dev/null; then ToUse=$(dig +short "$server") [[ -d /var/lib/lxc/$container/rootfs/etc/conf.d ]] || mkdir -p /var/lib/lxc/$container/rootfs/etc/conf.d echo "SERVER=$ToUse" > /var/lib/lxc/$container/rootfs/etc/conf.d/server.hack.txt systemctl start lxc@"$container" fi
以降、そのスクリプトを呼び出してコンテナを起動します。dig を使用してドメイン名から IP アドレスを取得し、コンテナーを起動します。
コンテナの中から
VPN を開始する systemd サービスを変更し、スクリプトによって /var/lib/lxc/$container/rootfs/etc/conf.d/server.hack.txt
で定義された IP アドレスで変更できるスケルトンプロファイルを作成します。
スケルトン設定ファイルを作成するには、ライブファイルの名前を別の名前に変更するだけです。
たとえば、WireGuard を使用すると、次のようになります:
mv /etc/wireguard/foo.conf /etc/wireguard/foo.skel
次に、/etc/wireguard/foo.skel
を編集して、Endpoint = www.myvpnserver.org を @@@ に置き換えます。次に例を示します。
Endpoint = @@@:51820
または、OpenVPN を使用している場合:
mv /etc/openvpn/client/foo.conf /etc/openvpn/client/foo.skel
/etc/openvpn/client/foo.skel
を編集して、リモート www.myvpnserver.org を @@@ に置き換えます。次に例を示します。
remote @@@
最後に、ドロップインファイル を作成して、IP を読み取り、実際のプロファイルと置き換えます。
WireGuard を使用した例:
/etc/systemd/system/wg-quick@foo.service.d/override.conf
[Service] EnvironmentFile=-/etc/conf.d/server.hack.txt ExecStartPre=/bin/bash -ac "sed s/@@@/$SERVER/ </etc/wireguard/foo.skel >/etc/wireguard/foo.conf"
OpenVPN を使用した例:
/etc/systemd/system/openvpn-client@foo.service.d/override.conf
[Service] EnvironmentFile=-/etc/conf.d/server.hack.txt ExecStartPre=/bin/bash -ac "sed s/@@@/$SERVER/ </etc/openvpn/client/foo.skel >/etc/openvpn/client/foo.conf"
サービスのテスト
コンテナの中から、(ssh や lxc-attach -n playtime
で接続して) ホストマシンの X サーバーにブラウザをエクスポートしてセットアップをテストします:
$ DISPLAY=:0 firefox
"Mozilla Firefox (playtime)" というタイトルでホストの X サーバーに firefox のウィンドウが表示されるはずです。複数のウェブサイトを使って IP アドレスと DND エントリの状態を確認できます。そのようなサイトの一つとして ipleak dot net があります。
この段階で、/etc/openvpn/client/myprofile.conf
の IP と DNS エントリが表示されます。