Raspberry piでWebDavサーバを立ててどこからでも使えるファイルサーバを設定する

はじめに

自前のファイルサーバを作って家の外からでもアクセスができるようにしたい。

google driveとかのオンラインストレージでもいいんだけども、使い勝手とか、容量制限とか、情報管理だとか。。。

ということで、自宅でWebDavを使ってファイルサーバを立てよう。

材料

  • Raspberry pi zero WH: zeroでなくてもよいのだけれども、消費電力が少ないので。電源やらMicroSDやらUSBの変換やらも。
  • Elecom EDC-FUA2H-B: USBハブとLANアダプタが一体となったもの。これでなくてもよいし、無線でつないでもよいのかも
  • Buffalo SSD-PGM480U3-B: 消費電力の点からSSDにした。もちろん、これでなくてよい

設定

OSのインストール

普通にRaspbian 2019-09-26のliteをインストール。 起動したら

sudo raspi-config

sshを有効に、timezone等を設定する。

ip addr

IPアドレスを確認したらあとはsshで作業すればよい。

アップデート&必要なソフトのインストール

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install  gdisk xfslibs-dev \
apache2 libapache2-mod-encoding certbot nmap dnsutils

固定IPの設定

/etc/dhcpcd.confの

# Example static IP configuration:

以降の行を参考に固定IPを設定する。 static routersとstatic domain_name_serversは環境によって違うと思うが、 同じネットワークにつながっているwindowsPCのコマンドプロンプト

ipconfig /all

で確認できると思う。自分の場合は、

# Example static IP configuration:
interface eth0
static ip_address=192.168.1.101/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

のように設定した。101の番号はたぶん、254より小さいある程度大きい数を設定すれば大丈夫なことが多い (本当はルーターDHCP割り当てになっていない番号にする)。

SSDのフォーマットとマウント

パーティションの設定

ls /dev/disk/by-id/とかlsblkとかでSSDの名前を特定する。 /dev/disk/by-id/usb-BUFFALO_SSD-PGU3-A_0040501491102559-0:0なら、

sudo gdisk /dev/disk/by-id/usb-BUFFALO_SSD-PGU3-A_0040501491102559-0:0

でgdiskを起動してパーティションを設定する。 ?でヘルプが表示される。oで、新しいパーティションテーブルを作成する。 基本的にディフォルトどおり、全領域を使った8300 Linux filesystemのパーティションを作成すればよい。

フォーマット

/dev/disk/by-id/usb-BUFFALO_SSD-PGU3-A_0040501491102559-0:0-part1などが作られたら フォーマットする。

mkfs.xfs /dev/disk/by-id/usb-BUFFALO_SSD-PGU3-A_0040501491102559-0:0-part1

xfsでなくてもよい

マウント

/etc/fstabに

/dev/disk/by-id/usb-BUFFALO_SSD-PGU3-A_0040501491102559-0:0-part1 /share xfs defaults,nofail 0 0

を記述。/shareはマウント先なので好きなディレクトリ名にする。 nofailがないと起動時にこのSSDが見つからないとき起動しない。

sudo mkdir /share
sudo mount -a

dfコマンドでマウントできているか確認する。

Webサーバの設定

とりあえず起動

sudo apache2ctl configtest # 設定ファイルのチェック
sudo systemctl restart apache2
sudo systemctl enable apache2

でサービスを起動。同じネットワークにつながっているWindowsPCなどのブラウザから http://192.168.1.101/ で接続を確認する。

ルータの設定

プロバイダごとに使っているルータが異なるので、設定方法はそれぞれであるが、 とりあえず、先に確認したゲートウェイIPアドレスに対して、 http://192.168.1.1 などと接続すれば設定画面に行くことが多い。 型番からマニュアルを探して初期パスワードを入れる。 外部からの80番ポートの接続を192.168.1.101番の80番へ転送する設定をする。 このとき、グローバルIPアドレスまたはFQD名も調べる。 自分の場合は、abcde.tkyc123.ap.nuro.jpのような形式であった。

スマホwifiをoffにして、外からFQDNに接続して見られるか確認する。 http://abcde.tkyc123.ap.nuro.jp/

httpsの設定

ファイルをやり取りするときには通信を暗号化しておいた方がよい。 暗号化通信を行うときには認証局に登録する必要がある。 無料で利用できるletsencryptを使わせてもらう。

sudo certbot certonly --webroot -w /var/www/html/ -d abcde.tkyc123.ap.nuro.jp

メールアドレスを入力して質問に答えると、/etc/letsencrypt/live/の下に鍵ファイルが生成される。

apacheの設定をする。

cd /etc/apache2/sites-enabled/
sudo ln -s ../sites-available/default-ssl.conf
sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.orig

/etc/apache2/sites-enabled/default-ssl.confの鍵ファイル設定部分を書き換える

          SSLCertificateFile /etc/letsencrypt/live/fp7cdbcf49.tkyc627.ap.nuro.jp/cert.pem
          SSLCertificateKeyFile /etc/letsencrypt/live/fp7cdbcf49.tkyc627.ap.nuro.jp/privkey.pem
          SSLCertificateChainFile /etc/letsencrypt/live/fp7cdbcf49.tkyc627.ap.nuro.jp/chain.pem

起動

sudo a2enmod ssl
sudo apache2ctl configtest
sudo systemctl restart apache2

httpsで接続できるか確認する。 ルータも443番を先ほどと同様に設定する。

httpでつないだ時にhttpsに転送する。

vi /etc/apache2/sites-enabled/000-default.conf の中に

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

を追加。

sudo a2enmod rewrite
sudo systemctl restart apache2

httpでつないでhttpsに転送されるか確認する。

WevDavディレクトリの設定

http://abcde.tkyc123.ap.nuro.jp/e3davで接続できるようにする。 万が一のため、/davだと推測されて攻撃対象になることもあるかもしれないので、少し名前を変えた。 実体は/share/davとする。

default-ssl.confのVirtualHostのタグ内に

Alias /e3dav /share/dav
<Directory /share/dav>
                        Options Indexes FollowSymLinks
                        AllowOverride None
                        AuthType Digest
                        AuthName davzone
                        AuthUserFile /etc/apache2/htdigest
                        Order deny,allow
                        Require valid-user
                </Directory>

を追加。

digest認証ファイルを作成

sudo htdigest -c /etc/apache2/htdigest davzone username

とすると、パスワードを聞かれるので入力する。 davzoneは先ほどのAuthNameと一致させる。usernameは適当なユーザ名にする。

apacheを再起動してブラウザからダイジェスト認証で接続できるか確認する。 このときはダウンロードしかできない。

Webdavの設定

default-ssl.confのDirectoryのタグ内に

DAV On

を追加。

作成したファイルの所有者がapacheを動かしているユーザ(www-data)になってしまう。 www-dataに書き込み権限を与えてもよいが、一般ユーザでapacheを動かすことにする。 /etc/apache2/envvarsで

#export APACHE_RUN_USER=www-data
#export APACHE_RUN_GROUP=www-data
export APACHE_RUN_USER=pi
export APACHE_RUN_GROUP=pi

起動

sudo a2enmod dav
sudo a2enmod dav_fs
sudo systemctl restart apache2

WindowsエクスプローラのPCからコンピュータ、ネットワークドライブの割り当て、 https://abcde.tkyc123.ap.nuro.jp/e3dav/ で接続できるか確認する。

スマホからはWebDav Nav liteなどをインストール。 ブラウザからはダウンロードのみ(たぶん)。