OpenVPNのオプションについて

OS: Ubuntu Server 16.04
OpenVPN 2.4.5

設定に使用したオプションが一体どういう意味を持つのか今ひとつ呑み込めていないけれども調べた結果をひとまず記録しておくものである。

オプション 内容
port OpenVPNの待受ポート番号を指定。デフォルトは1194。バージョンが2.00-beta17よりも古いOpenVPNはデフォルトが5000。
proto 通信プロトコルを指定。デフォルトはudp。他にtcp-client、tcp-serverの選択肢もある様子であった。
dev 仮想ネットワークデバイスを指定。tunX、tapX、nullから選択。Xはだいたい数値が入るものと思われるけれども省略可能であった。tunはL3、tapはL2。
ca 認証局の証明書(ルート証明書)を指定。
cert サーバ証明書を指定。caで指定した認証局によって署名されたものでなければいけない。
key サーバの秘密鍵を指定。certで指定した証明書とキーペアになるものでなければいけない。
dh Diffie Hellmanパラメータを含むファイルを指定。noneを指定するとDiffie Hellman鍵交換はやめにして楕円曲線Diffie-Hellman鍵共有(ECDH)だけ使う。
tls-auth HMACキーファイルを指定。ファイル名のあとに指定する数値はサーバ側では0、クライアント側では1がよいようである。

server クライアントに割り当てるIPアドレスの範囲をネットワークとネットマスクで指定。server 10.8.0.0 255.255.255.0などと簡単に指定できるけれどもネットワークデバイスがTUNとTAPのどちらであるか、またtopologyの設定は如何なるものかなどによって心持ち挙動が異なってくるようである。
push pushで指定したオプションにせよとサーバーからクライアントに対して伝える。オプションはダブルクオートで括られていないといけない。routeの設定などは各クライアント毎にいちいち書くのは大変なことなのでこのオプションがたいへん役に立つ。
compress VPNでのやりとりするデータを圧縮するのに使用するアルゴリズムを選択する。lzo、lz4または何も指定しない。と説明書に書いてあるけれどもOpenVPN2.4以上であればlv4-v2というものも選択できるようである。lzoよりもlz4-v2のほうがCPUへの負担が小さくてよいという。サンプルの設定ファイルにはlz4-v2が記載されているけれども説明書にはまだ反映されていない模様である。

client-to-client これを有効にするとクライアント同士でのやり取りができるようになる。デフォルトは無効でクライアントはVPNサーバしか見えない。
keepalive pingを放ち接続の死活監視して指定時間を超えてタイムアウトしたら再接続を行う。ping、ping-restartを組み合わせたオプションということであろうと思う。2つの引数を取り、1つ目はpingを送る間隔を秒で指定する。2つ目はタイムアウトとみなす時間を秒で指定する。なおサーバ側では指定した秒の2倍だけタイムアウトするまで待つ。サーバ、クライアント共にこのオプションを使用できるけれども普通はサーバ側にだけ設定しておけば概ねよいようである。サーバにもクライアントにも設定されていたらサーバ側の設定で上書きされるという。
cipher やり取りの際に使用する暗号化のアルゴリズムを指定する。デフォルトはBF-CBCであるけれどもこれは攻撃に弱い様子である。またOpenVPN2.6で削除される予定であるから使わないほうがよいようである。openvpn --show-ciphersコマンドを実行すれば使用できるアルゴリズムがあらわれる。今どきはAES-256-GCMやAES-128-GCMを選択するのが良さそうである。

ncp-ciphers 暗号化に使用するアルゴリズムをどうするかサーバとクライアントでやり取りする際に、ここで指定したものから選択する。コロンで区切って複数指定することができる。デフォルトはAES-256-GCM:AES-128-GCM。双方で使用するアルゴリズムが合意に達するとcipherオプションで指定したものよりこちらが優先される仕組みであった。
tls-version-min TLSのバージョンが此れを下回ると受け入れない。デフォルトは1.0である。他には1.1と1.2が現在のところ選択できる。
tls-cipher TLS接続で使用する暗号化のアルゴリズムを指定する。openvpn --show-tlsでサポートされているアルゴリズムが一覧できる。エキスパート向けの設定であるようであるからうっかり無闇に触ることは大変危険な行為である旨、記載されていた。

