在有公网 IP 的情况下如何安全地进行远程桌面连接?

Author: OwnDing

Date: 2023-12-23

我从22年3月开始到现在一直在iPad使用微软远程桌面登入云电脑进行办公,刚开始也为网络安全绞尽脑汁,还好最后总算被我找到了解决方案,而且都是免费的,不用花一分钱。

话不多说,下面介绍下我使用远程桌面的一些安全措施,请重点关注两项增强措施


基本措施

1、修改RDP的默认端口;限制administrator账号登入(我偷懒没有禁止admin账号,不过强烈建议使用其它用户名登入);使用强密码。


增强措施:

2、安装IPBan。由于远端连接的相关端口暴露在互联网会导致别人暴力破解,安装IPBan后,可以将多次登入失败的IP地址自动加入防火墙禁用。网址:GitHub - DigitalRuby/IPBan: Since 2011, IPBan is the worlds most trusted, free security software to block hackers and botnets. With both Windows and Linux support, IPBan has your dedicated or cloud server protected. Upgrade to IPBan Pro today and get a discount. Learn more at ↓

超过三次失败限制登入几分钟

3、使用Duo Security进行二次验证

Multi-Factor Authentication & Single Sign-On | Duo Security

当你输入正确的用户名、密码登入后,会出现Duo验证界面,需要你在手机上确认是否登入。

手机二次验证

手机Duo界面

Duo RDP设置界面

以上安全措施我在另一篇文章中也提过:

告别电脑,完全使用iPad(平板)进行办公、学习、娱乐的最佳方案

在云端遨游,代码如飞!服务器远程开发指南

Author: OwnDing

Date: 2024-02-25

还在为本地电脑的低配置而烦恼吗?还在为繁重的编译和运行时间而抓狂吗?快来看看服务器远程开发的解决方案吧!

服务器化开发,释放本地电脑的潜能

服务器远程开发,顾名思义,就是把开发环境搬到服务器上,本地电脑只需要负责轻量级的编辑和控制。这种方式可以大大降低本地电脑的配置要求,让即使是老掉牙的电脑也能流畅运行开发环境。

前端使用 Visual Studio Code Remote 方案,纵享云端开发的自由

Visual Studio Code Remote 是一款强大的扩展,可以将 Visual Studio Code 的开发环境扩展到远程服务器。有了它,你可以在本地电脑上编辑代码,而编译、运行和调试都在服务器上进行。

后端使用 JetBrains Gateway 方案,体验专业工具的魅力

如果你需要一个更专业的开发环境,那么 JetBrains Gateway 绝对是你的不二之选。它是一款免费的软件,不过它提供了无与伦比的功能和稳定性。有了它,你可以使用最新版本的 IntelliJ IDEAPyCharm 和其他 JetBrains 工具,在服务器上进行开发。

Gateway支持的IDE

Gateway 最大优点是可以使用VPN远程到服务器内网,也可以稳定运行调试编写代码,让你在任意地方随心所欲的编程。

缺点是需要付费IDEA使用。

我使用JetBrains Gateway有数个月时间了,代码及后端计算均在服务器上完成,本地电脑上主要就是一个显示、编辑操作,对电脑性能要求低。此外,现阶段的Gateway稳定性较之前版本有很大的提升,此外你无需将代码下载到本地电脑,这样也保证了代码的安全性。

Gateway界面

如果你想了解更多关于服务器远程开发的信息,可以访问以下链接:

好了,以上就是关于服务器远程开发的全部内容了。希望对你有帮助!

ZLMediaKit 重启后拉流配置丢失一种简单解决方法

问题背景

ZLMediaKit 在服务重启后可能会出现已配置的拉流任务丢失的问题。本文提供一种通过 API 自动恢复拉流配置的解决方法。


解决方法概述

  1. 使用 jq 工具解析 JSON 配置文件
  2. 通过 Shell 脚本调用 ZLMediaKit API 批量恢复拉流任务
  3. 配置开机自启动实现自动化恢复

实施步骤

1. 安装 jq 工具

1
2
3
4
5
6
7
8
# Ubuntu/Debian 系统
sudo apt-get install jq

# CentOS/RHEL 系统
sudo yum install jq

# 验证安装
jq --version

2. 创建流配置文件 streams.json

将需要持久化的拉流配置保存为 JSON 格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[
{
"vhost": "192.168.16.10",
"app": "live",
"stream": "xxx225",
"url": "rtsp://admin:admin@192.168.11.225:554/h266/ch1/main/av_stream",
"secret": "CCCOuGTsZG7EZoHtt1l6HUmbBW6xP4ri"
},
{
"vhost": "192.168.16.10",
"app": "live",
"stream": "xxx224",
"url": "rtsp://admin:admin@192.168.11.224:554/h266/ch1/main/av_stream",
"secret": "CCCOuGTsZG7EZoHtt1l6HUmbBW6xP4ri"
},
{
"vhost": "192.168.16.10",
"app": "live",
"stream": "xxx223",
"url": "rtsp://admin:admin@192.168.11.223:554/h266/ch1/main/av_stream",
"secret": "CCCOuGTsZG7EZoHtt1l6HUmbBW6xP4ri"
}
]

