「Linux コンテナ/VPN の使用」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(WireGuardを翻訳して追加)
 
(2人の利用者による、間の10版が非表示)
1行目: 1行目:
[[Category:Virtual Private Network]]
+
[[Category:仮想プライベートネットワーク]]
 
[[Category:仮想化]]
 
[[Category:仮想化]]
[[en:OpenVPN (client) in Linux containers]]
+
[[en:Linux Containers/Using VPNs]]
 
[[pt:Linux Containers]]
 
[[pt:Linux Containers]]
 
{{Related articles start}}
 
{{Related articles start}}
{{Related2|Airvpn|AirVPN}}
 
{{Related|Docker}}
 
{{Related|Linux Containers}}
 
 
{{Related|OpenVPN}}
 
{{Related|OpenVPN}}
{{Related|Linux Containers で OpenVPN サーバー}}
+
{{Related|PeerGuardian_Linux}}
{{Related|PeerGuardian Linux}}
 
{{Related|Systemd-nspawn}}
 
 
{{Related|ufw}}
 
{{Related|ufw}}
  +
{{Related|WireGuard}}
 
{{Related articles end}}
 
{{Related articles end}}
   
この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として [[Linux Containers]] を使って OpenVPN をクライアントモードで動作させるように設定する方法を説明します。[[VirtualBox]] や [[QEMU]] などの完全な仮想化を使うよりもリソースのオーバーヘッドを最小限にして低性能のデバイスでも動かすことができるというメリットがあります。
+
この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として [[Linux コンテナ]] を使って OpenVPN をクライアントモードで動作させるように設定する方法を説明します。[[VirtualBox]] や [[QEMU]] などの完全な仮想化を使うよりもリソースのオーバーヘッドを最小限にして低性能のデバイスでも動かすことができるというメリットがあります。
   
 
== コンテナの設定 ==
 
== コンテナの設定 ==
   
[[Linux Containers]] の基本的な設定と理解が必要になります。この記事では読者がベースとなる LXC のセットアップを既に作っていて操作できる状態になっていることが前提です。初心者は [[Linux Containers]] の記事を読んで下さい。
+
[[Linux コンテナ]]の基本的な設定と理解が必要になります。この記事では読者がベースとなる LXC のセットアップを既に作っていて操作できる状態になっていることが前提です。初心者は [[Linux コンテナ]]の記事を読んで下さい。
   
 
== サーバーモードの OpenVPN ==
 
== サーバーモードの OpenVPN ==
26行目: 22行目:
 
=== ホストのセットアップ ===
 
=== ホストのセットアップ ===
   
# コンテナを実行できるようにするには、ホスト OS にブリッジイーサネットセットアップが必要です。これについては、[[Linux Containers#ホストネットワーク設定]] を参照してください。
+
# コンテナを実行できるようにするには、ホスト OS にブリッジイーサネットセットアップが必要です。これについては、[[Linux コンテナ#ホストネットワーク設定]] を参照してください。
 
# パケット転送を有効にする必要があります。これについては、[[インターネット共有#パケット転送の有効化]] を参照してください。
 
# パケット転送を有効にする必要があります。これについては、[[インターネット共有#パケット転送の有効化]] を参照してください。
 
# 厳密には必須ではありませんが、ファイアウォールを使用することを強くお勧めします。
 
# 厳密には必須ではありませんが、ファイアウォールを使用することを強くお勧めします。
56行目: 52行目:
 
他の使用例については、[[WireGuard]] を参照してください。
 
他の使用例については、[[WireGuard]] を参照してください。
   
=== LXC の設定 ===
+
== コンテナ内ファイアウォール設定 ==
   
  +
コンテナ内で適切に構成された [[ファイアウォール]] を実行することを ''強く'' お勧めします。コンテナ内でのファイアウォールの役割は 2 つあります。
OpenVPN とインターネットプログラムの両方を動かして VPN を通して LXC の中からホストシステムと対話できるようにするため、コンテナの設定を変更して複数のセクションを記述する必要があります。
 
  +
# VPN への接続が失敗した場合にプライバシーを維持するために、機能的な "キルスイッチ" を提供します。
  +
# 不快なものを排除。
   
  +