But it is also easy to unwittingly use it to carefully align a gun with your foot, or just break your connection. Use
with care!

user OpenVPNプロセスの実行ユーザを指定。
group OpenVPNプロセスの実行グループを指定。
persist-key OpenVPNに再起動が発生しても鍵ファイルを再読込しないようにする。それというのも起動時はroot権限で鍵ファイルを読みにゆけるけれどもそのあとはuserで指定した権限に降格となるから普通、鍵ファイルは読み取れなくなってしまう。そうすると再起動時にたいへん困るから最初に読み込んだ鍵ファイルをそのままキープしておこうという算段のようである。
persist-tun OpenVPNの再起動が発生してもTUN/TAPデバイスを閉じて再度開くことをしないようである。
status OpenVPNサーバに接続しているクライアントやルーティングテーブルの様子を記録するファイルを指定する。デフォルトでは60秒ごとに更新されてゆく。ファイル名のあとに数値を指定すると更新間隔を変更できる。単位は秒である。

log-append OpenVPNのログを記録するファイルを指定する。毎回ファイルがクリアされて新規に記録されるlogオプションと異なって、log-appendはログがどんどん追記されてゆく。
ifconfig-pool-persist 接続しているクライアントのコモンネームと割り当てられたIPアドレスが記録される。というわけではないようである。過去に紐付けられたコモンネームとIPアドレスに基づいて、提案としてだけOpenVPNに扱われるとあるけれども何だかわからない。読み解く力の乏しさが悔やまれる。コモンネームとIPアドレスの紐づけを見るならstatusで指定したファイルで良いと思った。

$ sudo cat /var/log/ipp.txt
guro,10.8.0.4
gero,10.8.0.8
verb 出力するログの冗長さを0~11で指定。0は致命的なエラーを除いてまったくログを出力せず、数値が大きくなるに連れて冗長さが増す。3か4くらいがちょうどよい程度であった。5を超えるとパケットの読み書きが発生するたびにr、w、R、Wの文字が記録される。rwはTUN/TAPパケットを表し、RWはTCP/UDPパケットをあらわすという。ログがべらぼうに見づらくなったので無闇に設定するものじゃないと思った。

参考:
man openvpn
Openvpn2.4 ManPage

OpenVPNサーバを構築する

OS: Ubuntu Server 16.04
OpenVPN 2.4.5
easy-rsa v3.0.5

高度で複雑な仕組みと専門用語におそれをなして及び腰になってしまってから数年間ペンディングしていたOpenVPNの導入であるけれども世論の高まりを受けていよいよ実施するから記録を残しておくものである。まずはソースをダウンロードする。

$ wget -c https://swupdate.openvpn.org/community/releases/openvpn-2.4.5.tar.gz
$ wget -c https://swupdate.openvpn.org/community/releases/openvpn-2.4.5.tar.gz.asc

$ gpg --recv-key AF131CAE
$ gpg --verify openvpn-2.4.5.tar.gz.asc

$ tar zxvf openvpn-2.4.5.tar.gz
$ cd openvpn-2.4.5/

configureを実施する前に必要なパッケージを準備しておかねばならない。さもなくば立て続けにエラーメッセージを頂戴して終いである。なおUbuntu Server 18.04のベータ版では「configure: error: route utility is required but missing」と表示されたのでnet-toolsを要するようであった。iproute2への移行が進んでいることを感ずる。

メッセージ 必要なパッケージ
usable LZ4 library or header not found,
using version in src/compat/compat-lz4.*
liblz4-dev
openssl check failed libssl-dev
lzo enabled but missing liblzo2-dev
libpam required but missing libpam0g-dev
route utility is required but missing net-tools
$ sudo apt install libssl-dev liblz4-dev liblzo2-dev libpam0g-dev
$ ./configure
$ make
$ sudo make install

