Linux Containers で OpenVPN クライアント

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

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

コンテナの設定

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

サーバーモードの OpenVPN

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

ホストのセットアップ

  1. コンテナを実行できるようにするには、ホスト OS にブリッジイーサネットセットアップが必要です。これについては、Linux Containers#ホストネットワーク設定 を参照してください。
  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 エントリが表示されます。