「Linux コンテナ/VPN の使用」の版間の差分
(ページの作成:「Category:セキュリティ Category:仮想化 en:OpenVPN in Linux containers pt:Linux Containers {{Related articles start}} {{Related4|AirVPN}} {{Related...」) |
Kusanaginoturugi (トーク | 投稿記録) |
||
(3人の利用者による、間の19版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category: |
+ | [[Category:仮想プライベートネットワーク]] |
[[Category:仮想化]] |
[[Category:仮想化]] |
||
− | [[en: |
+ | [[en:Linux Containers/Using VPNs]] |
[[pt:Linux Containers]] |
[[pt:Linux Containers]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
− | {{Related4|AirVPN}} |
||
− | {{Related|Docker}} |
||
− | {{Related|Linux Containers}} |
||
{{Related|OpenVPN}} |
{{Related|OpenVPN}} |
||
− | {{Related| |
+ | {{Related|PeerGuardian_Linux}} |
{{Related|ufw}} |
{{Related|ufw}} |
||
+ | {{Related|WireGuard}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として [[Linux |
+ | この記事ではセキュア・プライベートなインターネット利用の"キルスイッチ"として [[Linux コンテナ]] を使って OpenVPN をクライアントモードで動作させるように設定する方法を説明します。[[VirtualBox]] や [[QEMU]] などの完全な仮想化を使うよりもリソースのオーバーヘッドを最小限にして低性能のデバイスでも動かすことができるというメリットがあります。 |
− | |||
− | LXC よりも楽な抽象化として [[systemd-nspawn]] があり設定方法のウォークスルーが [https://www.youtube.com/watch?v=7Obl8_dozh0& OpenVPN systemd container tutorial] にあります。 |
||
== コンテナの設定 == |
== コンテナの設定 == |
||
− | [[Linux Containers]] の基本的な設定と理解が必要になります。この記事では読者がベースとなる LXC のセットアップを既に作っていて操作できる状態になっていることが前提です。初心者は [[Linux Containers]] の記事を読んで下さい。 |
||
+ | [[Linux コンテナ]]の基本的な設定と理解が必要になります。この記事では読者がベースとなる LXC のセットアップを既に作っていて操作できる状態になっていることが前提です。初心者は [[Linux コンテナ]]の記事を読んで下さい。 |
||
− | === LXC の設定 === |
||
− | OpenVPN とインターネットプログラムの両方を動かして VPN を通して LXC の中からホストシステムと対話できるようにするため、コンテナの設定を変更して複数のセクションを記述する必要があります。 |
||
+ | == サーバーモードの OpenVPN == |
||
− | 例えば、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) |
||
+ | このサブセクションでは、コンテナ内で OpenVPN を提供するために必要な追加のセットアップについて詳しく説明します。提供された OpenVPN プロファイルを使用したいユーザーは、このサブセクションを読む必要はありません。 |
||
− | 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 |
||
+ | # コンテナを実行できるようにするには、ホスト OS にブリッジイーサネットセットアップが必要です。これについては、[[Linux コンテナ#ホストネットワーク設定]] を参照してください。 |
||
− | ## systemd within the lxc |
||
+ | # パケット転送を有効にする必要があります。これについては、[[インターネット共有#パケット転送の有効化]] を参照してください。 |
||
− | lxc.autodev = 1 |
||
+ | # 厳密には必須ではありませんが、ファイアウォールを使用することを強くお勧めします。 |
||
− | lxc.hook.autodev = /var/lib/lxc/playtime/autodev |
||
− | lxc.pts = 1024 |
||
− | lxc.kmsg = 0 |
||
+ | == クライアントモードでの OpenVPN == |
||
− | ## for openvpn |
||
− | lxc.cgroup.devices.allow = c 10:200 rwm |
||
+ | OpenVPN を使用するには、コンテナの設定を次のように変更する必要があります: |
||
− | ## 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 |
||
+ | {{hc|/var/lib/lxc/playtime/config|<nowiki> |
||
− | ## 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 |
+ | ## for OpenVPN |
+ | lxc.mount.entry = /dev/net dev/net none bind,create=dir |
||
− | lxc.cgroup.devices.allow = c 10:200 rwm |
||
+ | lxc.cgroup2.devices.allow = c 10:200 rwm |
||
</nowiki>}} |
</nowiki>}} |
||
+ | {{Pkg|openvpn}} をインストールします。コンテナを使用してサードパーティ VPN プロバイダに接続する場合は、設定ファイル {{ic|foo.conf}} を {{ic|/etc/openvpn/client/foo.conf}} に配置するだけで使用できます。コンテナ内の OpenVPN 機能を確認するには、{{ic|openvpn-client@foo.service}} 経由で OpenVPN を [[起動]] し、条件が満たされたら [[有効化]] します。 |
||
− | {{Note|This example requires the use of the '''autodev''' hook which calls the corresponding {{ic|/var/lib/lxc/playtime/autodev}} script which users need to create and make executable. For the sake of completeness, this script is provided below. Refer to the [[Linux Containers]] article for additional discussion if needed.}} |
||
+ | 他の使用例とセットアップについては、[[OpenVPN]] を参照してください。 |
||
− | {{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>}} |
||
+ | {{Note|''非特権''コンテナ内で OpenVPN を実行しているユーザーは、カスタム systemd ユニットを作成してコンテナ内で起動する必要があります。[[systemd#ユニットファイルを置換する|ユニットファイル]] を置き換えて、{{ic|LimitNPROC...}} で始まる行をコメントアウトします。}} |
||
− | === コンテナの中に必要なパッケージ === |
||
+ | == WireGuard == |
||
− | ベースシステムに加えて、[[公式リポジトリ]]から {{Pkg|openvpn}} をインストールする必要があります。[[ファイアウォール]]を適切に設定してコンテナの中で使用することが''強く''推奨されます。コンテナの中にファイアウォールを作る理由は2つあります: |
||
− | # "キルスイッチ"を作って VPN への接続が失敗したときにプライバシーを守る。 |
||
− | # 危険なものを除外する。 |
||
+ | {{Pkg|wireguard-tools}} をインストールします。ユーザーは、サードパーティの VPN サービスによって提供される WireGuard 設定を使用するか、この役割を果たすように WireGuard をセットアップすることになります。コンテナを使用して VPN プロバイダに接続する場合は、設定ファイル {{ic|foo.conf}} を {{ic|/etc/wireguard/}} に配置するだけで使用できます。 |
||
− | このガイドでは簡単に設定できる {{pkg|ufw}} を使いますが、他の方法でもかまいません。 |
||
+ | コンテナ内の WireGuard 機能を確認するには、{{ic|wg-quick@foo.service}} 経由で WireGuard を [[起動]] し、条件が満たされたら[[有効化]] します。 |
||
− | === パッケージの設定 === |
||
− | ==== OpenVPN ==== |
||
− | OpenVPN の設定についてはこの記事では扱いません。適切に OpenVPN を設定するために [[OpenVPN]] の記事を読むことを推奨します。多くのプライベート VPN プロバイダはそれぞれのサービス用に正しく設定された openvpn.opvn プロファイルを直接ダウンロードできるリンクを提供しています。このガイドの趣旨上、{{ic|/etc/openvpn/myprofile.conf}} がその設定を参照します。 |
||
+ | 他の使用例については、[[WireGuard]] を参照してください。 |
||
− | コンテナの中で openvpn が機能することを確認してください。{{ic|openvpn@myprofile.service}} で openvpn を[[起動]]して、問題ないようでしたら、ブート時に起動するように[[有効化]]してください。 |
||
+ | == コンテナ内のファイアウォール設定 == |
||
− | ===== DNS の漏洩の防止 ===== |
||
− | [[OpenVPN#DNS]] の指示に従って {{ic|/etc/resolv.conf}} を管理するように openvpn を設定することを強く推奨します。設定していない場合、ホストの DNS サーバーがこのファイルで指定されている場合に DNS が漏洩する可能性があります。 |
||
+ | コンテナ内で適切に構成された [[ファイアウォール]] を実行することを ''強く'' お勧めします。コンテナ内でのファイアウォールの役割は 2 つあります。 |
||
− | ==== ufw ==== |
||
+ | # VPN への接続が失敗した場合にプライバシーを維持するために、機能的な "キルスイッチ" を提供します。 |
||
− | [[ufw]] の設定は [[OpenVPN#ファイアウォールの設定]] で説明されています。記述通りに設定したら、使用するプロトコル (ssh や torrent など) と VPN プロバイダの IP アドレスまたは IP アドレスの範囲を追加で定義します。どちらも、プライベートプロバイダから取得できます。 |
||
+ | # 不快なものを排除。 |
||
+ | このガイドでは、設定が簡単な {{pkg|ufw}} を使用していますが、他の例も使用できます。 |
||
− | {{Note|The following needs to be executed as the root user; the "#" sign prefixing these commands per standard wiki notation has been omitted to allow for a clean copy/paste into a terminal.}} |
||
+ | {{Tip|ufw の設定ファイルを完全にリセットするには、reset 引数を指定して呼び出します: {{ic|ufw restart}}}} |
||
+ | 機能的な "キルスイッチ" の戦略は、単純に拒否ポリシーを設定し、VPN デバイス上でのみ特定のサービスとトラフィックを許可することです。こうすることで、デバイスの接続が中断された場合でも、ローカルフォールバックは発生しません。 |
||
− | まず deny ポリシーを設定してから通過させるサービスを allow してください: |
||
+ | |||
+ | {{Note|以下に示す方法の制限は、VPN プロファイルで www.myvpn.com などのドメイン名を使用してはならず、対応する IP アドレスを使用する必要があることです。前述したように、VPN が接続されていない場合、コンテナーの DNS 解決は設計により無効になります。したがって、接続するには数値 IP を提供する必要があります}} |
||
+ | |||
+ | {{ic|/etc/default/ufw}} を編集し、DEFAULT_OUTPUT_POLICY を ''ACCEPT'' から ''DROP'' に変更します。 |
||
+ | {{hc|/etc/default/ufw|2= |
||
+ | DEFAULT_OUTPUT_POLICY="DROP" |
||
+ | }} |
||
+ | |||
+ | {{Note|{{ic|ufw}} を呼び出す次のコマンドは、root ユーザーとして実行する必要があります。標準の Wiki 表記に従ってこれらのコマンドの前に付ける "#" 記号は、ターミナルへのクリーンなコピー/ペーストを可能にするために省略されています。}} |
||
+ | |||
+ | 拒否ポリシーを設定します: |
||
ufw default deny outgoing |
ufw default deny outgoing |
||
ufw default deny incoming |
ufw default deny incoming |
||
+ | |||
+ | 必要に応じて、{{ic|/etc/ufw/applications.d/custom}} などのファイルに定義されている事前定義ルールまたはカスタム ルールを追加します: |
||
ufw allow ssh |
ufw allow ssh |
||
− | ufw allow |
+ | ufw allow from my-custom-app1 |
− | ufw allow |
+ | ufw allow from my-custom-app2 |
− | ufw allow out on tun0 from any to any |
||
− | ufw allow in on tun0 from any to any |
||
+ | オプションで、内部 LAN IP 範囲または単一の IP アドレスからのアクセスをさらに制限します: |
||
− | そして VPN サーバーの IP アドレスまたは範囲を追加します。IP アドレスごとに2つのエントリが必要になります。以下の例は、説明のための偽の IP アドレスです。 |
||
− | ufw allow |
+ | ufw allow from 192.168.1.0/24 |
− | ufw allow out from 50.121.10.200 to any |
||
+ | WireGuard のユーザーは、それぞれの設定ファイルと同じ名前のインターフェースを作成します (例: {{ic|/etc/wireguard/foo.conf}}) 一方、OpenVPN ユーザーはおそらく {{ic|tun0}} を使用します。以下の行で、''foo'' を WireGuard 設定の名前 (.conf サフィックスを省略) に置き換えるか、OpenVPN を使用している場合は、''foo'' を tun0 または使用されているデバイスに置き換えます。 |
||
− | 最後に、VPN の接続と関係なくアクセスを許可する内部 LAN の IP 範囲を追加: |
||
− | ufw allow from 192.168.0.0/24 |
||
+ | ufw allow out on foo from any to any |
||
− | ufw を起動してブート時に起動するように {{ic|ufw.service}} を[[有効化]]してください。 |
||
− | # ufw enable |
||
+ | 最後に、予想されるポートで VPN プロバイダーの IP アドレスへのアクセスを許可し、予想されるプロトコルを定義します。以下の行には、そのように定義されているとみなされる 3 つの変数があります: |
||
− | ==== pgl ==== |
||
+ | * 'xxx' は、WireGuard ピア/OpenVPN サーバーの IP アドレスを表します。これは、VPN プロバイダーによって提供されるそれぞれの設定ファイルで定義されます。 |
||
− | コンテナの中で [[PeerGuardian Linux|pgl]] を使うことで保護を追加できます。[[PeerGuardian Linux#コンテナから pgl を実行]] を見て下さい。 |
||
+ | * '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 つの変数を編集します: |
||
+ | |||
+ | ==== ホスト上で ==== |
||
+ | |||
+ | {{pkg|bind}} (dig に必要) をインストールし、次のスクリプトを作成します: |
||
+ | {{hc|/path/to/container-start.sh|<nowiki> |
||
+ | #!/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 |
||
+ | </nowiki>}} |
||
+ | |||
+ | 以降、そのスクリプトを呼び出してコンテナを起動します。dig を使用してドメイン名から IP アドレスを取得し、コンテナーを起動します。 |
||
+ | |||
+ | ==== コンテナの中から ==== |
||
+ | |||
+ | VPN を開始する systemd サービスを変更し、スクリプトによって {{ic|/var/lib/lxc/$container/rootfs/etc/conf.d/server.hack.txt}} で定義された IP アドレスで変更できるスケルトンプロファイルを作成します。 |
||
+ | |||
+ | スケルトン設定ファイルを作成するには、ライブファイルの名前を別の名前に変更するだけです。 |
||
+ | |||
+ | たとえば、WireGuard を使用すると、次のようになります: |
||
+ | |||
+ | mv /etc/wireguard/foo.conf /etc/wireguard/foo.skel |
||
+ | |||
+ | 次に、{{ic|/etc/wireguard/foo.skel}} を編集して、'''Endpoint = www.myvpnserver.org''' を '''@@@''' に置き換えます。次に例を示します。 |
||
+ | |||
+ | Endpoint = @@@:51820 |
||
+ | |||
+ | または、OpenVPN を使用している場合: |
||
+ | |||
+ | mv /etc/openvpn/client/foo.conf /etc/openvpn/client/foo.skel |
||
+ | |||
+ | {{ic|/etc/openvpn/client/foo.skel}} を編集して、リモート '''www.myvpnserver.org''' を '''@@@''' に置き換えます。次に例を示します。 |
||
+ | |||
+ | remote @@@ |
||
+ | |||
+ | 最後に、[[ドロップインファイル]] を作成して、IP を読み取り、実際のプロファイルと置き換えます。 |
||
+ | |||
+ | 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] があります。 |
||
− | この段階で、{{ic|/etc/openvpn/myprofile.conf}} の IP と DNS エントリが表示されます。 |
+ | この段階で、{{ic|/etc/openvpn/client/myprofile.conf}} の IP と DNS エントリが表示されます。 |
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 エントリが表示されます。