次はeasy-rsaを用意する。此れで以って認証局を構築したりサーバ、クライアントの証明書や秘密鍵を作成してゆくようである。

$ cd ..
$ wget -c https://github.com/OpenVPN/easy-rsa/archive/v3.0.5.zip -O easy-rsa-v3.0.5.zip
$ unzip -x easy-rsa-v3.0.5.zip
$ cd easy-rsa-3.0.5/easyrsa3/

事始めにinit-pkiコマンドによってpkiディレクトリとprivate、reqsサブディレクトリを作成する。

$ ./easyrsa init-pki

認証局の構築

OpenVPNサーバとは別のマシンに認証局を構築するのがほんとうのところであるとの事であったが、余分に割くリソースがちょっとないのでやむなく同じマシンに作り上げるものである。認証局のパスフレーズをここで定めるのであるが、これを忘れると証明書の発行に差し障りがでるので大切に管理しなければならない。

$ ./easyrsa build-ca
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
(snip)

/etc/openvpnディレクトリを作成してここへOpenVPNに関連するファイルや設定ファイルを放り込んでゆく方針にする。先ずはさきに作成した認証局の証明書をコピーする。

$ sudo mkdir /etc/openvpn
$ sudo cp pki/ca.crt /etc/openvpn/

サーバの証明書と秘密鍵作成

サーバの証明書と秘密鍵をこさえる。./easyrsa build-server-full server nopassのserverの箇所はファイル名となるもののようである。例えばここをopenvpnに変更すればopenvpn.keyとopenvpn.crtが出来上がるというわけである。nopassはサーバの秘密鍵を暗号化せずに運用するものである。暗号化するとOpenVPN起動のたびにパスフレーズを入力する必要に迫られる。

$ ./easyrsa build-server-full server nopass
(snip)
Enter pass phrase for /home/guro/src/openvpn/easy-rsa-3.0.5/easyrsa3/pki/private/ca.key:

$ sudo cp pki/issued/server.crt pki/private/server.key /etc/openvpn/

作成には認証局のパスフレーズが問われるので正確に入力する。これを間違えるとエラーが出て終いであるが、改めて作成を試みると前回の証明書署名要求ファイルと秘密鍵が置き去りのままである為に「Request file already exists.」というエラーメッセージが現れて先へ進まないからこれらを削除してしまうのが良いようである。

$ rm pki/reqs/server.req pki/private/server.key

Diffie-Hellmanパラメータの生成

一体どういうパラメータなのかちょっと知れないが前方秘匿性という性質で以って持て囃されているようである。マシンパワーもさることながら巡り合わせによってはまことに暇のかかる処理であるから、コマンドを実行したらしばらくお茶にでも出掛けるのが良かろうと思う。

$ ./easyrsa gen-dh
$ sudo cp pki/dh.pem /etc/openvpn/

中身をつぶさに見てゆくならこうである。2048bitもの巨大な素数primeとgeneratorが鍵交換のために使われるようである。これらの値は悪いやつに知られてしまっても構わないようである。

$ sudo openssl dh -text -in /etc/openvpn/dh.pem
    DH Parameters: (2048 bit)
        prime:
            00:fd:fe:1c:09:f4:03:49:3e:69:e5:45:4a:51:ff:
            7f:2b:c9:3b:59:18:e0:7e:86:79:e8:d6:09:15:3a:
            dc:8e:27:7f:f2:6b:e1:08:21:33:ba:71:4e:54:d3:
(snip)
            05:c5:b0:e3:ef:1b:1b:d0:58:1e:bc:88:8f:4e:be:
            f9:3f:2e:45:d7:7e:0e:e4:5e:80:e6:3e:d1:9c:d8:
            d9:fd:5b:a7:10:2a:d9:9f:f3:c2:45:a7:48:a6:0d:
            7c:4b
        generator: 2 (0x2)

HMACキーの作成

