「Linux コンテナ/VPN の使用」の版間の差分
(コンテナ内のファイアウォール設定を翻訳して追加) |
Kusanaginoturugi (トーク | 投稿記録) |
||
(2人の利用者による、間の9版が非表示) | |||
1行目: | 1行目: | ||
− | + | [[Category:仮想プライベートネットワーク]] |
|
[[Category:仮想化]] |
[[Category:仮想化]] |
||
− | [[en: |
+ | [[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| |
+ | {{Related|PeerGuardian_Linux}} |
− | {{Related|PeerGuardian Linux}} |
||
− | {{Related|Systemd-nspawn}} |
||
{{Related|ufw}} |
{{Related|ufw}} |
||
+ | {{Related|WireGuard}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として [[Linux |
+ | この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として [[Linux コンテナ]] を使って OpenVPN をクライアントモードで動作させるように設定する方法を説明します。[[VirtualBox]] や [[QEMU]] などの完全な仮想化を使うよりもリソースのオーバーヘッドを最小限にして低性能のデバイスでも動かすことができるというメリットがあります。 |
== コンテナの設定 == |
== コンテナの設定 == |
||
− | [[Linux |
+ | [[Linux コンテナ]]の基本的な設定と理解が必要になります。この記事では読者がベースとなる LXC のセットアップを既に作っていて操作できる状態になっていることが前提です。初心者は [[Linux コンテナ]]の記事を読んで下さい。 |
== サーバーモードの OpenVPN == |
== サーバーモードの OpenVPN == |
||
26行目: | 22行目: | ||
=== ホストのセットアップ === |
=== ホストのセットアップ === |
||
− | # コンテナを実行できるようにするには、ホスト OS にブリッジイーサネットセットアップが必要です。これについては、[[Linux |
+ | # コンテナを実行できるようにするには、ホスト OS にブリッジイーサネットセットアップが必要です。これについては、[[Linux コンテナ#ホストネットワーク設定]] を参照してください。 |
# パケット転送を有効にする必要があります。これについては、[[インターネット共有#パケット転送の有効化]] を参照してください。 |
# パケット転送を有効にする必要があります。これについては、[[インターネット共有#パケット転送の有効化]] を参照してください。 |
||
# 厳密には必須ではありませんが、ファイアウォールを使用することを強くお勧めします。 |
# 厳密には必須ではありませんが、ファイアウォールを使用することを強くお勧めします。 |
||
69行目: | 65行目: | ||
{{Note|以下に示す方法の制限は、VPN プロファイルで www.myvpn.com などのドメイン名を使用してはならず、対応する IP アドレスを使用する必要があることです。前述したように、VPN が接続されていない場合、コンテナーの DNS 解決は設計により無効になります。したがって、接続するには数値 IP を提供する必要があります}} |
{{Note|以下に示す方法の制限は、VPN プロファイルで www.myvpn.com などのドメイン名を使用してはならず、対応する IP アドレスを使用する必要があることです。前述したように、VPN が接続されていない場合、コンテナーの DNS 解決は設計により無効になります。したがって、接続するには数値 IP を提供する必要があります}} |
||
− | + | {{ic|/etc/default/ufw}} を編集し、DEFAULT_OUTPUT_POLICY を ''ACCEPT'' から ''DROP'' に変更します。 |
|
{{hc|/etc/default/ufw|2= |
{{hc|/etc/default/ufw|2= |
||
DEFAULT_OUTPUT_POLICY="DROP" |
DEFAULT_OUTPUT_POLICY="DROP" |
||
168行目: | 164行目: | ||
}} |
}} |
||
− | + | == サービスのテスト == |
|
− | OpenVPN とインターネットプログラムの両方を動かして VPN を通して LXC の中からホストシステムと対話できるようにするため、コンテナの設定を変更して複数のセクションを記述する必要があります。 |
||
− | |||
− | 例えば、lxc の名前が "playtime" なら以下が完全な設定になります: |
||
− | {{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) |
||
− | |||
− | lxc.rootfs = /var/lib/lxc/playtime/rootfs |
||
− | lxc.utsname = playtime |
||
− | lxc.arch = x86_64 |
||
− | lxc.include = /usr/share/lxc/config/archlinux.common.conf |
||
− | |||
− | ## 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 |
||
− | |||
− | ## systemd within the lxc |
||
− | lxc.autodev = 1 |
||
− | lxc.hook.autodev = /var/lib/lxc/playtime/autodev |
||
− | lxc.pts = 1024 |
||
− | lxc.kmsg = 0 |
||
− | |||
− | ## 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 |
||
− | ## fix overmounting see: https://github.com/lxc/lxc/issues/434 |
||
− | 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 |
||
− | |||
− | ## for openvpn |
||
− | lxc.cgroup.devices.allow = c 10:200 rwm |
||
− | </nowiki>}} |
||
− | |||
− | {{Note|この例では ''autodev'' フックを利用して {{ic|/var/lib/lxc/playtime/autodev}} スクリプトを呼び出さなくてはなりません。ユーザーはスクリプトを作成して実行可能属性を付与する必要があります。スクリプトは下に記載しています。[[Linux Containers]] の記事も参照してください。}} |
||
− | |||
− | {{hc|/var/lib/lxc/playtime/autodev|<nowiki> |
||
− | #!/bin/bash |
||
− | cd ${LXC_ROOTFS_MOUNT}/dev |
||
− | mkdir net |
||
− | mknod net/tun c 10 200 |
||
− | chmod 0666 net/tun |
||
− | </nowiki>}} |
||
− | |||
− | === コンテナの中に必要なパッケージ === |
||
− | |||
− | ベースシステムに加えて、[[公式リポジトリ]]から {{Pkg|openvpn}} をインストールする必要があります。[[ファイアウォール]]を適切に設定してコンテナの中で使用することが''強く''推奨されます。コンテナの中にファイアウォールを作る理由は2つあります: |
||
− | # "キルスイッチ"を作って VPN への接続が失敗したときにプライバシーを守る。 |
||
− | # 危険なものを除外する。 |
||
− | |||
− | このガイドでは簡単に設定できる {{pkg|ufw}} を使いますが、他の方法でもかまいません。 |
||
− | |||
− | === パッケージの設定 === |
||
− | ==== OpenVPN ==== |
||
− | OpenVPN の設定についてはこの記事では扱いません。適切に OpenVPN を設定するために [[OpenVPN]] の記事を読むことを推奨します。多くのプライベート VPN プロバイダはそれぞれのサービス用に正しく設定された openvpn.opvn プロファイルを直接ダウンロードできるリンクを提供しています。このガイドの趣旨上、{{ic|/etc/openvpn/client/myprofile.conf}} がその設定を参照します。 |
||
− | |||
− | コンテナの中で openvpn が機能することを確認してください。{{ic|openvpn@myprofile.service}} で openvpn を[[起動]]して、問題ないようでしたら、ブート時に起動するように[[有効化]]してください。 |
||
− | |||
− | ===== DNS の漏洩の防止 ===== |
||
− | [[OpenVPN#DNS]] の指示に従って {{ic|/etc/resolv.conf}} を管理するように openvpn を設定することを強く推奨します。設定していない場合、ホストの DNS サーバーがこのファイルで指定されている場合に DNS が漏洩する可能性があります。 |
||
− | |||
− | ==== ufw ==== |
||
− | [[ufw]] の設定は [[OpenVPN#ファイアウォールの設定]] で説明されています。記述通りに設定したら、使用するプロトコル (ssh や torrent など) と VPN プロバイダの IP アドレスまたは IP アドレスの範囲を追加で定義します。どちらも、プライベートプロバイダから取得できます。 |
||
− | |||
− | {{Note|以下のコマンドは root ユーザーで実行する必要があります。ArchWiki では root ユーザーで実行するコマンドには "#" 記号を前に付けることになっていますが、ターミナルにコピーアンドペーストしやすいように以下では省いています。}} |
||
− | |||
− | まず 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 |
||
− | |||
− | そして 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 |
||
− | |||
− | 最後に、VPN の接続と関係なくアクセスを許可する内部 LAN の IP 範囲を追加: |
||
− | ufw allow from 192.168.0.0/24 |
||
− | |||
− | ufw を起動してブート時に起動するように {{ic|ufw.service}} を[[有効化]]してください。 |
||
− | ufw enable |
||
− | |||
− | ==== pgl ==== |
||
− | コンテナの中で [[PeerGuardian Linux|pgl]] を使うことで保護を追加できます。[[PeerGuardian Linux#コンテナから pgl を実行]] を見て下さい。 |
||
− | |||
− | == サービスのテスト == |
||
コンテナの中から、(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 をクライアントモードで動作させるように設定する方法を説明します。VirtualBox や QEMU などの完全な仮想化を使うよりもリソースのオーバーヘッドを最小限にして低性能のデバイスでも動かすことができるというメリットがあります。
目次
コンテナの設定
Linux コンテナの基本的な設定と理解が必要になります。この記事では読者がベースとなる LXC のセットアップを既に作っていて操作できる状態になっていることが前提です。初心者は Linux コンテナの記事を読んで下さい。
サーバーモードの OpenVPN
このサブセクションでは、コンテナ内で OpenVPN を提供するために必要な追加のセットアップについて詳しく説明します。提供された OpenVPN プロファイルを使用したいユーザーは、このサブセクションを読む必要はありません。
ホストのセットアップ
- コンテナを実行できるようにするには、ホスト OS にブリッジイーサネットセットアップが必要です。これについては、Linux コンテナ#ホストネットワーク設定 を参照してください。
- パケット転送を有効にする必要があります。これについては、インターネット共有#パケット転送の有効化 を参照してください。
- 厳密には必須ではありませんが、ファイアウォールを使用することを強くお勧めします。
クライアントモードでの 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 エントリが表示されます。