2つのLANをつなぐルーター作成

前回の記事。中華監視カメラを買ってみたが、インターネットとつながるところに置くと中華クラウド等と通信しまくることが判った。
そこでNVR専用Lanを作り既存のLanとルーター(ファイアウォール付き)で接続することにした。つまり前回の記事の最後の図(↓)にする。

NVR専用Lanを作るの図

NVR Lan用ルーターのネットワーク設定

今回はルーターとしてはSBC(NanoPi NEO2)を使うことにしArmbian(Debian) Bullseyeをインストールした。これはnftablesがファイアウォールとして使える。ネットワークの設定には、今回はNetworkManagerを使うことに。
NetworkManagerの設定ファイルは /etc/NetworkManager/system-connections に保存されている。

nvr用ルーターの外向けNICの設定は特に普通に外側LANに参加する内容だけ。つまり上の図の「家庭用Lan」側を普通に設定するIPアドレス,サブネットマスク,デフォルトゲートウェイ,ネームサーバなど。デフォルトゲートウェイは「家庭用Lan」のインターネット向けのルーターのIPアドレスを指定しておけば問題なさそう。ネームサーバも同じく「家庭Lan」で使っているものを指定しておく。今回、「家庭Lan」は 192.168.0.0/24 とする。

/etc/NetworkManager/system-connections/外向けNIC.nmconnection (一部)
1
2
3
4
5
[ipv4]
address1=192.168.0.16/24,192.168.0.1
dns=8.8.8.8;8.8.4.4;
dns-search=
method=manual
上の例は、 192.168.0.16が外向けのIPアドレスでサブネットマスクは255.255.255.0 (/24)、デフォルトゲートウェイは192.168.0.1。ネームサーバは8.8.8.8と8.8.4.4(Google) という指定。 method=manualなので当然DHCPではなく手動(固定)。

「NVR用 Lan」は、「家庭Lan」とは別のネットワークにするのでここでは 192.168.128.0/24 とする。
ルーターの内向けNICが「NVR用 Lan」に向いている。

/etc/NetworkManager/system-connections/内向けNIC.nmconnection (一部)
1
2
3
4
5
[ipv4]
address1=192.168.128.1/24
dns=192.168.128.1;
dns-search=
method=manual

上の例は、192.168.128.1が内向けNICのIPアドレスで、サブネットマスクは255.255.255.0 (/24)、デフォルトゲートウェイは指定しない。ネームサーバは自身である192.168.128.1にしている。もちろん別途の設定でこのルーター上でリゾルバを動かしてやることになる。実際にはNVR Lan向けのリゾルバは無しでも良いし「家庭Lan」用のリゾルバを指定でも可。この場合はファイアウォールの設定によってはカメラが名前解決できないけど問題はない。

ルーターにするので、その指定を1行追加。

/etc/sysctl.conf (1行追加)
net.ipv4.ip_forward=1
たとえばNICのeth0でIPv6を無効にするなら
/etc/sysctl.conf (1行追加)
net.ipv6.conf.eth0.disable_ipv6=1 他のNICでIPv6を無効にするのであればeth0の部分をそのNICの名前に変更する。すべてのNICでIPv6を無効にするならeth0の部分をallにする。
ただし、USB NICなどを使っている場合は/etc/sysctl.confに書いた net.ipv6.conf.USB-NIC.disable_ipv6=1 や net.ipv6.conf.all.disable_ipv6=1 は効かないことがあるかも。

NVR Lan用ルーターでDHCPサーバを動かす

おそらくDHCPサーバのパッケージはOS標準で入っていると思われるが、もしも無ければ sudo apt install isc-dhcp-server などとしてインストールする。

/etc/dhcp/dhcpd.conf (一部)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
subnet 192.168.128.0 netmask 255.255.255.0 {

    range  192.168.128.192 192.168.128.254;
    default-lease-time 1296000; #2 weeks
    max-lease-time 2592000; # 4 weeks

    option routers              192.168.128.1;
    option subnet-mask          255.255.255.0;
    option domain-name          "nvrnet";
    option domain-name-servers  192.168.128.1;
    option time-offset          32400;  # Japan Standard Time
    option ntp-servers          192.168.128.1;
}

host camera1 {
    hardware ethernet 00:00:00:00:00:00;
    fixed-address 192.168.128.70;
}