HMACとはHash-based Message Authentication Codeの略称のようである。大変長い。目がまわる。これはUDPポートフラッディング攻撃のようなDoS攻撃などを未然に防ぐために役立つようである。

$ sudo openvpn --genkey --secret /etc/openvpn/ta.key

設定ファイルの編集

サンプルの設定ファイルが準備されているのでこれをコピーし、環境に合わせて設定を施してゆくのが良かろうと思う。

$ cd ../../openvpn-2.4.5/sample/sample-config-files/
$ sudo cp server.conf /etc/openvpn/

多くの設定項目があるので大変難儀したけれども概ねこういう具合に落ち着いた。

$ sudo vi /etc/openvpn/server.conf
port                  1194
proto                 udp
dev                   tun
ca                    /etc/openvpn/ca.crt
cert                  /etc/openvpn/server.crt
key                   /etc/openvpn/server.key
dh                    /etc/openvpn/dh.pem
tls-auth              /etc/openvpn/ta.key 0
server                10.8.0.0 255.255.255.0
push                  "route 10.8.0.0 255.255.255.0"
push                  "redirect-gateway def1 bypass-dhcp"
push                  "dhcp-option DNS 8.8.4.4"
push                  "compress lz4-v2"
compress              lz4-v2
client-to-client
keepalive             10 120
cipher                AES-256-GCM
ncp-ciphers           AES-256-GCM
tls-version-min       1.2
tls-cipher            TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
user                  openvpn
group                 openvpn
persist-key
persist-tun
status                /var/log/openvpn-status.log
log-append            /var/log/openvpn.log
ifconfig-pool-persist /var/log/ipp.txt
verb                  4

OpenVPNの実行ユーザとグループをopenvpnにセットしたので実際に作成しておく。

$ sudo useradd -s /bin/false openvpn

ipフォワードを有効にしてiptablesで以ってIPマスカレードの設定をする。こうすることでクライアントがサーバ側のセグメントにあるマシンとやり取りできるようになるようである。

$ sudo vi /etc/sysctl.conf
#net.ipv4.ip_forward=1
net.ipv4.ip_forward=1

$ sudo sysctl -p
net.ipv4.ip_forward = 1

$ sudo iptables -A POSTROUTING -t nat -s 10.8.0.0/24 -o ens33 -j MASQUERADE

あとは起動を試みてエラーがでなければサーバの構築は完了である。

$ sudo openvpn --config /etc/openvpn/server.conf --daemon

参考:
基本的なOpenVPNの構築手順
OpenVPN – Open Source VPN
OpenVPN/easy-rsa
Easy-RSA – ArchWiki

BitLockerで暗号化されたストレージをLinuxでマウントするためのdislocker

OS: Windows 10 Pro ver 1709
OS: Ubuntu Desktop 16.04 日本語 Remix

起動しなくなったWindows10のマシンを寄越されて中のデータを取り出せるか問われたことがあるけれどもBitLockerで暗号化されているからLinuxで気軽にマウントしてアクセスするというわけにいかない。然し乍らLinuxからでも回復キーさえあれば復号して内部のデータへアクセスできるようなツールを拵えた人がいるようでほんとうにすごいと関心したものである。先ずはUbuntu Desktop 16.04 日本語 Remixを焼き付けたUSBの起動ディスクで以ってUbuntuを起動する。

そうしたら必要なパッケージをどんどこインストールしてゆく。なお、libmbedtls-devがないとdislockerをcmakeする際に「-- Could NOT find POLARSSL」というエラーで止まってしまった。またlibfuse-devがないと「-- Could NOT find FUSE」というメッセージが出る。cmakeの処理自体は恙無く終わったように見えるけれどもmakeを実施するとfuse.hが無いと言う咎で処理が止まるので結局は必要なのである。あとはdislockerをインストールするばかりである。

