Linux一覧

Ubuntu 16.04でKVM仮想マシンからブリッジを通る通信のNetfilterをオフにする設定

全部Ubuntuマニュアルのsysctl.dディレクトリについてのページで書いてあることそのままだけど、sysctl.dの設定方法の一例として説明されているので気づくのに時間かかった。
試してはいませんが、マニュアルを見る限りubuntu 12.04以降で有効な設定みたい。

設定方法


以下2つの内容の設定ファイルを作成する。

/etc/udev/rules.d/99-bridge.rules

ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", \
RUN+="/lib/systemd/systemd-sysctl --prefix=/net/bridge"

/etc/sysctl.d/bridge.conf

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

これでbr_netfilterモジュールが読み込まれたときにbridge.confの設定が適用されます。
設定を有効にするには再起動が必要になるので注意が必要です。

こちらでは紹介しませんが、マニュアルにはモジュールの強制読み込みと一緒に設定を適用する方法も書いてあります。

上記設定にたどり着いた理由とか


Netfilterをオフにしない場合どう見えるか

意識して制御していなければ、おそらく以下の図のようになります。

仮想ブリッジ上でtcpdumpを取ると、仮想マシン/端末の双方から送ったパケットが見えますが、その先には届きません。

/etc/sysctl.confまたは/etc/ufw/sysctl.confに設定を記述する方法

以下のファイルに設定を入れる方法も試しましたが、起動時に設定適用されなかった。

  • /etc/sysctl.conf
  • /etc/ufw/sysctl.conf

ついでに書くと、/etc/sysctl.d/以下にただ設定ファイルを作るだけというのもうまくいかなかった。

/etc/sysctl.confに設定を入れて起動時にsysctl -pする方法

inidやsystemctldで[sysctl -p]を実行するようにしても以下のエラーが出て適用できなかった。
このため、モジュールの読み込みタイミングより前に設定適用してしまっていると推測している。

Apr 23 00:12:29 server systemd-sysctl[397]: Couldn’t write ‘0’ to ‘net/bridge/bridge-nf-call-iptables’, ignoring: No such file or directory


rcloneでAmazonCloudDriveにデータを暗号化して同期する


2017/6/4
RcloneのAmazonCloudDrive接続がClientIDが無効になったことによりできなくなっています。
https://forum.rclone.org/t/rclone-has-been-banned-from-amazon-drive/2314

rcloneが暗号化に対応したと聞いて試してみた。

やること

rcloneを使用してローカルのファイルをAmazonCloudDriveと同期する。
rcloneの機能でAmazonCloudDrive上にデータをアップロードする際は暗号化し、ダウンロードする際は復号化する。

暗号化の必要性

Amazon Cloud Drive利用規約を読むと、アマゾンがファイルにアクセスすることもありうる内容になっている。
私がアヘ顔ダブルピースしているホームビデオを見られる可能性があると困るため、暗号化してファイルを置くことが必須となる。

確認環境

ローカル側
– Ubuntu 16.04
– rclone v1.35
– Windows10(認証用)

リモート側
– Amazon Cloud Drive(プライム会員の5GB)

手順

手順は以下を参考にした。
https://www.reddit.com/r/DataHoarder/comments/598pb2/tutorial_how_to_make_an_encrypted_acd_backup_on/

Ubuntuへのrcloneインストール

ほぼ公式に書いてある手順と同一。

mkdir -p ~/work/rclone
cd ~/work/rclone

sudo apt install unzip

curl -O http://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
cd rclone-*-linux-amd64

sudo cp rclone /usr/sbin/
sudo chown root:root /usr/sbin/rclone
sudo chmod 755 /usr/sbin/rclone

sudo mkdir -p /usr/local/share/man/man1
sudo cp rclone.1 /usr/local/share/man/man1/
sudo mandb

rcloneにAmazonCloudDriveを設定

実行ユーザ毎に設定が作られる。
途中で入力するトークンは後述の方法で入手した。

$ rclone config
2017/--/-- --:--:-- Config file "/home/test/.rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n <-新規に設定を作成
name> ACD <-設定の名前をつける
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Amazon Drive
   \ "amazon cloud drive"
 2 / Amazon S3 (also Dreamhost, Ceph, Minio)
   \ "s3"
 3 / Backblaze B2
   \ "b2"
 4 / Dropbox
   \ "dropbox"
 5 / Encrypt/Decrypt a remote
   \ "crypt"
 6 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
 7 / Google Drive
   \ "drive"
 8 / Hubic
   \ "hubic"
 9 / Local Disk
   \ "local"
10 / Microsoft OneDrive
   \ "onedrive"
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
12 / Yandex Disk
   \ "yandex"
