Linux Containers で OpenVPN サーバー

提供: ArchWiki
移動先: 案内検索

この記事ではセキュアかつプライベートにインターネットを利用するために Linux ContainersOpenVPN をサーバーモードで実行する方法を説明します。VirtualBoxQEMU のような完全仮想化と比べてオーバーヘッドが最小限に抑えられて低性能のデバイスでも使えるというメリットがあります。

ホストの設定

  1. ホスト OS にはコンテナから使えるブリッジイーサネットを設定する必要があります。Linux Containers#ホストネットワークの設定を参照してください。
  2. パケット転送を有効にする必要があります。インターネット共有#パケット転送の有効化を見てください。
  3. 必須ではありませんがファイアウォールを設定することが強く推奨されます。

コンテナの設定

Linux Containers の基本的な知識が必要です。この記事では既にベースとなる LXC の設定は終わっていることを前提とします。初めて LXC を使用する場合は Linux Containers の記事を読んでください。

LXC の設定

コンテナの設定を編集して OpenVPN を実行するのに必要なセクションを複数記述してください。

例えば、lxc の名前が "playtime" ならば設定は以下のようになります:

/var/lib/lxc/playtime/config
# 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.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 = /var/cache/pacman/pkg var/cache/pacman/pkg none bind 0 0

## for openvpn
lxc.cgroup.devices.allow = c 10:200 rwm
ノート: 上記の例では autodev フックを使って /var/lib/lxc/playtime/autodev スクリプトを呼び出していますが、スクリプトはユーザーが作成して実行可能権限を与える必要があります。スクリプトは以下に記載しています。Linux Containers も参照してください。
/var/lib/lxc/playtime/autodev
#!/bin/bash
cd ${LXC_ROOTFS_MOUNT}/dev
mkdir net
mknod net/tun c 10 200
chmod 0666 net/tun

コンテナにインストールする必要があるパッケージ

ベース環境に加えて、公式リポジトリopenvpn パッケージが必要です。また、コンテナの中でファイアウォールを設定することを強く推奨します。このガイドでは設定しやすい ufw を使いますが別のファイアウォールでもかまいません。

パッケージの設定

OpenVPN

OpenVPN の記事を参照してホームサーバーをセットアップしてください。openvpn@myprofile.service起動してコンテナから openvpn が使えることが確認できたら有効化してください。

ufw

OpenVPN#ファイアウォールの設定を参照してコンテナの中でファイアウォールをセットアップしてください。設定が間違っていると openvpn がコンテナの中で正しく動作しないことがあります。

ufw.service起動有効化してください:

# ufw enable