$ sudo apt install git cmake libmbedtls-dev libfuse-dev
$ git clone git://github.com/Aorimn/dislocker.git
Cloning into 'dislocker'...
remote: Counting objects: 3368, done.
remote: Total 3368 (delta 0), reused 0 (delta 0), pack-reused 3368
Receiving objects: 100% (3368/3368), 859.56 KiB | 484.00 KiB/s, done.
Resolving deltas: 100% (2336/2336), done.
Checking connectivity... done.

$ cd dislocker
$ cmake .
$ make
$ sudo make install

次は下準備としてディレクトリを2つ作成する。それから回復キーも予め用意しておく。回復キーが無いともはや為す術がない。

$ sudo mkdir /media/bitlocker /media/win10
回復キーの内容の一例

それからdmesgやlsblkなどでWindows10がインストールされていると思しきデバイスファイルを探る。今回のケースでは/dev/sdaがそれであった。/dev/sdaをfdiskで詳らかに見てゆくとこういう具合である。BitLockerのロックを解除したいパーティションは4番目にあることがわかった。

$ sudo fdisk -l /dev/sda
(snip)
デバイス     Start 最後から セクタ  Size タイプ
/dev/sda1     2048   1023999   1021952  499M Windows recovery environment
/dev/sda2  1024000   1226751    202752   99M EFI System
/dev/sda3  1226752   1259519     32768   16M Microsoft reserved
/dev/sda4  1259520 125827071 124567552 59.4G Microsoft basic data

あとはdislockerで以って/dev/sda4のロックを解除する。操作中にヘマをするといけないから-rオプションでリードオンリーにしておくと安心感がある。なお誤って関係の無いパーティションのロックを解除しようとすると「[ERROR] The signature of the volume (NTFS ) doesn’t match the BitLocker’s ones (-FVE-FS- or MSWIN4.1). Abort.」というようなメッセージを頂戴して終いであった。処理が終わると/media/bitlockerの直下にdislocker-fileという一つのイメージファイルが生まれるので、これをループバックデバイスとしてマウントする。するとBitLockerによって暗号化されていたストレージの内容がとうとう明らかになった。

$ sudo dislocker -r -V /dev/sda4 -p153659-674410-262823-201102-193336-410465-209352-219032 -- /media/bitlocker
$ sudo ls -lh /media/bitlocker/dislocker-file
-r--r--r-- 1 root root 60G  1月  1  1970 /media/bitlocker/dislocker-file

$ sudo mount -r -o loop /media/bitlocker/dislocker-file /media/win10/

あとは好き放題データをコピーするなり内容を検めることができる。飽きたらアンマウントするのが良かろうとおもう。

$ sudo umount /media/win10

参考:
Aorimn/dislocker
Use (Windows) BitLocker-encrypted drive on Ubuntu 14.04 LTS

motionのオプションについて

Raspberry Pi 3 Model B
OS: Raspbian Stretch lite March 2018
Logicool HD Webcam C270

motionには大変多くのオプションが用意されているのでちょっと戸惑う。調べたものを備忘録として記載し折に触れて参照するものである。なお設定確認のために頻回の起動と停止を繰り返すと突如機嫌を損ねることがあった。また設定ファイルのコメントに書いてあるデフォルト値と実際の設定値が異なることが屡々あったけれどもそういう事もあろうとおもう。