このガイドでは、設定が簡単な {{pkg|ufw}} を使用していますが、他の例も使用できます。
例えば、lxc の名前が "playtime" なら以下が完全な設定になります:
 
  +
{{Tip|ufw の設定ファイルを完全にリセットするには、reset 引数を指定して呼び出します: {{ic|ufw restart}}}}
{{hc|/var/lib/lxc/playtime/config|<nowiki>
 
# Template used to create this container: /usr/share/lxc/templates/lxc-archlinux
 
# Parameters passed to the template:
 
# For additional config options, please look at lxc.container.conf(5)
 
   
  +
機能的な "キルスイッチ" の戦略は、単純に拒否ポリシーを設定し、VPN デバイス上でのみ特定のサービスとトラフィックを許可することです。こうすることで、デバイスの接続が中断された場合でも、ローカルフォールバックは発生しません。
lxc.rootfs = /var/lib/lxc/playtime/rootfs
 
lxc.utsname = playtime
 
lxc.arch = x86_64
 
lxc.include = /usr/share/lxc/config/archlinux.common.conf
 
   
  +
{{Note|以下に示す方法の制限は、VPN プロファイルで www.myvpn.com などのドメイン名を使用してはならず、対応する IP アドレスを使用する必要があることです。前述したように、VPN が接続されていない場合、コンテナーの DNS 解決は設計により無効になります。したがって、接続するには数値 IP を提供する必要があります}}
## network
 
lxc.network.type = veth
 
lxc.network.link = br0
 
lxc.network.flags = up
 
lxc.network.ipv4 = 192.168.0.3/24
 
lxc.network.ipv4.gateway = 192.168.0.1
 
lxc.network.name = eth0
 
   
  +
{{ic|/etc/default/ufw}} を編集し、DEFAULT_OUTPUT_POLICY を ''ACCEPT'' から ''DROP'' に変更します。
## systemd within the lxc
 
  +
{{hc|/etc/default/ufw|2=
lxc.autodev = 1
 
  +
DEFAULT_OUTPUT_POLICY="DROP"
lxc.hook.autodev = /var/lib/lxc/playtime/autodev
 
  +
}}
lxc.pts = 1024
 
lxc.kmsg = 0
 
   
  +
{{Note|{{ic|ufw}} を呼び出す次のコマンドは、root ユーザーとして実行する必要があります。標準の Wiki 表記に従ってこれらのコマンドの前に付ける "#" 記号は、ターミナルへのクリーンなコピー/ペーストを可能にするために省略されています。}}
## mounts
 
lxc.mount.entry = /mnt/data/inbox mnt/data none bind 0 0
 
lxc.mount.entry = /var/cache/pacman/pkg var/cache/pacman/pkg none bind 0 0
 
   
  +
拒否ポリシーを設定します:
## for xorg
 
  +
ufw default deny outgoing
## fix overmounting see: https://github.com/lxc/lxc/issues/434
 
  +
ufw default deny incoming
lxc.mount.entry = tmpfs tmp tmpfs defaults
 
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
 
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
 
lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir
 
lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file
 
   
  +
必要に応じて、{{ic|/etc/ufw/applications.d/custom}} などのファイルに定義されている事前定義ルールまたはカスタム ルールを追加します:
## for openvpn
 
  +
ufw allow ssh
lxc.cgroup.devices.allow = c 10:200 rwm
 
  +
ufw allow from my-custom-app1
</nowiki>}}
 
  +
ufw allow from my-custom-app2
  +
  +
オプションで、内部 LAN IP 範囲または単一の IP アドレスからのアクセスをさらに制限します:
  +
ufw allow from 192.168.1.0/24
  +
  +
