家中遭了兩次小偷後, 買了兩台 HikVision DS-2CD3T25-I5 監視攝像頭, 配合 PoE 簡化佈線, 並以 VPS 通過 openvpn 連回家中 camera 的 RTSP port 取得影像保存. 至於 camera 廠商提供的方便雲整合服務, 還是免了, 難不成想上演 truman show?

首先, 在 dnsmasq 依 MAC address 配置固定的 IP & hostname

dhcp-host=a4:14:37:f5:2b:f9,10.9.1.151,cam02,infinite

OK 之後, 重啟 dnsmasq 及攝像頭, 可用 arp 命令確認 IP/hostname 及 MAC address 的對應.

# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
...
10.9.1.151               ether   a4:14:37:f5:2b:f9   C                     macvlan0
...

OpenVPN 的 tunnel 先前就打通了, server 的 IP 為 172.16.10.1, tun 名為 tun-for-sh, client 的是自動分配的 (但也就只有一個), tun 名為 tun-to-tky.

接下來要讓 VPS 能連回家中 camera 的 port 554 (RTSP). 先為 vps 建立一個 zone, 將 openvpn 的 tun 加入 zone 中, 並重新載入 firewalld 設定

$ sudo firewall-cmd --permanent --new-zone=vps
$ sudo firewall-cmd --permanent --zone=vps --add-interface=tun-to-tky
$ sudo firewall-cmd --reload

接著將來自 port 50001 的 request forward 到 cam02 的 554 上

$ sudo firewall-cmd --zone=vps --add-forward-port=port=50001:proto=tcp:toport=554:toaddr=10.9.1.151

因為 openvpn 的網段跟 camera 的不同, 得啟用 zone vps 上的 masqurade

$ sudo firewall-cmd --zone=vps --add-masquerade

保存設定

$ sudo firewall-cmd --runtime-to-permanent

RTSP 連線建之後, client 還會在協商的 RTP port 上接收 stream, 這點不是問題, 因為我在 VPS 上完全信任了家中通過 openvpn 發向它的所有請求

# On my VPS
$ sudo firewall-cmd --zone=trusted --add-interface=tun-for-sh
$ sudo firewall-cmd --runtime-to-permanent

至此 VPS 應該就能從 port 50001 連往 cam02 的 RTSP port 並取得影像了. 配合 gst-launch-1.0 測試一下, 10 秒產生一個 mp4 檔

gst-launch-1.0 -v rtspsrc location=rtsp://172.16.10.2:50001 do-rtcp=true do-rtsp-keep-alive=true ! rtph264depay ! h264parse ! splitmuxsink muxer=mp4mux max-size-time=1000000000 location=cam02-%08d.mp4

補充說明下, DS-2CD3T25-I5 的 RTP stream 是簡單的 h.264 video stream, 沒有包在如 mpegts 這樣的 container format 中, 所以在 de-payload 後, 需要 muxer 產生 container 再保存到 file 中通用性會比較高.

最後, 如果連不上 camera, 可確認下 camera 的設定是否接受特定的 IP 連線請求, 一般這段不會是問題, 就這麼簡單.