オプション 内容
daemon デーモンとして起動するかどうかをonかoffで指定。デフォルトではoff。
setup_mode motionをセットアップモードで起動。ライブストーリムの動画は変化があったピクセルが黒白や青で表示されてるようになり、何も知らぬ人が見れば故障したと思う。ライブストリームを見ながらノイズレベルの調整をしたり斑点状ノイズの除去の様子を確認しながら、動体を検知したと認める閾値を自ら定める場合に使うようである。
v4l2_palette カラーフォーマットと言われるものを指定。デフォルトは17でこれはYUV420を示している。ウェブカメラがサポートしていないフォーマットを指定していてもmotionが勝手に対応フォーマットを探して選択してくれるのでまことにゆき届いているとおもう。なおログを確認してみるとC270はYUYVかMJPGをサポートしている事がわかるので8か15を選択すればよいようである。
input 1つ以上の入力を持つキャプチャカードの数を記載するようである。USBカメラを接続しているなら-1を選択する。デフォルトも-1。
power_line_frequency 電源周波数に併せて指定する設定であるが通常はデフォルトのままでよいようである。電源周波数に繊細なウェブカメラで画像が安定しない場合に試すのが良さそうである。
rotate 画像の回転角度を0、90、180、270度から選択。デフォルトは0。0度以外を選択すると回転させる手数がかかるためかCPUの負荷がいくらか大きくなるようである。此れ以外の角度を指定すると「rotate_init: Config option “rotate” not a multiple of 90:」という風にエラーメッセージが記録され0度を指定したものとして扱われた。
90度回転させたようす
width 画像の横幅をpixelで指定。デフォルトは352と設定ファイルのコメントには書いてあるけれども設定値は320であった。8の倍数でなければ「vid_v4lx_start: config image width (~) is not modulo 8」という具合にエラーが記録される上、motionが起動しなかった。C270は720pをサポートしているので1280を指定したがheightを240のままにしていたところ、形が歪に過ぎるのか「v4l2_do_set_pix_format: Adjusting resolution from 1280×240 to 544×288.」という具合に解像度が勝手に調節されるようである。
height 画像の縦幅をpixelで指定。デフォルトは288と設定ファイルのコメントには書いてあるけれども設定値は240であった。やはり8の倍数でなければならない。720pをサポートするC270だから720を指定すると大変大きく画面に写し出すことができた。

framerate 動体を検知した時に画像をキャプチャするフレームレートの最大値を指定するようである。取りうる値は2~100で、100を指定すると実質的に上限を撤廃することと同様という。設定ファイルのコメントではデフォルト100との記載であったが設定値は2であった。数値を大きくすればCPUの負荷も上がるということである。C270ではwidth x heightが1280×720の場合は高々5fps程度であったけれども640×320にすると14fps前後までキャプチャできたので解像度も影響するような情勢である。
auto_brightness 輝度を自動で設定するか否かを決める。選択肢はonかoffである。C270ではonにするとログに「v4l2_set_control: setting control “Brightness” to 253 (ret -1 Input/output error)」といった具合のメッセージがひっきりなしにあらわれるから懸命に輝度をセットしようとしているフシがあるけれども恐らく効果がないようである。
brightness 輝度を0~255で指定。デフォルトは0で、これはmotion側で輝度をセットしないということである。なおC270では0以外の数値をセットしても「v4l2_set_control: setting control “brightness” to 2 (ret -1 Input/output error)」のようなメッセージがログに記録されるばかりで写し出される映像の様子に特段の変化は無いようであった。contrast(コントラスト)やsaturation(彩度)、hue(色相)についても同様であった。
threshold 閾値である。この数値を超えると動体を検知したとみなす。変化があったピクセルの数を閾値として指定する。デフォルトは1500。ノイズの処理が関係しているようなので単純に現フレームと一つ前のフレームを比較して変化があったピクセル数がカウントされるというわけではないようである。
pre_capture 動体検知が始まる前の画像をどれだけバッファしておくか指定する。取扱説明書を見ると0~100秒で指定するように見えるけれども、作成された動画をコマ送りにして確認してみるとどうもフレーム数ではないかという疑いがある。デフォルトは0。0は一つもバッファしないのと同じことである。あまり大きな数値を指定するとフレームがスキップされたり動画の滑らかさが失われるため0~5程度に収めておくのがよいとあるけれども0~5秒という意味合いであれば指定する値はframerateの数値だけ乗ずるのがよさそうである。
post_capture 動体の検知が完了してから何フレーム余分にキャプチャするか指定する。デフォルトは0。1~5秒程度になるようフレーム数を設定するのがおすすめであるという。
event_gap この設定は要すれば動体検知が収まってからevent_gap秒以内にまた動体を検知したらそれは一つの動画にまとめられるというようなことであると思う。event_gap秒を超えればそれは別イベントとして捉えられ記録動画も新たに別ファイルとして生成されるような風情であった。デフォルトは60。
max_movie_time 動画の最大記録秒数を指定。デフォルトは0でこれは上限を設けないことを意味する。無闇に1などを設定すると1秒の細切れ動画が山ほどできあがるので本当に不毛であった。
output_pictures 動体を検知した際、画像をどういう具合に出力するか指定。on、off、first、bestから選択できる。onは動体を検知した際の画像を全部出力する。offはまったく画像を出力しない。firstは動体を検知した一番最初のフレームのみ保存する。bestは動体検知イベント中でもっともピクセル数に変化が見られた場面を出力する。デフォルトではonだから放って置くとどんどんストレージを占拠してゆくおそれがある。
output_debug_pictures 変化が見られたピクセルがどこであったのかを黒白青赤で示す画像を出力する。上は通常の出力画像、下がこの設定で出力される画像。元の画像がわかっているとデバッグ画像もなんとなく意味を持って見えてくるようになるので妙なものである。