NVR Lan用のDHCPサーバなのでデフォルトルートはルーターの内向きNICのIPアドレスになります。また、リゾルバをルーターに置くならネームサーバも内向きNICのIPアドレス、NTPサーバもルーターで動かすので内向きNICのIPアドレスにします。
rangeでリース範囲を指定。上の例だと192.168.128.192 - 192.168.128.254にしている。つまりDHCPで動的に割り当てられるIPアドレスはこの範囲のどれかになる。
しかし、カメラやNVRサーバのネットワーク設定をDHCPまかせにする予定ならアドレスが動的に変わると困るかもしれないのでhost指定でMACアドレスとIPアドレスを指定しておく。(上の例ではカメラ1のMACアドレスが00:00:00:00:00:00でIPアドレスが192.168.128.70)。固定させたいIPアドレスはできれば上のrangeで動的に割り当てられる範囲の外にしたい。つまり固定用の範囲を広めに取ってrange(動的割当)の範囲は狭めにする。(上の例では 約/26 = IP63個と広めにしているがそんなに取る必要はない筈)

複数のNICがあるホストでDHCPサーバを動かす場合は動くインターフェイスを指定しておかないと例えば外向きで動作したら意味がないというか迷惑。
インターフェイスを確実に指定する。

/etc/default/isc-dhcp-server (変更)
INTERFACESv4="eth0" これは内向きNICがeth0の場合。
DHCPサービスを動かす。
$ sudo systemctl enable isc-dhcp-server   #サービス有効化
$ sudo systemctl start isc-dhcp-server    #サービス開始
$ sudo systemctl status isc-dhcp-server   #サービス稼働を確認

NVR Lan用ルーターでNTPサービスの設定を行う

NVRサーバにしろIPカメラにしろ「監視」を行うのであれば正しい時刻を記録することが重要。時刻合わせできるようにしなければならないので「NVR Lan」内で利用可能なNTPサーバを用意する。NTPサーバだけを建てるのも良いかもしれないがSBCやPCをLinuxルーターにするのであればそいつでNTPサーバを動かしてやるのがてっとりばやい。
最近のLinuxではChronyが標準で入っていてNTPクライアントとして動いていることが多いかも。そこで、そのChronyに設定を加えてNTPサーバにする。

/etc/chrony/sources.d/local-ntp-server.sources (新規作成/編集)
server 192.168.0.1 prefer
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp

この例では192.168.0.1は「家庭Lan」のインターネット向けルーターで、そこで「家庭LAN」用メインのNTPが動いていることを想定している。他の3つはMFEEDの公開NTPサーバを指定している。

NVR LanにあるNVRサーバやIPカメラからNTPサーバにアクセス可能にする。

/etc/chrony/conf.d/allow.conf (新規)
deny 0.0.0.0/0
allow 192.168.128.0/24

ファイル名は *.conf であれば何でも良さそう。allowは許可、不許可ならdeny。
上の例では先にすべてのIPアドレスを不許可にした上で「NVR Lan」である 192.168.128.0/24 からのアクセスを許可指定している。ローカルホストである127.0.0.1はallowしなくても許可されるみたい。「みたい」が心配だったらallowとして書いておく方が良いかも。

$ sudo systemctl restart chrony    #サービス再起動
$ sudo systemctl status chrony     #サービス稼働を確認
$ sudo chronyc accheck 192.168.0.1 #家庭LanのIPアドレス等を確認
209 Access denied                  #アクセス拒否になることを確認
$ chronyc accheck 192.168.128.255  #NVR Lan用のIPアドレスの何かを確認
208 Access allowed                 #アクセス許可になることを確認

# 1〜5分待ってから

$ chronyc sources                  #上位NTPサーバとの時刻同期を確認

リゾルバ

NVR Lan向けリゾルバは省略。キャッシュ機能付きDNSリゾルバであるunboundでも入れておけば良いかと思われる。

ファイアウォールnftablesの設定

最近のLinuxではiptablesを装ってnftablesが入っているかもしれないが不完全な状態かもしれない。(よくわからない)
nftablesのパッケージをインストールするなら apt install nftables

/etc/nftables.conf (ベース部分)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/sbin/nft -f

flush ruleset