Storage> 1 <-AmazonCloudDriveを使うので1
Amazon Application Client Id - leave blank normally.
client_id> <-空Enter
Amazon Application Client Secret - leave blank normally.
client_secret> <-空Enter
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n <-確認したのがブラウザが開けない環境だったので、nで進めた
For this to work, you will need rclone available on a machine that has a web browser available.
Execute the following on your machine:
        rclone authorize "amazon cloud drive"
Then paste the result below:
result> *** <-後述の方法で入手したトークンを貼り付け
--------------------
[ACD]
client_id =
client_secret =
token = ****
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y <-設定完了
Current remotes:

Name                 Type
====                 ====
ACD                  amazon cloud drive

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q> q <-一旦終了

認証を別端末のWindows10で行う

rcloneのWindows版をダウンロードしてきて、コマンドプロンプトで以下を実施。
途中でブラウザからアマゾンの認証画面が開かれるので、ログインする。

C:\test>rclone authorize "amazon cloud drive"
2017/--/-- --:--:-- Config file "C:\\Users\\test/.rclone.conf" not found - using defaults
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Paste the following into your remote machine --->
**** <-ここに表示されるのがトークン
<---End paste

rcloneに暗号化するディレクトリを設定

AmazonCloudDrive上で暗号化するため必要な設定をする。

$ rclone config
Current remotes:

Name                 Type
====                 ====
ACD                  amazon cloud drive

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q> n <-設定を作成
name> ACD_crypt <-設定に名前をつける
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Amazon Drive
   \ "amazon cloud drive"
 2 / Amazon S3 (also Dreamhost, Ceph, Minio)
   \ "s3"
 3 / Backblaze B2
   \ "b2"
 4 / Dropbox
   \ "dropbox"
 5 / Encrypt/Decrypt a remote
   \ "crypt"
 6 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
 7 / Google Drive
   \ "drive"
 8 / Hubic
   \ "hubic"
 9 / Local Disk
   \ "local"
10 / Microsoft OneDrive
   \ "onedrive"
11 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
12 / Yandex Disk
   \ "yandex"
Storage> 5 <-暗号化設定なので5
Remote to encrypt/decrypt.
Normally should contain a ':' and a path, eg "myremote:path/to/dir",
"myremote:bucket" or maybe "myremote:" (not recommended).
remote> ACD:/DataBackup/ <- 設定ディレクトリ(書き方は後述)
How to encrypt the filenames.
Choose a number from below, or type in your own value
 1 / Don't encrypt the file names.  Adds a ".bin" extension only.
   \ "off"
 2 / Encrypt the filenames see the docs for the details.
   \ "standard"
filename_encryption> 2 <-ファイル名の暗号化をする場合は2
Password or pass phrase for encryption.
y) Yes type in my own password
g) Generate random password
y/g> g <-暗号化パスワードを自動生成
Password strength in bits.
64 is just about memorable
128 is secure
1024 is the maximum
Bits> 128
Your password is: dw37uhP1Dl56Fhr8DYuZjg
Use this password?
y) Yes
n) No
y/n> y <-暗号化パスワードを承認
Password or pass phrase for salt. Optional but recommended.
Should be different to the previous password.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank
y/g/n> g <-暗号化のソルトを自動生成
Password strength in bits.
64 is just about memorable
128 is secure
1024 is the maximum
Bits> 128
Your password is: 8UubLhAxmfQc1Cvs3UbuQw
Use this password?
y) Yes
n) No
y/n> y <-暗号化のソルトを承認
Remote config
--------------------
[ACD_crypt]
remote = ACD:/DataBackup/
filename_encryption = standard
password = *** ENCRYPTED ***
password2 = *** ENCRYPTED ***
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y <-設定に問題なければy
Current remotes:

Name                 Type
====                 ====
ACD                  amazon cloud drive
ACD_crypt            crypt

e) Edit existing remote
n) New remote
d) Delete remote
s) Set configuration password
q) Quit config
e/n/d/s/q> q <-設定ウィザードを終了

設定ディレクトリの書き方

(クラウドストレージの設定名):(ディレクトリ)
なので、上述の設定ではAmazonCloudDrive上のDataBackupディレクトリ内に暗号化したファイルを置く設定となる。

ルートに暗号化したデータを置く場合は以下の例のようにディレクトリを空にするらしい?(未検証)
– ACD:

ファイルを暗号化/復号化して同期

ローカルからAmazonCloudDriveに暗号化して同期

ローカルの/dataディレクトリからAmazonCloudDriveの/DataBackupディレクトリに同期する場合。

rclone sync /data ACD_crypt:/DataBackup/

こんな感じに暗号化されたファイル/ディレクトリができる。

AmazonCloudDriveからローカルに復号化して同期

AmazonCloudDriveの/DataBackupディレクトリからローカルの/dataディレクトリに同期する場合。

rclone sync ACD_crypt:/DataBackup/ /data