quality 画質の設定。デフォルトは75。1~100の間から指定する。100はほとんど圧縮がかからないので画質はよいけれどもファイルサイズが大きく、数値が小さくなると圧縮が強くなってゆき画質も劣化してゆく。なお1はこういう有様であった。目を細めて遠くから見るとちょっと画質が上がったように錯覚するので妙なものである。

picture_type 出力する画像のフォーマットを指定。jpegとppmから選択する。デフォルトはjpeg。ppm(portable pixmap format)はファイルサイズが大きいのでストレージの膨らみ具合には気を使う必要がある模様である。
ffmpeg_output_movies 動体を検知した際に動画を作成するか否かをonかoffで指定。デフォルトではoffとの記載であったが設定ファイルはonであった。
ffmpeg_bps 動画のビットレートを指定する。0から9999999の間で指定し、デフォルトは400000。ffmpeg_variable_bitrateが有効になっている場合はこの設定は無視されるという。
ffmpeg_variable_bitrate 可変ビットレートで動画をエンコードするよう設定する。0~100で指定し、デフォルトは0。0は可変ビットレートでのエンコードを無効にする。数値が大きいほど画質は高くなってゆく。
locate_motion_mode 検知した動体は此の箇所であるぞと表明する枠を表示する設定。on、off、previewから選択し、デフォルトではoff。previewでは画像にのみ枠を表示し、動画には表示しない。枠が表示されると途端に近未来的な風情がして好きである。

locate_motion_style 検知した動体は此れであるぞと示す枠のスタイルを設定。box、redbox、cross、redcrossから選択し、デフォルトではbox。boxは白枠、redboxは赤枠、crossは白十字、redcrossは赤十字である。locate_motion_modeが有効でないと意味をなさない。crossを選択するとこういう具合である。

text_right 画面の右下に表示する文字列を設定。変換指定子の一覧を参考にしつつ装飾してゆくとよさそうである。デフォルトでは%Y-%m-%d\n%T-%qである。それぞれ年-月-日、改行、時刻-フレーム番号、を示している。文字列を表示させない為にはtext_rightとだけ記述すればよかった。日本語を含むとSegmentation faultが発生してMotionが起動しない。
text_left 画面の左下に表示する文字列を設定。text_rightとおおむね同じことであるが設定していないと文字列は表示されない点が異なる。やはり日本語を含むといけない。使用できない変換指定子があったのでこれはmotionのバージョンによる問題であるかもしれない。

text_changes 変化のあったピクセル数を画面の右上に表示する。

text_double テキストのサイズを通常の二倍に拡大するならonにする。デフォルトではoff。もともとが大変細かい文字なので大きく表示されるのはまことにありがたい。