⚠️ 注意事项:

  • 确保字段与 ZLMediaKit API 文档要求一致
  • 敏感信息建议设置文件权限:chmod 600 streams.json
  • 建议将文件存储在安全目录(如 /etc/zlmediakit/

3. 创建恢复脚本 restore_zlmediakit.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

# 检查 jq 是否安装
if ! command -v jq &> /dev/null; then
echo "错误:jq 未安装,请先执行安装步骤"
exit 1
fi

# JSON 文件路径
CONFIG_FILE="/path/to/streams.json"

# API 地址(根据实际环境修改端口)
API_URL="http://127.0.0.1:8080/index/api/addStreamProxy"

# 读取配置并逐条添加
jq -c '.[]' "$CONFIG_FILE" | while read -r item; do
curl -s -X POST "$API_URL" \
-H "Content-Type: application/json" \
-d "$item"
done

echo "拉流配置恢复完成"

📝 使用说明:

  • 修改 CONFIG_FILE 为实际存储路径
  • 确认 API_URL 的端口号与配置文件一致
  • 添加执行权限:chmod +x restore_zlmediakit.sh

4. 配置开机自启动

方法一:通过 crontab

1
2
3
4
5
# 编辑 crontab
crontab -e

# 添加以下内容(注意修改脚本实际路径)
@reboot /absolute/path/to/restore_zlmediakit.sh >> /var/log/zlmediakit_restore.log 2>&1

方法二:创建 systemd 服务

1
2
3
4
5
6
7
8
9
10
11
12
# /etc/systemd/system/zlmediakit-restore.service
[Unit]
Description=ZLMediaKit Pull Stream Restorer
After=network.target

[Service]
ExecStart=/absolute/path/to/restore_zlmediakit.sh
User=your_user
Environment="PATH=/usr/bin:/usr/local/bin"

[Install]
WantedBy=multi-user.target
1
2
# 启用服务
sudo systemctl enable zlmediakit-restore

验证与维护

手动测试脚本

1
2
./restore_zlmediakit.sh
# 检查返回结果或查看 ZLMediaKit 日志

查看运行状态

1
2
3
# 如果使用 systemd
systemctl status zlmediakit-restore
journalctl -u zlmediakit-restore

日志分析

  • 默认日志路径:/var/log/zlmediakit/
  • 关注 API 返回状态码(200 表示成功)

注意事项

必须验证项

  • ✅ ZLMediaKit API 端点地址和端口
  • ✅ 流媒体服务器 IP 地址是否固定
  • ✅ 网络策略是否允许本地回环访问(127.0.0.1)

安全加固(可选)

1
2
3
4
# 设置脚本权限
chmod 700 restore_zlmediakit.sh
# 设置配置文件权限
chmod 600 streams.json

原理:读取系统相关登入、安全日志,调用防火墙禁止频繁登入失败的IP。

目的:

Nginx 配置 SSL,透传到 后端。 根据不同的域名转发到不同的后端。

配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
user  root;
worker_processes auto;
events {
worker_connections 1024;
}
stream {
log_format basic '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$ssl_preread_server_name" "$name"';
access_log /var/log/nginx/stream_access.log basic;

map $ssl_server_name $name {
# hostnames;
default app_default_backend;
app.ownding.com.cn app1_backend;
www.ownding.com.cn app2_backend;
}
upstream app1_backend {
server 192.168.0.117:30080 weight=5 max_fails=1 fail_timeout=10s;
}
upstream app2_backend {
server 192.168.0.117:30081 weight=5 max_fails=1 fail_timeout=10s;
}
upstream app_default_backend {
server 192.168.0.117:30081;
}
server {
listen 31180 ssl;
ssl_certificate /home/cert/scs1687747992522__.ownding.com.cn_server.crt;
ssl_certificate_key /home/cert/scs1687747992522__.ownding.com.cn_server.key;
proxy_pass $name;
}
}

遇到的错误:

1
curl: (60) SSL certificate problem: unable to get local issuer certificate

说明 curl 在验证服务器证书时找不到对应的 CA 根证书,也就是说你的系统没有信任该网站所使用的证书签发机构(CA)。


✅ 你有根证书,可以手动添加到 Ubuntu 系统的信任库中,以下是完整解决步骤:


🔧 步骤 1:确认你有 CA 的根证书文件

你可能有一个 .crt.pem 文件,例如:

1
my-ca.crt

如果没有,请从你的证书颁发机构获取。


🔧 步骤 2:将证书复制到系统证书目录

以 root 权限执行以下命令:

1
sudo cp my-ca.crt /usr/local/share/ca-certificates/

注意:

  • 证书文件名必须是 .crt 后缀;
  • 推荐放在 /usr/local/share/ca-certificates/ 目录下。

🔧 步骤 3:更新系统证书信任库

运行以下命令更新系统的 CA 信任列表:

1
sudo update-ca-certificates

输出类似:

1
2
3
4
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

这表示你的证书已成功加入系统信任链。


✅ 验证是否生效

再次运行你的 curl 命令:

1
curl -v https://vpn.ownding.xyz

如果一切正常,就不会再报 unable to get local issuer certificate 错误了。


📌 补充说明

如果你使用的是自签名证书:

  • 你也需要把服务端使用的 服务器证书本身 添加为信任证书,或者在客户端使用 --cacert 指定它:
1
curl --cacert /path/to/server.crt https://vpn.ownding.xyz

🛡️ 安全提示

  • 不要随意添加不可信的证书到系统信任库,这会带来安全风险。
  • --insecure(即 -k)参数虽然能绕过证书验证,但不建议在生产环境中使用。

✅ 总结

问题 解决方式
curl 报错 unable to get local issuer certificate 将根证书添加到系统信任库
有根证书怎么处理? 复制到 /usr/local/share/ca-certificates/ 并运行 update-ca-certificates

  • 1、在某一个客户端(路由器/网关)端生成 ipv6 子网

使用命令:tailscale debug via 7 192.168.6.0/24

其中 7siteID,可自行填写 0-60000之间的数值。

生产 ipv6 子网后,需要在客户端重新宣告子网。

tailscale set --advertise-routes=ipv6子网

openwrt

  • 2、在 headscale 服务端允许 子网

我使用 docker 部署的 headscale 服务端,使用如下命令开启子网。

docker exec headscale headscale routes enable -r 2

openwrt

  • 3、根据 计算方法获取 下挂设备的 ipv6地址:

比如 192.168.4.146 对应的地址 ipv6 地址是 :fd7a:115c:a1e0:b1a:0:7:c0a8:692

参考链接: http://www.ownding.com/2025/06/05/Tailscale-4via6-%E5%8A%9F%E8%83%BD-IP%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2%E8%A7%84%E5%88%99/

  • 4、测试 ipv6 地址访问

ipv6

问题:

点击 Trae AI 的“登入”,正常情况下,会自动打开浏览器进行登入,登入成功后浏览器会通知 Trae 登入完成,然后完成登入。 但是此次点击“登入”一直无法打开浏览器。
同时可扩展到其它软件点击登入后无法调用到windows系统浏览器的情况。

Trae AI

原因

之前安装过 夸克网盘(后来删除),被修改了注册表
计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice
ProgId 的值为 QuarkHTM 导致无法启动 Edge 浏览器。

解决

将注册表中 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoiceProgId 值修改为 MSEdgeHTM

regi

问题:

使用 ctr image import a.tar 后,crictl 查看没有显示刚刚导入的镜像。但是使用 ctr i list 可以查看镜像,不过也看不到 crictl 中的镜像。

原因:

使用的containerd不同导致的。

解决:

导入时指定k3s的containerd,
ctr -n k8s.io -a /run/k3s/containerd/containerd.sock image import app2.tar

注意:

当tar包没有tag信息时,导入之后,无报错,errno 为0,但是 通过 ctr images ls 查看却没有相关的镜像。这种情况,需要添加 --digests=true 来导入:
ctr image import --digests=true <path/to/images/file>

问题描述

执行任何 kubectl 命令时都会报错,比如执行 kubectl get node 命令时提示错误信息: Unable to connect to the server: x509: certificate has expired or is not yet valid

证书有效期查询:

1
for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done

官网方法:

下面的命令不能更新 server-ca.crt ,可以轮换的证书:admin、api-server、controller-manager、scheduler、k3s-controller, k3s-server, cloud-controller, etcd, auth-proxy, kubelet,kube-proxy

1
2
3
4
5
6
7
8
# 停止 K3s
systemctl stop k3s

# 轮换证书
k3s certificate rotate

# 启动 K3s
systemctl start k3s

其它方法:

1
2
3
4
5
6
7
8
9
10
11
#删掉 secret k3s-serving
kubectl --insecure-skip-tls-verify -n kube-system delete secrets k3s-serving

#删掉 系统中的文件dynamic-cert.json
rm -f /var/lib/rancher/k3s/server/tls/dynamic-cert.json

#删掉目前k3s 进程,可以不用该步骤
#sudo /usr/local/bin/k3s-killall.sh

#重启 k3s 进程
sudo systemctl restart k3s

验证:

  • 1、将系统时间设置成证书快到期前1个月,然后重启k3s
  • 2、重启后浏览证书时间,发现证书的有效期自动延期1年,server-ca证书延期到10年
  • 3、再将时间设置成30年后,使用kubectl命令出现证书错误,但是部署的程序仍可以访问
  • 4、证书过期后,使用 systemctl restart k3s 命令,会卡住
  • 5、证书过期后,将时间设置成证书过期前的时间,程序恢复正常

长时间证书的简单方法

  • 1、将服务器时间调整到30年后
  • 2、更新证书
  • 3、调整到当前的时间
0%