这个问题最初是在网络工程.stackexchange并建议将其移至此处。
总结
多个地点均设有本地 CCTV。如何使用在 CGNAT 后面提供 IPv4 服务的 ISP 远程访问所有这些地点,并且 DVR 不支持 IPv6 的 DDNS。DVR 还提供 API、SDK、P2P 和 PPPoE:
API:需要 HTTP 连接才能拨打电话,CGNAT 正在途中。
SDK:不确定如何利用 SDK。也许我可以在 DVR 中嵌入软件,但不知道怎么做或从哪里开始。
P2P:不知道如何重现此连接。另外,它可能只允许实况录像,而我已经通过 RTSP 实现了。
PPPoE:不确定它是否与问题相关。
我最近意识到并且仍在研究的可能的解决方案:
a. IPv6 到 IPv4 隧道
b. 是否可以仅为摄像机/DVR 流量配置 VPN?
介绍
我家经营着一家本地企业,有 2 家商店和一个仓库。他们都有本地存储的闭路电视录像。我正在开发一个附带项目,以便远程访问这些图像,在 ML 模型中处理它们并发出更相关的警报。
我对计算机网络的了解有限,但我的理解是:
- 对于所有位置,ISP 都通过 CGNAT 后面的 IPv4 为我们提供服务,这意味着我的公共 IPv4 不仅仅是“我的”。
- 我能够使用以下方式访问摄像头的实时画面实时流媒体传输协议与协议IPv4,通过在每个位置的本地路由器中为端口 554 配置端口转发。据我所知,在 CGNAT 之后这是不可能的。延迟有时还可以(~2 秒),有时则很糟糕(~20 秒)。
- 我尝试配置端口 80、8080、37777 和 443 的端口转发,以便能够远程访问 DVR 界面。这没用,我得到的是
ERR_CONECTION_TIMED_OUT
或ERR_EMPTY_RESPONSE
。我尝试了所有这些端口以确保万无一失,但在网络内部,我可以通过访问 来访问 DVR 接口http://192.168.15.93:8080
,因此仅端口 8080 就足够了。(是的,当我尝试从网络外部访问时,我使用的是公共 IP)
我的理解是,由于 CGNAT,我无法访问 DVR 接口,但这是否也意味着 RTSP 也应该失败?
问题
我正在探索除获取静态 IPv4 之外的解决方案。
我不想通过 RTSP 全天候处理所有摄像头,原因如下:带宽消耗、执行模型的成本24/7 * {nr of cameras}
、RTSP 延迟较大(可能是由网络状况导致的?)等
我设法获得了 DVR 的 API 文档和 SDK。说实话,我不知道该用 SDK 做什么,因为我的大部分编程都是针对在线平台的。我猜是为了将软件嵌入 DVR 或摄像机吧?我很想这样做,但不知道从哪里开始。
通过 API,我可以监听摄像头发出的事件,因此我只能在有事件发生时处理图像。但是,由于 CGNAT,我无法远程访问 DVR。我可以,理论上可以通过 IPv6 来实现,但它是一个动态 IP,这意味着每次改变时我都必须重新配置。DVR 支持 DDNS,但显然仅适用于 IPv4。
最后,DVR 还支持另外两种类型的连接:
- 一种是 P2P,我可以使用相机的 APP 连接到它,这样我就可以看到镜头,但我不知道如何重现此连接,以便我可以自己检索图像并进行处理。但不确定这是否允许我访问 API。
- 第二个是 PPPoE,我也不知道它是如何工作的,而且很快谷歌搜索没有帮助。它可能与问题完全无关。
笔记:阅读有关 ipv6 到 ipv4 隧道的某处内容,仍在阅读中,不确定这是否是正确的路径。
问题
如果我的 DVR 位于 IPv4 中的 CGNAT 后面,并且 IPv6 不支持 DDNS(在 DVR 中),我该如何远程连接到 DVR?
理想情况下,我正在寻找一种远程运行而不是在每个位置本地运行的解决方案。(显然,除了 DVR 之外)
答案1
解决这个问题的方法不止一种,但我考虑的方法是建立 VPN 网络。
我首先要从云提供商那里获取一个虚拟机并在其上运行 VPN 服务器(我会选择 OpenVPN 或更可能是 Wireguard)。然后我会在每个路由器上运行 VPN 客户端以连接到 VPN 服务器(这可能需要支持 VPN 的新路由器)。
请注意,您不需要通过 VPN 路由所有流量 - 您可以将其限制到其他 VPN 客户端。不幸的是,设置起来并不容易 - 但它可以很好地工作,同时提高整体安全性,并且如果操作正确,可以通过 VPN 连接的设备直接访问摄像头。
一个更简单但更昂贵的解决方案是放弃 VPN 服务器并从提供静态 IP 的提供商那里购买 VPN 客户端 - 您需要为每个路由器设置静态 IP,需要设置端口映射,并且不具备上述解决方案的安全性。
答案2
详细说明我的评论:要将受 CGNAT 约束的网络连接到 VPN,您需要“从内部”建立连接:网络上的设备必须建立并维护 VPN 隧道。如果路由器功能足够强大,它确实可以完成这项工作。但是,通常情况下,它无法完成这项工作。不过,这并不是一个大问题:另一个设备也可以完成这项工作!这就是我在评论中所说的“本地网关”。它不需要功能强大或昂贵。Raspberry Pi 可以轻松完成这项工作。根据带宽要求,即使是原始的 Raspberry Pi 也可以完成这项工作!当然,如果您决定走这条路,我建议您使用最新的型号。
专用本地网关应该有一个静态 IP 地址,可以通过配置或通过 DHCP 保留获得。
如果路由器无法完成此操作,则可能有两种主要原因:
您可以在路由器上输入到 VPN 网络的静态路由(通过 VPN 客户端设备),这样它就可以正常工作。需要静态本地 IP 地址。
您不能输入静态路由,否则它就无法工作,或者静态本地 IP 地址是不可能的。更多 NAT 来救援!
无论哪种方式,除了隧道一端的现场设备外,您还需要另一端:具有静态互联网 IP 地址的设备。廉价的虚拟专用服务器 (VPS) 可以完成这项工作。(或者,您也可以选择 Tailscale 之类的东西,尽管这不太可能与现有路由器配合使用。)
第一种情况相对简单:你设置了你最喜欢的 VPN(WireGuard、OpenVPN、SoftEther 等等;甚至可能是 IPsec,如果你确实 确实 绝对想要)。VPN 使用其他位置未使用的子网。使用“本地网关”设备(而非默认网关)时,您可以在默认网关(“互联网路由器”)上设置路由到VPN 子网通过相应的客户端设备。
案例 2 的开头相同:最喜欢的 VPN,“本地网关”。但是,如果路由拒绝工作或无法设置,或者无法使用静态 IP,则更多 NAT 可能会有所帮助!就像 NAT 路由器将整个网络隐藏在其后面并假装所有流量都来自路由器本身一样,“本地 VPN 网关”可以假装来自 VPN 的所有流量都来自其自身。无需路由。假设使用 Linux,这可能很简单:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
如果设置了静态 IP 地址,则更复杂的解决方案可能是:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 1.2.3.4
…在哪里1.2.3.4是静态本地 IP 地址,并且eth0唯一的以太网接口。无论哪种方式,您都必须确保iptables规则会在启动时恢复,以防断电或只是更新。不同的 Linux 发行版对此有不同的方法。
然后,您可以从任何地方连接到 VPN,并访问任何网站,就像您亲临现场一样。