target_dir 画像と動画を保存するディレクトリを指定。指定しないとカレントディレクトリになる。デフォルトでは/var/lib/motionが記載されていた。
picture_filename 画像ファイルの名前を指定。デフォルトではイベント番号-年月日時刻-フレーム番号となる。
movie_filename 動画フィアルの名前を指定。デフォルトではイベント番号-年月日時刻となる。
stream_port ライブストリームの待受ポート番号。デフォルトでは8081が指定されていた。
stream_quality ライブストリームの画質。デフォルトは50。1~100の間から選択し、数値が大きくなるほど画質はよくなる。
stream_motion 動きのないうちはフレームレートを1にし、動体を検知したらフレームレートを増すようにする設定。フレームレートはstream_maxrateで指定した値まで増す。ネットワーク帯域の無駄遣いが許されない環境では帯域の節約に貢献するとおもう。

stream_localhost ライブストリームへのアクセスをローカルホストからのみに制限する。デフォルトではon。誰もが見られるようにするならoffを指定する。
stream_auth_method ライブストリームへのアクセスに認証を必要とする設定。0は無効、1はBasic認証、2はDigest認証。デフォルトでは無効。特段の理由がなければ認証を要するように誂えるのがよさそうである。
stream_authentication 認証に使うユーザ名とパスワードを指定。ユーザ名:パスワード といった形式で記載する。
stream_preview_scale Motionのウェブ設定画面に表示するライブストリーム映像の大きさを指定する。単位は取扱説明書に記載されていないけれどもHTMLソースにあるimgタグのwidth属性を見ると%単位であったのでそういうことであろう。デフォルトでは25なので1/4サイズで表示される。

webcontrol_port ブラウザからMotionの設定を可能にするならポート番号を記載してwebcontrol_authenticationもセットする。デフォルトは0で無効ということであるがすでに8080とセットされていた。
webcontrol_localhost Motion設定画面へのアクセスをlocalhostのみに制限するならon。デフォルトでonになっていた。制限を外すならoffにする。
webcontrol_authentication ウェブ設定画面へのアクセスに認証を要するようにする設定。ユーザ名:パスワード のフォーマットで記載する。stream_auth_methodのときと違いメソッドはBasic認証のみであるようである。ウェブ設定画面を有効にするのであれば絶対に設定すべきであるという風情で取扱説明書に記載がある。

if you are enabling the webcontrol feature of Motion, you really really really … should enable security authentications. No. Seriously. You really should.

ここまでの設定を組み合わせて概ね満足行く形の動体検知がこなされるようになった。

参考:
Motion

Raspbianにmotionを導入してブラウザからウェブカメラの映像を見る

Raspberry Pi 3 Model B
OS: Raspbian Stretch lite March 2018
Logicool HD Webcam C270

Raspberry Pi 3 Model BにHD Webcam C270を接続すれば忽ち認識されるし、uvcvideoモジュールも併せてロードされるから面倒と向かい合うことなく使えそうな様子である。

$ lsusb
Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270

$ lsmod | grep uvc
uvcvideo               90112  0

motionパッケージのインストールには夥しい数のライブラリに加えてffmpegも併せてインストールされるので自前で用意したffmpegがあるならばちょっと注意を要すると思う。

$ sudo apt install motion

ひとまず設定ファイルにあるstream_localhostをoffに変更する。これがonのままであるとlocalhostからしかライブストリームの様子を観察できない。

$ sudo vi /etc/motion/motion.conf
#stream_localhost on
stream_localhost off

そうしてmotionを起動したら、motionが稼働するマシンのIPアドレスの8081番ポートへブラウザでアクセスするとこういう具合である。

$ sudo motion
[0:motion] [NTC] [ALL] conf_load: Processing thread 0 - config file /etc/motion/motion.conf
[0:motion] [NTC] [ALL] motion_startup: Motion 4.0 Started
[0:motion] [NTC] [ALL] motion_startup: Logging to file (/var/log/motion/motion.log)

なお、セットアップモードという言葉に惹かれて-sオプションをつけて起動すると出力された映像はこういう有様であった。何がなんだか一寸わからない。ドキュメントをみると変化のあった画素を黒白や青で表現するように読み取れる。動体検知の設定をする際のノイズ除去や閾値の決定をするにあたって役立つような風情である。

参考:
HD Webcam C270
Linux UVC driver and tools
Motion