table inet filter {

    chain input {
        type filter hook input priority 0;  policy accept;
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
        ip daddr 192.168.128.0/28 accept
        ip saddr 192.168.128.0/28 accept
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }

}

どのチェーンに書くのかはどうでも良い気もするが、今回はforwardチェーンをデフォルトポリシーをdrop(破棄/遮断)にした上で、192.168.128.0/28 (192.168.128.0 - 192.168.128.15)を送信元あるいは送信先とするパケットをaccept(許可/受入)するルールを2行書いた。 あくまでもベースなのでこんな2行だが実際には運用するにはもう少し足す必要があるかも。 NIC別にチェーンを分けてルールを書くのは良いことだと思うが「頭がこんがらがる」ので単純なルーターではあまり複雑にしない方が良さそう。

nftablesを起動する。

$ sudo systemctl enable nftables    #サービス有効化
$ sudo systemctl start nftables     #サービス開始
$ sudo systemctl status nftables    #サービス稼働を確認

これで、「NVR Lan」用のルーターが完成。ただし、このルーターだけ作って喜んでると上手く行かなくて悩むことに。この記事で「家庭 Lan」としている側のネットワークにNVR Lan用の「静的ルートを追加」してやる必要があるので忘れない。(判っていてもこれが意外とアタマからすっぽ抜けてて上手く行かなくて悩むことになるのよね)

既存のネットワークに静的ルートを追加

家庭LanのルーターがLinuxなら

$ sudo route add -net 192.168.128.0 gw 192.168.0.16 netmask 255.255.0.0 eth1
とか 指定方法は複数。

家庭LanのルーターがFreeBSDなら
# route add -net 192.168.128.0 -netmask 255.255.255.0 192.168.0.16

192.168.128.0/24がNVR Lan、192.168.0.16が今回作ったルーターの外向き(家庭Lan向き)のIPアドレスとする。

もちろん、上のコマンドで作ったルートはシステムを再起動したら無くなるので適切な設定ファイルに静的ルートを書いておく。
その他の「家庭Lan」にあるホストも(NVR Lanに用があれば)同様に静的ルートを追加する。

「家庭Lan」用DHCPサーバがある場合

(今回作った「NVR Lan」用ルーターのDHCPサーバではなく)「家庭Lan」用のDHCPサーバに静的ルートを追加してしまえばDHCPでネットワーク設定を行うホストについては静的ルートを個別に設定してまわる面倒が無くて済む。DHCPオプションの設定追加だが書き方がちょっと特殊なのとDHCPサーバの種類によって設定の仕方が違うかも。(今回はisc-dhcpd)

/usr/local/etc/dhcpd.conf (変更/追加)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
option rfc3442-classless-static-routes code 121 = array of integer 8; #静的ルート 非Windows用
option ms-classless-static-routes code 249 = array of integer 8;      #静的ルート Windows用

subnet 192.168.0.0 netmask 255.255.255.0 {            #既存の設定
    range 192.168.0.196 192.168.0.223;                #既存の設定
    option time-offset 32400;  # Japan Standard Time  #既存の設定
    option routers 192.168.0.1;                       #既存の設定 デフォルトルートだが効かなくなるかも
    option broadcast-address 192.168.0.255;           #既存の設定
    option ntp-servers 192.168.0.1;                   #既存の設定
    option tftp-server-name "192.168.0.4";            #既存の設定
    option rfc3442-classless-static-routes 24, 192, 168, 128, 192, 168, 0, 16, 0, 192, 168, 0, 1; #静的ルート 非Windows用
    option ms-classless-static-routes 24, 192, 168, 128, 192, 168, 0, 16; #静的ルート Windows用
}
#後略

場所を分けて4行書く感じ。ネットワークアドレスの書き方が特殊でサブネットマスクの後にIPアドレスでピリオドではなくカンマ(コンマ)並べて書くことで複数書ける。

以上で「家庭Lan」と「NVR Lan」の2つのネットワークの間で通信できるようになった。ただし、怪しい中華カメラがNVRのLan外と通信できないよう192.168.128.0/28 (192.168.128.1 - 192.168.128.15)だけが家庭LANやインターネットと通信可能。
次回は、中華監視カメラをNVRサーバ(Windowsアプリ)に接続して映像を記録するという基本的なことをやる予定。

関連記事: