ラズパイ4でサーバ構築 その1の続きの後半戦だ。
ホームサーバといってもメディアサーバだけではない。防犯カメラのメインストレージも兼ねており、家の前で何らかの動きがあった際は、その時間帯の動画が自動的に保存される。もちろん、保存された動画は外出先からもチェック出来るようにしなければならない。
その仕組みとしてはApacheとMariaDBを連携させて、保存した動画をWebで見られるようにしているだけなのだが、家の中からと、外からのアクセスの違いで問題になる。
例えば、このブログのURLは https://blog2.taifuh.com/ だが、グローバルIPアドレスが割り振られているので、DNSを引くことにより 116.58.171.130 というアドレスでアクセスされる。家の外ではそれで良いのだが、家の中ではアクセスできない。なぜなら家の中はスマホなどの機器には 192.168.0.xx といったローカルなIPアドレスが振られ、116.58.171.130 といったグローバルなIPアドレスにアクセスする場合は、ルーターを通って外、つまりインターネットへアクセスしに行ってしまうからである。ところが、サーバの実体は、例えば 192.168.0.10 であり、内側にあるため taifuh.com のサーバにアクセス出来なくなってしまうのだ。
うまく繋ぐためには、家の中に居る際は taifuh.com のローカル・アドレスである 192.168.0.10 (このアドレスはあくまでも例である) であることをスマホに通知しなければならない。ということで、DHCPサーバとDNSサーバの構築が必要になる。
DHCPサーバとDNSサーバ
DHCPサーバは使い慣れているisc-dhcp-serverを使用する。
ドメインやDNSの設定を忘れずに行う。他には固定的にアドレスを割り当てたい端末の設定も行う。
以下は /etc/dhcp/dhcpd.conf の主要な変更点。何度も言うがIPアドレスやMACアドレスは例であって、実際の設定とは異なる。
/etc/hdcp/dhcpd.conf
# option definitions common to all supported networks...
option domain-name "taifuh.com";
option domain-name-servers 192.168.0.10;
subnet 192.168.0.0 netmask 255.255.255.0 {
option routers 192.168.0.1;
option subnet-mask 255.255.255.0;
range dynamic-bootp 192.168.0.201 192.168.0.251; // 自動割り当ては50台分
host ipcam { // 防犯カメラを固定IPに
hardware ethernet 58:AC:3E:FE:FF:81;
fixed-address 192.168.0.105;
}
}
ここでのポイントは option domain-name-servers 192.168.0.10; であり、家の中のスマホがIPアドレスを問い合わせる際はDNSサーバである192.168.0.10へアクセスが行くようになる。
お次はそのDNSサーバで、これまたデファクトのBIND9を使う。
/etc/bind/taifuh.com.zone に家の中のローカルネット内のIPアドレスを列挙する。これにより taifuh.com へのアクセスは家の中ではルーターへ行かずに、内部の 192.168.0.10 (あくまでも例である) へ直接アクセスされることになる。
/etc/bind/named.conf.local
zone "taifuh.com" {
type master;
file "/etc/bind/taifuh.com.zone";
allow-query { any; };
allow-update { none; };
};
zone "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/0.168.192.db";
allow-query { any; };
allow-update { none; };
};
/etc/bind/taifuh.com.zone
$TTL 86400
@ IN SOA ns.taifuh.com. root.taifuh.com. (
20030812 ; Serial
10800 ; Refresh after 3 hours
3600 ; Retry after 1 hours
604800 ; Expire after 1 week
86400 ; Minimum TTL of 1 day
)
;
IN NS ns.taifuh.com.
;
IN MX 10 mail.taifuh.com.
;
ns IN A 192.168.0.100
www IN CNAME ns.taifuh.com.
blog IN CNAME ns.taifuh.com.
blog2 IN CNAME ns.taifuh.com.
mail IN CNAME ns.taifuh.com.
server IN CNAME ns.taifuh.com.
/etc/bind/named.conf.options
acl internal {
192.168.0.0/24;
};
options {
directory "/var/cache/bind";
allow-query {
localhost;
internal;
};
forwarders {
xxx.xxx.xxx.xxx; // ISPの提供するDNSサーバのIPアドレス
};
dnssec-validation auto;
};
forwardersはこのDNSが解決できない場合に問い合わせる上位のDNSサーバを指定する。要は家の中の機器以外へのアクセスの際は全てforwardersの方へ問い合わせることになる。
/etc/resolv.conf
search taifuh.com
nameserver 127.0.0.1
Echonet-Lite (Node.js)
我が家のサーバは太陽光発電パネルと蓄電池のモニタリングと制御にも使用している。具体的には、23時を過ぎたら深夜電力になるのでそこから蓄電を始めるのだが、明日の天気次第でフル充電させるのか、ほとんど充電させないかを決める。その辺は「続々・蓄電池運用最適化」に記載してある。
これらは Node.js で稼働しているため、まずはインストールから。
ところが、apt installでは随分と古いバージョンしかインストールされない。
従い、以下の手順で最新の安定版(V12)をインストールする。
$ sudo curl -fsSL https://deb.nodesource.com/setup_12.x | bash -
$ sudo apt-get install -y nodejs npm
Echonet-Liteはnpmでインストールするため、npmもインストールしている。
次いで、Econet-Liteのライブラリと、デーモン化のためにforeverをインストールする。
$ sudo npm install echonet-lite
$ sudo npm install forever -g
ところがこの後、しばらく悩み続けることになる。うまく蓄電池と通信できなかったからだ。理由が分かると簡単な事なのだが、それはこの続きで説明する予定だ。