核心概念
在开始之前,你需要理解几个核心角色和概念:

- 网络摄像头 (IP Camera): 这是你要监控的物理设备,它需要有网络功能,能连接到你的家庭/办公室网络。
- 流媒体服务器 (Streaming Server): 这是整个系统的“心脏”,它负责从摄像头接收视频流,进行处理(如转码、录制),然后分发给多个客户端(比如你的浏览器),我们推荐使用 RTSP Simple Server,它免费、开源、配置简单。
- 网站前端 (Web Frontend): 这是你看到的网页界面,它通过 HTML5 的
<video>标签来播放从流媒体服务器获取的视频流,我们将使用 Nginx 作为 Web 服务器来托管这个网页。 - 反向代理 (Reverse Proxy): 这是一个“中间人”,它将来自外网(互联网)的请求(比如访问你的网页)转发到内网(家庭网络)的相应服务(如流媒体服务器或 Web 服务器),这样做的好处是:
- 安全: 只需要开放一个端口(如 443 端口),隐藏了内部服务的具体端口。
- SSL/TLS 加密: 可以轻松地为整个网站提供 HTTPS 加密,保护你的数据安全。
- 负载均衡: 如果未来需要扩展,可以轻松实现。
- 公网IP 和 动态DNS (DDNS): 你的家庭网络由互联网服务提供商分配一个公网 IP 地址,这个地址可能会变,DDNS 服务(如花生壳、No-IP)可以给你一个固定的域名(如
mycamera.ddns.net),并自动更新到你的动态公网 IP,这样你就可以通过域名随时随地访问了。
准备工作
-
硬件:
- 一台 24小时开机 的设备(如:旧电脑、树莓派、NAS、或任何一台闲置的电脑),这台设备将作为你的监控服务器。
- 一个网络摄像头(支持 RTSP 协议的最好)。
- 路由器和网线。
-
软件:
- 操作系统: Linux (推荐 Ubuntu Server) 是最稳定和成本效益最高的选择,Windows 也可以,但配置会更复杂一些。
- 流媒体服务器: RTSP Simple Server (也叫
rtsp-simple-server或rtspsrv) - Web 服务器 / 反向代理: Nginx
- 动态域名服务: 注册一个免费账户(如 花生壳 或 No-IP)。
详细搭建步骤 (以 Ubuntu Server 为例)
第一步:设置监控服务器
-
安装系统: 在你的服务器电脑上安装 Ubuntu Server。
-
更新系统:
(图片来源网络,侵删)sudo apt update && sudo apt upgrade -y
-
安装必要软件:
# 安装 Nginx sudo apt install nginx -y # 安装 Golang (rtsp-simple-server 是用 Go 语言写的) sudo apt install golang-go -y # 安 FFmpeg (用于视频转码和处理,可选但推荐) sudo apt install ffmpeg -y
第二步:配置流媒体服务器 (rtsp-simple-server)
-
下载并运行:
# 创建一个工作目录 mkdir ~/rtsp-server && cd ~/rtsp-server # 下载最新版本的 rtsp-simple-server go get github.com/aler9/rtsp-simple-server # 运行服务器 (可以先测试一下) ~/go/bin/rtsp-simple-server
如果看到一堆配置信息输出,说明服务器启动成功了,按
Ctrl+C停止。 -
配置文件: 为了让服务器在后台运行并自定义配置,我们需要创建一个配置文件
rtsp-simple-server.yml在~/rtsp-server目录下。nano ~/rtsp-simple-server/rtsp-simple-server.yml
粘贴以下内容,并根据你的摄像头信息进行修改:
# rtsp-simple-server.yml # 定义一个名为 "mycamera" 的摄像头源 paths: live: # 摄像头的 RTSP 地址 (请替换为你的摄像头地址) # 格式通常是: rtsp://username:password@ip_address:port/path # 如果没有用户名密码,可以省略 source: rtsp://192.168.1.100:554/stream # 可选: 使用 FFmpeg 进行转码,让更多设备能播放 # 转码为 H.264 编码,AAC 音频,720p 分辨率 # ffmpeg: -c:v libx264 -preset ultrafast -f hls -hls_time 4 -hls_list_size 6 -c:a aac -f hls mycamera.m3u8 # 可选: 启用录制,将视频保存为文件 # record: true # recordPath: ./recordings # recordFormat: mp4保存文件:
Ctrl+X->Y->Enter。 -
设置为系统服务: 为了让服务器开机自启并在后台稳定运行,我们创建一个 systemd 服务。
sudo nano /etc/systemd/system/rtsp-simple-server.service
[Unit] Description=RTSP Simple Server After=network.target [Service] Type=simple User=your_username # 替换为你的服务器用户名 WorkingDirectory=/home/your_username/rtsp-server # 替换为你的工作目录 ExecStart=/home/your_username/go/bin/rtsp-simple-server Restart=on-failure [Install] WantedBy=multi-user.target
保存文件,然后启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable rtsp-simple-server sudo systemctl start rtsp-simple-server
检查服务状态:
sudo systemctl status rtsp-simple-server,如果显示active (running),说明成功了。
第三步:创建监控网页
-
创建网页目录:
sudo mkdir -p /var/www/html/camera sudo chown -R $USER:$USER /var/www/html/camera
-
编写 HTML 页面:
nano /var/www/html/camera/index.html
粘贴以下代码,这个页面会使用
hls.js库来播放 RTSP 流(通过 HLS 协议)。<!DOCTYPE html> <html> <head> <title>远程摄像头监控</title> <meta charset="utf-8"> <style> body { margin: 0; background-color: #111; display: flex; justify-content: center; align-items: center; height: 100vh; } video { max-width: 100%; max-height: 100vh; } </style> </head> <body> <video id="video" controls autoplay muted playsinline></video> <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script> <script> var video = document.getElementById('video'); var videoSrc = 'http://localhost:8080/live/mycamera.m3u8'; // 注意这里的地址和路径 if (Hls.isSupported()) { var hls = new Hls(); hls.loadSource(videoSrc); hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED, function() { video.play(); }); } else if (video.canPlayType('application/vnd.apple.mpegurl')) { // 对于原生支持 HLS 的设备 (如 Safari) video.src = videoSrc; video.addEventListener('loadedmetadata', function() { video.play(); }); } </script> </body> </html>保存文件。
第四步:配置 Nginx 反向代理
这是最关键的一步,它将内网服务暴露到外网,并实现 HTTPS 加密。
-
获取 SSL 证书 (Let's Encrypt): 我们使用
certbot来免费获取 SSL 证书。sudo apt install certbot python3-certbot-nginx -y
-
配置 Nginx:
sudo nano /etc/nginx/sites-available/camera
粘贴以下配置。请务必将
yourdomain.ddns.net替换成你自己的 DDNS 域名。server { listen 80; server_name yourdomain.ddns.net; # 替换成你的域名 # 将 HTTP 请求重定向到 HTTPS location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; server_name yourdomain.ddns.net; # 替换成你的域名 # SSL 证书配置 (Certbot 会自动填充) ssl_certificate /etc/letsencrypt/live/yourdomain.ddns.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.ddns.net/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 反向代理到我们的监控网页 location / { proxy_pass http://localhost; # Nginx 默认监听 80 端口,指向 /var/www/html proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 反向代理到 rtsp-simple-server 的 HLS 输出 # 这样外网可以直接访问到 m3u8 文件 location /live/ { proxy_pass http://localhost:8080/; # rtsp-simple-server 的 HLS 默认端口是 8080 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }保存文件。
-
启用配置并获取证书:
# 创建符号链接启用站点 sudo ln -s /etc/nginx/sites-available/camera /etc/nginx/sites-enabled/ # 删除默认站点 sudo rm /etc/nginx/sites-enabled/default # 测试 Nginx 配置 sudo nginx -t # 如果测试通过,获取 SSL 证书 sudo certbot --nginx -d yourdomain.ddns.net # 再次替换你的域名
在
certbot的交互界面,选择将 HTTP 重定向到 HTTPS。 -
重启 Nginx:
sudo systemctl restart nginx
第五步:配置路由器端口转发
你的服务器在内网中已经配置好了,但外网还无法访问,你需要登录到你的路由器管理后台,进行端口转发。
- 登录路由器: 通常通过
168.1.1或168.0.1访问。 - 找到端口转发/虚拟服务器设置。
- 添加规则:
- 服务名称:
HTTPS - 外部端口:
443 - 内部 IP 地址: 你监控服务器的内网 IP 地址 (
168.1.20) - 内部端口:
443 - 协议:
TCP
- 服务名称:
- 保存并启用。
第六步:配置动态域名 (DDNS)
登录你的 DDNS 服务商网站(如花生壳),设置你的域名(yourdomain.ddns.net),并将其指向你当前的公网 IP 地址,大多数路由器也支持内置的 DDNS 客户端,可以自动更新 IP 地址,推荐开启。
最终测试
- 在你家里的局域网内,用手机或电脑打开浏览器,访问
https://yourdomain.ddns.net。 - 你应该能看到摄像头的实时画面了。
- 切换到你的手机移动数据网络(确保不在家里 Wi-Fi 下),再次访问同一个网址。
- 如果能看到画面,恭喜你!你已经成功搭建了一个安全、远程的监控网站!
进阶功能与安全建议
- 安全:
- 修改默认端口: 不要让 rtsp-simple-server 和 Nginx 使用默认端口,增加安全性。
- 防火墙: 使用
ufw(Uncomplicated Firewall) 只开放必要的端口(如 443)。sudo ufw allow 443/tcp sudo ufw enable
- 强密码: 为你的摄像头、路由器管理员账户、服务器 SSH 账户设置强密码。
- 功能:
- 双向语音: 如果你的摄像头和网页前端支持,可以实现通过网页对讲。
- 移动侦测/警报: 可以结合脚本,当 FFmpeg 检测到画面变化时,发送邮件或推送通知。
- 多摄像头: 在
rtsp-simple-server.yml中定义多个paths,在网页中创建多个<video>标签即可。 - 云存储: 将录制视频上传到云存储(如阿里云 OSS, AWS S3),防止本地硬盘损坏导致录像丢失。
这个方案功能强大且成本极低,是个人和小型企业搭建监控系统的理想选择,祝你搭建顺利!
