今回はUbuntuの具体的な利用方法として、
まずは目的を決める
写真や動画のマルチメディアコンテンツの保存について頭を悩ませている人は多いでしょう。デジタルカメラやスマートフォンといった簡単に撮影できる機材が手元にあるおかげで、
家にあるマシンに保存する場合、
そこで今回はご家庭にあるメディアライブラリーを、
VPSを経由する
ご家庭のメディアライブラリーをインターネットに公開する一番シンプルな方法は、
この場合、
- 外部からアクセスできるようにルーターを適切に設定する
- サーバーのIPアドレスを、
クライアントが知る術を用意する - DLNAなどルーター越しには使えないサービスについては代替手段を用意する
この中で一番やっかいなのはルーターの設定でしょう。ルーターごとに手順が異なるうえに、
VPSを1台用意し、
2番目のIPアドレスについては、
VPSを使う場合、
よって今回はクライアントがインターネットから接続するサーバーは一度VPSを経由するような設定を紹介します。ご家庭内のサービスを外向けに公開する場合は、
接続方式としてOpenVPNを使う
家庭内LANで公開されているホームサーバーをVPS経由でインターネットからアクセスする方法はいくつか存在します。たとえばVPSにプロキシーを設定する方法や、
今回はその中でも
VPS上にOpenVPNサーバーを構築し、
今回はルーティングモード
メディアリポジトリとしてWebDAVを使う
メディアサーバーといえば前節でも述べたとおりまずDLNAが思いつきます。DLNAは配信機器を検知するためにSSDPのブロードキャストパケットを送信するのですが、
今回はよりお手軽に、
ちなみに、
LXCを使う
ここまでで紹介したソフトウェアはすべてLXCのコンテナ上にインストールすることにします。VPS上に直接OpenVPNをインストールしてももちろん良いのですが、
合わせてUbuntuでLXCを使う場合における、
サーバー側の設定
最初にVPS側の設定を行います。VPSにはあらかじめUbuntu 14.
(Ubuntu 12.04 LTSのみ実行する) $ sudo apt-get install python-software-properties $ sudo add-apt-repository ppa:ubuntu-lxc/stable $ sudo apt-get install linux-hwe-generic
LXCのインストール
VPS上に用意したUbuntuにLXCをインストールします。
$ sudo apt update $ sudo apt install lxc
UbuntuのLXCのコンテナ
$ sudo sed -i 's/LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"/LXC_DHCP_RANGE="10.0.3.2,10.0.3.127"/' /etc/default/lxc-net $ sudo sed -i 's/LXC_DHCP_MAX="253"/LXC_DHCP_MAX="126"/' /etc/default/lxc-net $ sudo stop lxc $ sudo start lxc
OpenVPN用のコンテナの作成
OpenVPN用のコンテナ
$ sudo lxc-create -t ubuntu-cloud -n openvpn -- --auth-key=/home/`id -un`/.ssh/authorized_keys
ubuntu-cloudは、
「--auth-keys」
各テンプレート固有のオプションはテンプレートに
$ lxc-create -t ubuntu-cloud --help $ /usr/share/lxc/hooks/ubuntu-cloud-prep --help
次に、
$ sudo editor /var/lib/lxc/openvpn/config
「# Network configuration」付近に次の2つのオプションを追加します。
lxc.network.ipv4 = 10.0.3.200/24
lxc.network.ipv4.gateway = 10.0.3.1
ubuntuテンプレートの場合
$ sudo editor /var/lib/lxc/openvpn/rootfs/etc/network/interfaces
ubuntu-cloudテンプレートの場合
$ sudo editor /var/lib/lxc/openvpn/rootfs/etc/network/interfaces.d/eth0.cfg
eth0をdhcpからmanualに変更し、DNS設定を追加します
auto eth0
iface eth0 inet manual
dns-nameservers 10.0.3.1
interfacesファイルは、
openvpnコンテナを起動し、
$ sudo lxc-start -n openvpn -d $ sudo lxc-info -n openvpn Name: openvpn State: RUNNING PID: 1817 IP: 10.0.3.200 CPU use: 74.27 seconds BlkIO use: 329.48 MiB Memory use: 206.20 MiB KMem use: 0 bytes Link: vethLUALUW TX bytes: 61.14 MiB RX bytes: 61.61 MiB Total bytes: 122.75 MiB $ ssh ubuntu@10.0.3.200
うまく動作するようなら、
$ sudo editor /var/lib/lxc/openvpn/config
以下の行を追加する
# enable autostart
lxc.start.auto = 1
$ sudo lxc-ls --fancy openvpn
NAME STATE IPV4 IPV6 AUTOSTART
---------------------------------------------
openvpn RUNNING 10.0.3.200 - YES
以降、
OpenVPNとeasy-rsaのインストールとサーバー証明書の作成
次にOpenVPNと、
openvpn$ sudo apt update openvpn$ sudo apt install openvpn easy-rsa
ルーティングモードのOpenVPNはtunデバイスを使用しますので。デバイスノードを作成しておきます。
openvpn$ sudo mkdir /dev/net openvpn$ sudo mknod /dev/net/tun c 10 200 openvpn$ sudo chmod 0666 /dev/net/tun
コンテナ上でデバイスノードを作成した場合、
lxc.cgroup.devices.allow = c 10:200 rwm
ただしubuntu、
次にUbuntuのドキュメントを参考に認証局の鍵と証明書を作成します。
openvpn$ sudo mkdir /etc/openvpn/easy-rsa/
openvpn$ sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
openvpn$ sudo editor /etc/openvpn/easy-rsa/vars
以下の値を適宜書き換え、KEY_ALTNAMESを追加する
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
export KEY_NAME="EasyRSA"
export KEY_CN="CommonName"
export KEY_ALTNAMES="EasyRSA"
openvpn$ sudo -s
openvpn# cd /etc/openvpn/easy-rsa/
openvpn# source vars
openvpn# ./clean-all
openvpn# ./build-ca
すべてEnterを入力
openvpn# exit
varsの設定は、
さらにOpenVPNサーバー用の証明書を作成し、
openvpn$ sudo -s
openvpn# cd /etc/openvpn/easy-rsa/
openvpn# source vars
openvpn# ./build-key-server サーバー名
基本的にEnterを押し、最後2つの署名を行うかどうかの確認でyと入力
openvpn# ./build-dh
openvpn# cp keys/サーバー名.crt keys/サーバー名.key keys/ca.crt keys/dh2048.pem /etc/openvpn/
openvpn# exit
最後から2つ目のコマンドで、
OpenVPNサーバーの設定
パッケージにある設定ファイルの雛形を元に、
openvpn$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
openvpn$ sudo gzip -d /etc/openvpn/server.conf.gz
openvpn$ sudo editor /etc/openvpn/server.conf
ca ca.crt
cert サーバー名.crt
key サーバー名.key
dh dh2048.pem
client-to-client
client-to-clientオプションは、
最後に、
openvpn$ sudo service openvpn start
openvpn$ ip addr show dev tun0
2: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft forever
OpenVPNでは、
正しく起動できているかどうかは、
Jun 13 23:30:25 openvpn ovpn-server[615]: Initialization Sequence Completed
ホスト側の設定
OpenVPNサーバーは、
具体的にはホスト上で以下のルールをiptablesに追加します。
$ sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE $ sudo iptables -t nat -A PREROUTING -p udp --dport 1194 -j DNAT --to 10.0.3.200:1194
このルールをホスト起動時に適用するようにしても良いのですが、
まず次のような設定ファイルを、
#!/bin/sh
# for OpenVPN
case $3 in
up)
iptables -w -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -w -t nat -A PREROUTING -p udp --dport 1194 -j DNAT --to 10.0.3.200:1194
;;
down)
iptables -w -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -w -t nat -D PREROUTING -p udp --dport 1194 -j DNAT --to 10.0.3.200:1194
;;
esac
POSTROUTING向けのルールは、
さらにスクリプトに実行権限を追加し、
$ sudo chmod a+x /var/lib/lxc/openvpn/iptables.sh
$ sudo editor /var/lib/lxc/openvpn/config
以下の2行を追加する
lxc.network.script.up = /var/lib/lxc/openvpn/iptables.sh
lxc.network.script.down = /var/lib/lxc/openvpn/iptables.sh
これでopenvpnコンテナ起動時にルールが追加され、
$ sudo lxc-stop -n openvpn $ sudo lxc-start -n openvpn $ sudo iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT udp -- anywhere anywhere udp dpt:openvpn to:10.0.3.200:1194 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 10.0.3.0/24 !10.0.3.0/24 MASQUERADE all -- 10.8.0.0/24 anywhere
ここまででOpenVPNサーバーの設定は完了です。
クライアント側の設定
次にOpenVPNクライアントの設定を行います。クライアントごとに以下の3つの作業が必要です。
- そのクライアント用のクライアント証明書と鍵を作成する
(OpenVPNサーバー上で行う) - クライアント証明書と鍵、
認証局の証明書を安全な方法でクライアントに移動する - クライアントの設定を行う
クライアント証明書の作成
今回の設定では、
openvpn$ sudo -s
openvpn# cd /etc/openvpn/easy-rsa/
openvpn# source vars
openvpn# ./build-key クライアント名
基本的にEnterを押し、最後二つの署名を行うかどうかの確認でyと入力
openvpn# tar zcvf クライアント名.tgz keys/クライアント名.crt keys/クライアント名.key keys/ca.crt
openvpn# rm keys/クライアント名.*
openvpn# exit
必要なのは証明書
この作業はクライアントの数だけ行います。以降はすべてclient.
LXCクライアントの設定
まずはLXCでクライアントコンテナを作成し、
次にこのコンテナ上にOpenVPNをインストールし、
openvpn-client$ sudo apt update openvpn-client$ sudo apt install openvpn openvpn-client$ sudo mkdir /dev/net openvpn-client$ sudo mknod /dev/net/tun c 10 200 openvpn-client$ sudo chmod 0666 /dev/net/tun
事前に作成しておいたクライアント用の証明書類
openvpn-client$ sudo tar xvf client.tgz -C /etc/openvpn/
クライアント用の設定ファイルを雛形から作成します。
openvpn-client$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
openvpn-client$ sudo editor /etc/openvpn/client.conf
remote myvps.example.com 1194
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
remoteには、
さらにiptablesの設定もしておきましょう。クライアント側は待ち受けはないので、
#!/bin/sh
# for OpenVPN
case $3 in
up)
iptables -w -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
;;
down)
iptables -w -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
;;
esac
さらにスクリプトに実行権限を追加し、
$ sudo chmod a+x /var/lib/lxc/openvpn-client/iptables.sh
$ sudo editor /var/lib/lxc/openvpn-client/config
以下の2行を追加する
lxc.network.script.up = /var/lib/lxc/openvpn-client/iptables.sh
lxc.network.script.down = /var/lib/lxc/openvpn-client/iptables.sh
最後にOpenVPNサービスを立ち上げましょう。
openvpn-client$ sudo service openvpn start
次のようにtun0に10.
openvpn-client$ ip addr show tun0
2: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.8.0.10 peer 10.8.0.9/32 scope global tun0
valid_lft forever preferred_lft forever
openvpn-client$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=107 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=100 ms
...
もしアドレスが割り当てられない、
ovpn-server[615]: AA.BB.CC.DD:23730 TLS: Initial packet from [AF_INET]AA.BB.CC.DD:23730, sid=1d1cec97 357177c6
(中略)
ovpn-server[615]: client5/AA.BB.CC.DD:23730 SENT CONTROL [client5]: 'PUSH_REPLY,route 10.8.0.0 255.255.255.0,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.18 10.8.0.17' (status=1)
もしこの間にエラーが表示されているようなら、
とくに今回はホストからLXCゲストへとNATでつなげているので、
デスクトップクライアントの設定
デスクトップ版のUbuntuに最初からインストールされているネットワーク管理ツールであるNetworkManagerには、
最初にデスクトップ上にOpenVPNプラグインをインストールし、
$ sudo apt install network-manager-openvpn $ sudo restart network-manager
画面右上のネットワークインジケーターの
GatewayにはOpenVPNサーバーのアドレス、
さらに
次にIPv4設定タブに移動し、
最後に
OpenVPNサーバーへの接続は、
Androidクライアントの設定
Androidには公式のOpenVPNクライアントである
client.
接続に成功したらIPv4アドレスが割り当てられています。前述のデスクトップやLXCクライアントも動作済みであれば、
WebDAVサービスの設定
ここまでで、
次にホームサーバー上のopenvpn-clientコンテナに、
nginxとWevDAVの導入
WebDAVはHTTPサーバーに拡張を追加することで導入できます。今回はnginxを使ってみます。nginxは本体にもWebDAV機能は実装されているのですが、
openvpn-client$ sudo apt install nginx-extras
次に必要なディレクトリを作成し、
openvpn-client$ sudo mkdir -p /var/www/webdav
openvpn-client$ sudo chown -R www-data: /var/www
openvpn-client$ sudo editor /etc/nginx/sites-available/webdav
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /var/www/webdav;
charset utf-8;
autoindex on;
allow 10.8.0.0/24;
deny all;
location / {
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
dav_access user:rw group:rw all:r;
client_body_temp_path /tmp/webdav;
create_full_put_path on;
}
}
openvpn-client$ sudo rm /etc/nginx/sites-enabled/default
openvpn-client$ cd /etc/nginx/sites-enabled/
openvpn-client$ sudo ln -s ../sites-available/webdav
client_
今回はドキュメントルートをWebDAVのルートに設定するために、
最後にconfigtestで設定ファイルをテストし、
openvpn-client$ sudo service nginx configtest openvpn-client$ sudo service nginx reload
WebDAVのテスト
WebDAVが動作しているかcURLでテストしてみましょう。
openvpn-client$ curl -T - http://10.8.0.2/matsuya.json <<END
{ hash: '#matsuyanow' }
END
openvpn-client$ curl http://10.8.0.2/matsuya.json
{ hash: '#matsuyanow' }
openvpn-client$ curl -X MKCOL http://10.8.0.2/matsuya/
openvpn-client$ curl -X MOVE --header 'Destination: http://10.8.0.2/matsuya/matsuya.json' \
http://10.8.0.2/matsuya.json
openvpn-client$ curl -X PROPFIND http://10.8.0.2/matsuya/ -H "Depth: 1" \
-d '<?xml version="1.0"?><a:propfind xmlns:a="DAV:"><a:prop><a:resourcetype/></a:prop></a:propfind>'
もちろん表示されているファイルはIntentで他のアプリから閲覧できます。写真フォルダーをフォトビューワーでギャラリー表示して編集したり、
ホストディスクのマウント
ホストのディスクをコンテナにbind mountしておけば、
/var/www/webdav var/www/webdav none bind,create=dir
これにより、
もしコンテナ内部で、
$ sudo cp /etc/apparmor.d/lxc/lxc-{default,openvpn-container}
$ sudo editor /etc/apparmor.d/lxc/lxc-openvpn-container
profile lxc-openvpn-container flags=(attach_disconnected,mediate_deleted) {
(上のプロファイル名を変更)
(中略)
(以下の4行を追加)
mount fstype=nfs,
mount fstype=nfs4,
mount fstype=rpc_pipefs,
mount fstype=ext*,
$ sudo apparmor_parser --replace /etc/apparmor.d/lxc-containers
$ sudo editor /var/lib/lxc/openvpn-client/config
(以下の2行を追加)
# Allow mount nfs and ext file systems
lxc.aa_profile = lxc-openvpn-container
これでopenvpn-clientコンテナを再起動すれば、
DockerやJujuでも
LXCを使うといろんなものをコンテナの中に閉じ込めることができます。いざとなれば/var/
今はやりのDockerはLXCと同じように、
デプロイと言えば、