WireGuard のユーザーは、それぞれの設定ファイルと同じ名前のインターフェースを作成します (例: {{ic|/etc/wireguard/foo.conf}}) 一方、OpenVPN ユーザーはおそらく {{ic|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
  +
  +
{{Note|複数のサーバーの使用が予想される場合は、VPN プロバイダーによって定義された IP アドレス (xxx) ごとにこれを繰り返します。}}
  +
  +
ufw を{{ic|ufw.service}} を [[起動]]/[[有効化]] します。
  +
  +
=== プロファイルで VPN のドメイン名を使用するためのハッキングな回避策 ===
  +
  +
VPN プロファイルでドメイン名を使用したい場合は、ホスト上のシェルスクリプトで数値 IP に事前解決し、その IP アドレスをコンテナ内のファイルに書き込まれる変数に格納することでコンテナに渡すことができます。そのファイルは、変更された VPN systemd サービスによって読み取ることができます。機能しますが、少しハック的です。
  +
  +
ユースケースに対応するコンテナ名とサーバー名に一致するように 2 つの変数を編集します:
   
  +
==== ホスト上で ====
{{Note|この例では ''autodev'' フックを利用して {{ic|/var/lib/lxc/playtime/autodev}} スクリプトを呼び出さなくてはなりません。ユーザーはスクリプトを作成して実行可能属性を付与する必要があります。スクリプトは下に記載しています。[[Linux Containers]] の記事も参照してください。}}
 
   
  +
{{pkg|bind}} (dig に必要) をインストールし、次のスクリプトを作成します:
{{hc|/var/lib/lxc/playtime/autodev|<nowiki>
 
  +
{{hc|/path/to/container-start.sh|<nowiki>
 
#!/bin/bash
 
#!/bin/bash
  +
# this script should be called as root
cd ${LXC_ROOTFS_MOUNT}/dev
 
  +
container=foo
mkdir net
 
  +
server=www.myvpnserver.org
mknod net/tun c 10 200
 
  +
chmod 0666 net/tun
 
  +
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
 
</nowiki>}}
 
</nowiki>}}
   
  +
以降、そのスクリプトを呼び出してコンテナを起動します。dig を使用してドメイン名から IP アドレスを取得し、コンテナーを起動します。
=== コンテナの中に必要なパッケージ ===
 
   
  +
==== コンテナの中から ====
ベースシステムに加えて、[[公式リポジトリ]]から {{Pkg|openvpn}} をインストールする必要があります。[[ファイアウォール]]を適切に設定してコンテナの中で使用することが''強く''推奨されます。コンテナの中にファイアウォールを作る理由は2つあります:
 
# "キルスイッチ"を作って VPN への接続が失敗したときにプライバシーを守る。
 
# 危険なものを除外する。
 
   
  +
VPN を開始する systemd サービスを変更し、スクリプトによって {{ic|/var/lib/lxc/$container/rootfs/etc/conf.d/server.hack.txt}} で定義された IP アドレスで変更できるスケルトンプロファイルを作成します。
このガイドでは簡単に設定できる {{pkg|ufw}} を使いますが、他の方法でもかまいません。
 
   
  +
スケルトン設定ファイルを作成するには、ライブファイルの名前を別の名前に変更するだけです。
=== パッケージの設定 ===
 
==== OpenVPN ====
 
OpenVPN の設定についてはこの記事では扱いません。適切に OpenVPN を設定するために [[OpenVPN]] の記事を読むことを推奨します。多くのプライベート VPN プロバイダはそれぞれのサービス用に正しく設定された openvpn.opvn プロファイルを直接ダウンロードできるリンクを提供しています。このガイドの趣旨上、{{ic|/etc/openvpn/client/myprofile.conf}} がその設定を参照します。
 
   
  +
たとえば、WireGuard を使用すると、次のようになります:
コンテナの中で openvpn が機能することを確認してください。{{ic|openvpn@myprofile.service}} で openvpn を[[起動]]して、問題ないようでしたら、ブート時に起動するように[[有効化]]してください。
 
   
  +
mv /etc/wireguard/foo.conf /etc/wireguard/foo.skel
===== DNS の漏洩の防止 =====
 
[[OpenVPN#DNS]] の指示に従って {{ic|/etc/resolv.conf}} を管理するように openvpn を設定することを強く推奨します。設定していない場合、ホストの DNS サーバーがこのファイルで指定されている場合に DNS が漏洩する可能性があります。
 
   
  +
次に、{{ic|/etc/wireguard/foo.skel}} を編集して、'''Endpoint = www.myvpnserver.org''' を '''@@@''' に置き換えます。次に例を示します。
==== ufw ====
 
[[ufw]] の設定は [[OpenVPN#ファイアウォールの設定]] で説明されています。記述通りに設定したら、使用するプロトコル (ssh や torrent など) と VPN プロバイダの IP アドレスまたは IP アドレスの範囲を追加で定義します。どちらも、プライベートプロバイダから取得できます。
 
   
  +
Endpoint = @@@:51820
{{Note|以下のコマンドは root ユーザーで実行する必要があります。ArchWiki では root ユーザーで実行するコマンドには "#" 記号を前に付けることになっていますが、ターミナルにコピーアンドペーストしやすいように以下では省いています。}}
 
   
  +
または、OpenVPN を使用している場合:
まず deny ポリシーを設定してから通過させるサービスを allow してください:
 
ufw default deny outgoing
 
ufw default deny incoming
 
ufw allow ssh
 
ufw allow 1194
 
ufw allow out 1194
 
ufw allow out on tun0 from any to any
 
ufw allow in on tun0 from any to any
 
   
  +
mv /etc/openvpn/client/foo.conf /etc/openvpn/client/foo.skel
そして VPN サーバーの IP アドレスまたは範囲を追加します。IP アドレスごとに2つのエントリが必要になります。以下の例は、説明のための偽の IP アドレスです。
 
ufw allow in from 50.120.10.200 to any
 
ufw allow out from 50.121.10.200 to any
 
   
  +
{{ic|/etc/openvpn/client/foo.skel}} を編集して、リモート '''www.myvpnserver.org''' を '''@@@''' に置き換えます。次に例を示します。
最後に、VPN の接続と関係なくアクセスを許可する内部 LAN の IP 範囲を追加:
 
ufw allow from 192.168.0.0/24
 
   
  +
remote @@@
ufw を起動してブート時に起動するように {{ic|ufw.service}} を[[有効化]]してください。
 
ufw enable
 
   
  +
最後に、[[ドロップインファイル]] を作成して、IP を読み取り、実際のプロファイルと置き換えます。
==== pgl ====
 
  +
コンテナの中で [[PeerGuardian Linux|pgl]] を使うことで保護を追加できます。[[PeerGuardian Linux#コンテナから pgl を実行]] を見て下さい。
 
  +
WireGuard を使用した例:
  +
  +
{{hc|/etc/systemd/system/wg-quick@foo.service.d/override.conf|2=
  +
[Service]
  +
EnvironmentFile=-/etc/conf.d/server.hack.txt
  +
ExecStartPre=/bin/bash -ac "sed s/@@@/$SERVER/ </etc/wireguard/foo.skel >/etc/wireguard/foo.conf"
  +
}}
  +
  +
OpenVPN を使用した例:
  +
  +
{{hc|/etc/systemd/system/openvpn-client@foo.service.d/override.conf|2=
  +
[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 や {{ic|lxc-attach -n playtime}} で接続して) ホストマシンの X サーバーにブラウザをエクスポートしてセットアップをテストします:
 
コンテナの中から、(ssh や {{ic|lxc-attach -n playtime}} で接続して) ホストマシンの X サーバーにブラウザをエクスポートしてセットアップをテストします:
 
$ DISPLAY=:0 firefox
 
$ DISPLAY=:0 firefox
  +
  +
{{Tip|SSH 経由で接続するには、ローカルディスプレイが接続を受け入れることを許可する必要があります。{{ic|xhost +SI:localuser:yourusername}} を介してこれを実行し、SSH を介してコンテナに接続します。}}
   
 
"Mozilla Firefox (playtime)" というタイトルでホストの X サーバーに firefox のウィンドウが表示されるはずです。複数のウェブサイトを使って IP アドレスと DND エントリの状態を確認できます。そのようなサイトの一つとして [http://ipleak.net ipleak dot net] があります。
 
"Mozilla Firefox (playtime)" というタイトルでホストの X サーバーに firefox のウィンドウが表示されるはずです。複数のウェブサイトを使って IP アドレスと DND エントリの状態を確認できます。そのようなサイトの一つとして [http://ipleak.net ipleak dot net] があります。

2024年8月14日 (水) 23:04時点における最新版

関連記事

この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として Linux コンテナ を使って OpenVPN をクライアントモードで動作させるように設定する方法を説明します。VirtualBoxQEMU などの完全な仮想化を使うよりもリソースのオーバーヘッドを最小限にして低性能のデバイスでも動かすことができるというメリットがあります。

コンテナの設定

Linux コンテナの基本的な設定と理解が必要になります。この記事では読者がベースとなる LXC のセットアップを既に作っていて操作できる状態になっていることが前提です。初心者は Linux コンテナの記事を読んで下さい。

サーバーモードの OpenVPN

このサブセクションでは、コンテナ内で OpenVPN を提供するために必要な追加のセットアップについて詳しく説明します。提供された OpenVPN プロファイルを使用したいユーザーは、このサブセクションを読む必要はありません。

ホストのセットアップ

  1. コンテナを実行できるようにするには、ホスト OS にブリッジイーサネットセットアップが必要です。これについては、Linux コンテナ#ホストネットワーク設定 を参照してください。
  2. パケット転送を有効にする必要があります。これについては、インターネット共有#パケット転送の有効化 を参照してください。
  3. 厳密には必須ではありませんが、ファイアウォールを使用することを強くお勧めします。

クライアントモードでの 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 を参照してください。

ノート: 非特権コンテナ内で OpenVPN を実行しているユーザーは、カスタム systemd ユニットを作成してコンテナ内で起動する必要があります。ユニットファイル を置き換えて、LimitNPROC... で始まる行をコメントアウトします。

WireGuard

wireguard-tools をインストールします。ユーザーは、サードパーティの VPN サービスによって提供される WireGuard 設定を使用するか、この役割を果たすように WireGuard をセットアップすることになります。コンテナを使用して VPN プロバイダに接続する場合は、設定ファイル foo.conf/etc/wireguard/ に配置するだけで使用できます。

コンテナ内の WireGuard 機能を確認するには、wg-quick@foo.service 経由で Wi​​reGuard を 起動 し、条件が満たされたら有効化 します。

他の使用例については、WireGuard を参照してください。

コンテナ内のファイアウォール設定

コンテナ内で適切に構成された ファイアウォール を実行することを 強く お勧めします。コンテナ内でのファイアウォールの役割は 2 つあります。

  1. VPN への接続が失敗した場合にプライバシーを維持するために、機能的な "キルスイッチ" を提供します。
  2. 不快なものを排除。

このガイドでは、設定が簡単な ufw を使用していますが、他の例も使用できます。

ヒント: ufw の設定ファイルを完全にリセットするには、reset 引数を指定して呼び出します: ufw restart

機能的な "キルスイッチ" の戦略は、単純に拒否ポリシーを設定し、VPN デバイス上でのみ特定のサービスとトラフィックを許可することです。こうすることで、デバイスの接続が中断された場合でも、ローカルフォールバックは発生しません。

ノート: 以下に示す方法の制限は、VPN プロファイルで www.myvpn.com などのドメイン名を使用してはならず、対応する IP アドレスを使用する必要があることです。前述したように、VPN が接続されていない場合、コンテナーの DNS 解決は設計により無効になります。したがって、接続するには数値 IP を提供する必要があります

/etc/default/ufw を編集し、DEFAULT_OUTPUT_POLICY を ACCEPT から DROP に変更します。

/etc/default/ufw
DEFAULT_OUTPUT_POLICY="DROP"
ノート: ufw を呼び出す次のコマンドは、root ユーザーとして実行する必要があります。標準の Wiki 表記に従ってこれらのコマンドの前に付ける "#" 記号は、ターミナルへのクリーンなコピー/ペーストを可能にするために省略されています。

拒否ポリシーを設定します:

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
ノート: 複数のサーバーの使用が予想される場合は、VPN プロバイダーによって定義された IP アドレス (xxx) ごとにこれを繰り返します。

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
ヒント: SSH 経由で接続するには、ローカルディスプレイが接続を受け入れることを許可する必要があります。xhost +SI:localuser:yourusername を介してこれを実行し、SSH を介してコンテナに接続します。

"Mozilla Firefox (playtime)" というタイトルでホストの X サーバーに firefox のウィンドウが表示されるはずです。複数のウェブサイトを使って IP アドレスと DND エントリの状態を確認できます。そのようなサイトの一つとして ipleak dot net があります。

この段階で、/etc/openvpn/client/myprofile.conf の IP と DNS エントリが表示されます。