その他

  • Linuxのrcloneでアップロードしたファイルを、Windowsのrcloneで暗号化パスワードとソルトを同一にしてダウンロードすることもできた。
  • 以前にEncFSを使用して暗号化する方法も検討していたのですが、暗号化したファイルを一時的にでもローカルに置く必要がある点がネックになってました。rcloneだけでできればシンプルで便利。
  • ACDだとファイルとフォルダの名前は半角で255文字以内である必要があるのですが、ファイル名/フォルダ名の暗号化により文字数が増えて制限を超える可能性もあります。制限を超えると、rclone実行時に「failed to satisfy constraint: Member must have length less than or equal to 280」というエラーが出るかもしれません。

Ubuntu16.04にnginx-rtmp-moduleを入れてRTMP配信をする

最終的にストリーミングキーにパスワードを入れる簡易認証について書くのですが、全て一つの投稿にすると長くなるのでまずは前段の環境構築から。
[追記] RTMPSできないと中間者攻撃対策できなくて、nginx-rtmp-moduleで対応していないということもあり一旦保留。

RTMPについて


ストリーミングでデータをやり取りするためのプロトコルで、ここでは映像をライブストリーミング(生放送)するために使用する。
通常利用するポートはTCP 1935番。

NginxでRTMPを扱うためのモジュールが公開されており、ソースに追加してMakeすることで利用可能。

確認環境


  • ubuntu 16.04

インストール手順


必要パッケージのインストール

makeするために必要なものを一通り準備。

sudo aptitude install build-essential libpcre3 libpcre3-dev libssl-dev unzip

Nginxのソースとrtmpモジュールをダウンロードしてmake/install

mkdir -p ~/work/nginx
cd ~/work/nginx

wget http://nginx.org/download/nginx-1.11.7.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

tar -zxvf nginx-1.11.7.tar.gz
unzip master.zip

cd nginx-1.11.7/

./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --add-module=../nginx-rtmp-module-master

make
sudo make install

サーバ起動時に自動起動するためSystemdにサービスとして登録

sudo vi /lib/systemd/system/nginx.service

/lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Nginxの設定

RTMPと、テスト用のプレーヤーページを用意。

sudo vi /usr/local/nginx/conf/nginx.conf

/usr/local/nginx/conf/nginx.conf

worker_processes  1;

user  www-data www-data;
pid        /run/nginx.pid;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;

        application app {
            live on;
            record off;
        }
    }
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen 80;
        server_name  localhost;
        #デフォルトのルートディレクトリは /usr/local/nginx/html
        #変えるのめんどいのでそのまま使う
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        index index.html index.htm;
    }
}

テスト用のプレーヤーページを作成

テストなのでCDNのvideo.jsを利用させていただき簡易的に作る。

sudo vi /usr/local/nginx/html/live.html

/usr/local/nginx/html/live.html

<!DOCTYPE html>
<html lang="en" class="">
<head>
    <title>Test Live</title>
    <link href="//vjs.zencdn.net/5.11/video-js.min.css" rel="stylesheet">
    <script src="//vjs.zencdn.net/5.11/video.min.js"></script>
</head>
<body>
    <video id="player" class="video-js vjs-default-skin" height="450" width="800" controls autoplay preload="auto">
        <source src="rtmp://(サーバのIP or ドメイン)/app/StreamKey" type='rtmp/mp4' />
    </video>
    <script>
        var player = videojs('#player');
    </script>
</body>
</html>

一応、所有者を変更しておく。

sudo chown www-data:www-data /usr/local/nginx/html/live.html

Nginxの起動と自動起動設定

sudo systemctl start nginx.service
sudo systemctl enable nginx.service

OBSで配信する際のURL指定


OBSClassicを使う場合は以下の値をいい感じに設定。

設定 -> 放送設定
FMS URL : rtmp://192.168.30.16/app
プレイパス/ストリームキー : StreamKey

使用方法は別途調べてください。

視聴


HTML5が見れるWEBブラウザで以下を開く。

http://(サーバのIP or ドメイン)/live.html

もちろん、配信していないと何も再生されないので注意。


Pydio 6.0のインストールと、ワークスペース開くときのエラー回避

ファイル同期&共有Webサービスを自前のサーバで建てられるオープンソースのPydioが便利そうなので使ってみてる。
今のところ、ファイル共有用途として自宅サーバでPydio、さくらVPSでOwnCloudを動かしているので、時間ができたら使用感の比較もしてみたい。

再構築する可能性が高いので、インストール手順と、実際に使用するときのエラー(不具合?)回避について残しておく。

試験環境はCentOS 6.5で、apacheのインストールから行う手順とし、せっかくPydioなのでSQLiteを使ってSQLサーバいらずの構築を行う。

インストールはそれほど苦もなくできたが、多分ブラウザ側処理に起因する思われる不具合で結構ハマった。 続きを読む