家中遭了兩次小偷後, 買了兩台 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 連線請求, 一般這段不會是問題, 就這麼簡單.