V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zrp1994
V2EX  ›  问与答

求助,处于 NAT 内网的网络摄像头,如何在外网进行访问?

  •  
  •   zrp1994 · 2016-04-28 09:45:11 +08:00 · 11365 次点击
    这是一个创建于 3133 天前的主题,其中的信息可能已经有所发展或是发生改变。

    参加电子设计大赛,设计包含了一个简单的监控系统。使用的网络摄像头开发板是类似树莓派的嵌入式开发板,摄像头的输出是 RTSP 流。

    已经有的思路:

    1. 通过一个公网有固定 IP 地址的服务器作为中转,服务器通过 SSH 反向代理摄像头的指定端口号,然后其他查看设备通过连接外网服务器来与摄像头直接通信。不过经过试验以后,每当查看设备连接指定端口后, SSH 端总是提示 Connect failed 。

      使用的命令:

      ssh -R 554:remote_addr:554 user@remote_addr
      

      我认为可能的原因之一是由于 SSH 反向代理只能代理 TCP 流量,而 RTSP 协议在传输流媒体的过程中用了 UDP ,所以可能在查看设备与摄像头握手之后无法继续传递其他数据。当然这只是我的猜测……

    2. 个人认为最靠谱的一个方案:通过 ffmpeg 与 ffserver 配合,在本地用 ffmpeg 将 RTSP 流发送到远程的 ffserver 上,然后其他的设备访问 ffserver 就可以了。然而测试之后, ffmpeg 总是卡在了:

      Could not write header for output file #0 (incorrect codec parameters ?): Invalid data found when processing input
      

      使用的命令是:

      ffmpeg -i rtsp://rtsp_stream_addr -f rtsp -c copy http://127.0.0.1:8090/feed1.ffm
      
    3. 使用 DDNS 服务,例如花生壳,代理指定端口。但是缺点很明显:支持 NAT 的 DDNS 服务没找到有开源的,找到的支持 NAT 的基本不开源……对于一个嵌入式的摄像头开发板来说,花生壳这里软件过大而且可能不兼容。另外 RTSP 同时使用 TCP 与 UDP ,不清楚这类软件是否能同时代理。

    4. 最后是尝试自己实现 RTSP 协议,目前还没有尝试,不知道有哪些坑等着我……

    PS:片上可用的语言有C、C++、Node,如果想要支持其他语言的话可能就要自己移植了……

    希望有这方面经验的老司机能够带我一把,新手求轻喷。

    第 1 条附言  ·  2016-04-28 23:28:42 +08:00
    感谢大家的回复,我来汇报下最新的进展啦!现在使用 EasyDarwin 作为服务器,然后本地通过 PC 上的 ffmpeg 将流转发到服务器上就可以在其他任意支持的客户端播放啦。
    一开始用的是腾讯云,不过这货坑了我一晚上,最终检测出客户端发送的 UDP 服务器接收不到,果断弃坑。
    阿里云还没试,现在用的是 Vultr 。不过日本的 Vultr 服务器的延迟感人呀,而且直播的时候经常就没信号了……
    第 2 条附言  ·  2016-04-28 23:31:09 +08:00
    PS : WireShark 捕获发现我这边 RTSP 同时使用的 TCP ( RTSP )和 UDP ( RTP ),而且每次传输的 UDP 端口都不一样,所以只有 TCP 转发或者 UDP STUN 是不行的。不过或许可以强制 RTSP 使用 TCP 传输。
    21 条回复    2016-04-28 15:39:57 +08:00
    computerfan
        1
    computerfan  
       2016-04-28 09:56:05 +08:00   ❤️ 1
    打电话向电信要公网 IP
    joe1213
        2
    joe1213  
       2016-04-28 09:59:59 +08:00
    @computerfan 请问现在的 3G 、 4G 运营商是否都给公网 IP 呢?或者哪家会给分配公网 IP 。
    computerfan
        3
    computerfan  
       2016-04-28 10:01:18 +08:00
    @joe1213 数据流量应该是都不给了……
    joe1213
        4
    joe1213  
       2016-04-28 10:04:57 +08:00
    3G 的网络摄像机,如何在外网访问呢?如果是直接用的大华这样的厂商的, P2P 服务器报价上 10 万了,有没有办法用他们的摄像机,但是用一些开源的 P2P 服务器软件?有哪些开源软件推荐?
    jedyu
        5
    jedyu  
       2016-04-28 10:05:08 +08:00   ❤️ 1
    STUN
    zrp1994
        6
    zrp1994  
    OP
       2016-04-28 10:05:56 +08:00
    @computerfan 额,关键是到时参加比赛的时候应该是要把作品带到现场的,那里的网络环境未知……
    zrp1994
        7
    zrp1994  
    OP
       2016-04-28 10:07:05 +08:00
    @jedyu 新技能 GET ,我去研究下
    joe1213
        8
    joe1213  
       2016-04-28 10:07:57 +08:00   ❤️ 1
    不在前端另配 PC ,或嵌入式设备。而是直接用网络摄像机本身的嵌入式系统做 P2P ,客户端的 SDK 是有的,但没有服务器端。大华也没有文档说明他们的 P2P 通信协议过程
    zrp1994
        9
    zrp1994  
    OP
       2016-04-28 10:15:55 +08:00
    @joe1213 之所以不考虑另外连接 PC 是因为这部分定位就是一个简单的监控,最好就是开箱即用的那种……如果真的必要的话也可以考虑外接 PC 处理通信。
    sen506
        10
    sen506  
       2016-04-28 11:09:53 +08:00   ❤️ 1
    [Zerotier]( https://www.zerotier.com/)
    没人推荐下这个啊?
    jacy
        11
    jacy  
       2016-04-28 11:49:48 +08:00   ❤️ 1
    vpn...
    fzinfz
        12
    fzinfz  
       2016-04-28 12:03:33 +08:00 via iPad   ❤️ 1
    zrp1994
        13
    zrp1994  
    OP
       2016-04-28 12:04:19 +08:00
    @sen506
    @fzinfz
    感谢,我研究下
    zrp1994
        14
    zrp1994  
    OP
       2016-04-28 12:06:27 +08:00
    @jacy 如果是 VPN 的话,假设我用 Android 客户端访问摄像头,也需要我的手机连接到 VPN ,一方面的话需要请求系统权限,对于用户也不是很友好,另外如果要支持多设备的话,不知道这种方式吃不吃得消……
    wohenyingyu01
        15
    wohenyingyu01  
       2016-04-28 12:38:16 +08:00 via iPhone   ❤️ 1
    在公网建立 sip 服务器,两边客户端都注册上, rtsp 交给 sip 就行
    xmoiduts
        16
    xmoiduts  
       2016-04-28 12:40:35 +08:00 via Android   ❤️ 1
    ffserver feed 配置不对吧?我也遇到过同样的问题,改 feed 参数--格式还是尺寸来着, flv , 160*120 。
    这货太费 cpu 了, -c copy 也没用。延迟 25 秒😂。

    如果需要勉强能用的话,输出裸流,管道到 cvlc , http 发送,延迟小一点。 3 秒左右。

    我在树莓派上的命令:
    raspivid -o - -t 0 -w 1280 -h 720 -b 1000000 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264 // 在 8090 端口开启直播
    电脑端用 vlc 打开网络串流。
    dalaomj
        17
    dalaomj  
       2016-04-28 13:19:42 +08:00   ❤️ 1
    这让我想起个问题。以前以灰鸽子为首的反弹连接木马,监控 NAT 内肉鸡屏幕和摄像头是如何传输的?
    zrp1994
        18
    zrp1994  
    OP
       2016-04-28 14:10:08 +08:00 via iPhone
    @dalaomj 真相了😱
    zwh8800
        19
    zwh8800  
       2016-04-28 15:08:47 +08:00
    中转的话服务器压力可能有点大。你可以试试 udp 打洞。搜搜关键字 STUN udp 隧道。
    我这里写过一篇介绍性的文章 https://hzzz.lengzzz.com/blog/755/
    Bryan0Z
        20
    Bryan0Z  
       2016-04-28 15:09:56 +08:00 via Android
    @zrp1994 用的花生壳,初中的时候玩的
    sec
        21
    sec  
       2016-04-28 15:39:57 +08:00 via Android
    对 rtsp 协议不了解,但最近在玩与第一个思路类似的情况,两台多层 nat 后的 windows 主机如何进行远程桌面通讯,中介机 centos6 , iptables INPUT 链 accept 对应端口,默认 drop , forward 链空,默认 accept , windows 下用 plink 建立 ssh 隧道,如果把一台 windows 的特定端口映射至中介机,中介机本身能够通过(localhost:端口)的形式访问,但另一台 windows 尝试通过(中介机 IP:端口)是连接不上的,提示连接被拒绝,关闭 iptables 无果,后来发现中介机的 ipv4 转发未开启,遂开启之,仍然是连接被拒绝,又看了下不同的教程,在另一台 windows 下将中介机的特定端口映射至本地后,再通过(localhost:端口)成功连接

    @dalaomj 灰鸽子是被控端主动建立连接到控制端,控制端的地址和端口写入了被控端可执行文件中,后来好像也支持通过一个可访问的 ip.txt 更新控制端 ip 和端口,控制端必须是可以直连的地址,动态 IP 用 DDNS 解决
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:10 · PVG 05:10 · LAX 13:10 · JFK 16:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.