<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title></title><link>https://teddyou.com/</link><description>Hello World！</description><item><title>Nginx + Flask 并发能力与扩展思路（草稿/未完全论证）</title><link>https://teddyou.com/?id=184</link><description>&lt;p&gt;&lt;/p&gt;&lt;h2&gt;1. 并发到底指什么？（先统一概念）&lt;/h2&gt;&lt;p&gt;日常说“并发 1000”，经常会混淆两件事：&lt;/p&gt;&lt;h3&gt;1）并发连接数（Concurrent Connections）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;同时有 1000 个客户端保持连接（例如 HTTP keep-alive、WebSocket、长轮询）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：连接在，但不一定都在做计算&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;2）并发执行中的请求数（In-flight Requests）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;同时有 1000 个请求正在被后端处理（查库/计算/调用外部接口）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：真正消耗 CPU / IO / DB&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这两种“1000并发”，难度完全不同：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;✅ 1000 连接并发：对 Nginx 来说通常不算大&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;⚠️ 1000 请求同时执行：大概率会卡在后端 worker 或数据库&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;2. Flask 自己能跑多大并发？&lt;/h2&gt;&lt;h3&gt;2.1 Flask 开发模式（flask run / python app.py）&lt;/h3&gt;&lt;p&gt;这属于开发服务器，特点：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;单进程为主&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;并发能力弱&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;不适合生产&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;经验上：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;几十并发以内还能凑合&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;再高容易出现排队、超时、卡死&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;结论：&lt;strong&gt;生产环境不要用 Flask 自带运行方式扛并发。&lt;/strong&gt;&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;3. 生产级部署：Gunicorn 是核心&lt;/h2&gt;&lt;h3&gt;3.1 Gunicorn 是什么？&lt;/h3&gt;&lt;p&gt;Gunicorn 可以理解为：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Flask 是应用逻辑&lt;/strong&gt;&lt;br/&gt;&lt;strong&gt;Gunicorn 是生产级运行容器（多进程/多线程/更稳定）&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;它负责把 Flask 稳定跑起来，并支持并发能力扩展。&lt;/p&gt;&lt;hr/&gt;&lt;h3&gt;3.2 并发上限大致怎么算？&lt;/h3&gt;&lt;p&gt;在最常见的 Gunicorn sync 模型下：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;一个 worker 同时只能处理 1 个请求&lt;br/&gt;所以：&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;并发执行数 ≈ worker 数量&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;如果加线程：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;并发执行数 ≈ workers × threads&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;举例：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;9 workers × 8 threads = 72 个请求“同时在执行”&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;注意：&lt;br/&gt;这不等于系统只能支撑 72 人访问，而是指 &lt;strong&gt;72 个请求同时处理&lt;/strong&gt;。&lt;br/&gt;如果接口很快，吞吐（RPS）可能仍然很高。&lt;/p&gt;&lt;hr/&gt;&lt;h3&gt;3.3 推荐启动方式（通用 IO 型后端）&lt;/h3&gt;&lt;p&gt;适用于常见的：查 MySQL、读 Redis、请求外部接口 的后台接口&lt;/p&gt;&lt;pre&gt;gunicorn&amp;nbsp;app:app&amp;nbsp;-w&amp;nbsp;9&amp;nbsp;--threads&amp;nbsp;8&amp;nbsp;-b&amp;nbsp;127.0.0.1:5000&amp;nbsp;--timeout&amp;nbsp;60&lt;/pre&gt;&lt;p&gt;解释：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;-w 9&lt;/code&gt;：worker 进程数（常见经验：2*CPU+1）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;--threads 8&lt;/code&gt;：每个 worker 再开线程，提升 IO 并发&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;-b 127.0.0.1:5000&lt;/code&gt;：只给 Nginx 反代用，更安全&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h3&gt;3.4 什么时候考虑 gevent？&lt;/h3&gt;&lt;p&gt;如果你的请求大部分都在 “等待 IO”，比如：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;等数据库返回&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;等外部 HTTP 返回&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;等队列返回&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;可考虑：&lt;/p&gt;&lt;pre&gt;gunicorn&amp;nbsp;app:app&amp;nbsp;-k&amp;nbsp;gevent&amp;nbsp;-w&amp;nbsp;4&amp;nbsp;--worker-connections&amp;nbsp;2000&amp;nbsp;-b&amp;nbsp;127.0.0.1:5000&amp;nbsp;--timeout&amp;nbsp;60&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 注意：gevent 更适合“等待型业务”，如果是大量 CPU 运算，它也救不了。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;4. Nginx + Flask 能不能扛“1000并发”？&lt;/h2&gt;&lt;h3&gt;4.1 如果是 1000 个连接并发&lt;/h3&gt;&lt;p&gt;✅ 结论：&lt;strong&gt;可以&lt;/strong&gt;&lt;br/&gt;Nginx 专门擅长处理大量连接。&lt;/p&gt;&lt;h3&gt;4.2 如果是 1000 个请求同时在执行&lt;/h3&gt;&lt;p&gt;⚠️ 结论：&lt;strong&gt;单机大概率不稳&lt;/strong&gt;&lt;br/&gt;原因通常不是 Flask，而是：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;Gunicorn worker/thread 数不够&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;慢 SQL 导致请求堆积&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;外部接口过慢导致请求挂起&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;日志过重造成 IO 阻塞&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据库先撑不住&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;真正要实现“1000请求同时执行”，往往必须：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;缓存（Redis）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;异步队列&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;多机扩容&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;5. 那“标准后端”比如 PHP 呢？&lt;/h2&gt;&lt;p&gt;PHP 的生产模式通常是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Nginx/Apache + PHP-FPM&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;5.1 PHP 并发的核心参数&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;pm.max_children = 可同时处理的请求数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;每个 child 本质也是 “一次处理一个请求”，所以：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;并发执行数 ≈ pm.max_children&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这与 Flask 的 sync worker 思路非常类似。&lt;/p&gt;&lt;h3&gt;5.2 为什么很多 PHP 网站看起来很能扛？&lt;/h3&gt;&lt;p&gt;因为真实承压大头被分走了：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;静态资源 Nginx 扛&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;页面缓存扛&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;OPcache 加速&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Redis 缓存热点接口&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据库查询优化&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;所以“1000在线”不代表“1000请求同时跑 PHP”。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;6. 单机多线程够了吗？还是必须分布式？&lt;/h2&gt;&lt;p&gt;结论偏工程经验：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;多线程/多进程属于纵向扩展（榨干单机）&lt;/strong&gt;&lt;br/&gt;&lt;strong&gt;多主机+负载均衡属于横向扩展（规模上限更高、更稳定）&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;如果目标是：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;只是让系统更快、更稳：&lt;strong&gt;单机优化 + 缓存&lt;/strong&gt; 可能就够了&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;真的要在高峰稳定抗住大流量：&lt;strong&gt;最终一定会走到多机 + LB + 缓存 + 队列&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;7. 多后端实例，登录怎么同步？&lt;/h2&gt;&lt;p&gt;这是扩容时的必答题：&lt;br/&gt;&lt;strong&gt;后端一旦多实例，登录状态必须共享，否则会随机掉线。&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;7.1 两条主流路线&lt;/h3&gt;&lt;h4&gt;方案 A：Session 共享（Redis Session）&lt;/h4&gt;&lt;p&gt;浏览器只保存 session_id，登录数据放 Redis，所有后端都能查到。&lt;/p&gt;&lt;p&gt;优点：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;✅ 最像传统后台登录&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;✅ 支持踢人（删 Redis session）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;✅ 适合面板类系统（非常推荐）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;实现思路（示例）：&lt;/p&gt;&lt;pre&gt;pip&amp;nbsp;install&amp;nbsp;flask-session&amp;nbsp;redis&lt;/pre&gt;&lt;pre&gt;from&amp;nbsp;flask&amp;nbsp;import&amp;nbsp;Flask
from&amp;nbsp;flask_session&amp;nbsp;import&amp;nbsp;Session
import&amp;nbsp;redis

app&amp;nbsp;=&amp;nbsp;Flask(__name__)
app.secret_key&amp;nbsp;=&amp;nbsp;&amp;quot;YOUR_SECRET_KEY&amp;quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;所有后端实例必须一致

app.config[&amp;quot;SESSION_TYPE&amp;quot;]&amp;nbsp;=&amp;nbsp;&amp;quot;redis&amp;quot;
app.config[&amp;quot;SESSION_REDIS&amp;quot;]&amp;nbsp;=&amp;nbsp;redis.Redis(host=&amp;quot;127.0.0.1&amp;quot;,&amp;nbsp;port=6379,&amp;nbsp;db=0)
app.config[&amp;quot;SESSION_PERMANENT&amp;quot;]&amp;nbsp;=&amp;nbsp;True
app.config[&amp;quot;PERMANENT_SESSION_LIFETIME&amp;quot;]&amp;nbsp;=&amp;nbsp;3600

Session(app)&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 关键点：&lt;strong&gt;所有实例的 secret_key 必须完全一致&lt;/strong&gt;&lt;br/&gt;不一致会导致 cookie 校验失败，登录随机失效。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h4&gt;方案 B：JWT / Token 无状态登录&lt;/h4&gt;&lt;p&gt;登录后发 token，客户端每次请求携带 token，后端只验签。&lt;/p&gt;&lt;p&gt;优点：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;✅ 完全无状态，天然适合水平扩容&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;✅ API 体系非常舒服&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;缺点：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;⚠️ 需要额外设计“踢人/失效机制”（黑名单、token_version）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h3&gt;7.2 Sticky 会话（不推荐）&lt;/h3&gt;&lt;p&gt;负载均衡把同一个用户一直粘到同一台后端。&lt;/p&gt;&lt;p&gt;问题：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;扩容缩容麻烦&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;机器重启用户就掉线&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;本质不是同步，只是绕开同步&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;只适合临时救急，不适合作为长期架构。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;8. 推荐的“低成本可扩展”架构&lt;/h2&gt;&lt;p&gt;一个现实可落地的组合：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;✅ Nginx（入口、TLS、限流）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;✅ 多台 Flask（Gunicorn）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;✅ Redis（Session共享 + 缓存热点接口）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;✅ MySQL（用户/权限数据统一存储）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;✅ 队列（导出、统计、慢任务异步化）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这套结构不会复杂到“微服务地狱”，但扩展能力很强。&lt;/p&gt;</description><pubDate>Mon, 19 Jan 2026 11:15:20 +0800</pubDate></item><item><title>CentOS 7 部署 WireGuard（RPM 安装 + 分流不影响互联网 + 一键新增用户脚本）</title><link>https://teddyou.com/?id=183</link><description>&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;1）目标与原则&lt;/h2&gt;&lt;h3&gt;目标&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;CentOS 7 上跑 WireGuard 服务器（wg0）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Windows / Linux 客户端接入&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;只让指定网段走隧道（Split Tunnel）&lt;/strong&gt;，不影响正常上网&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;核心原则（分流）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;客户端配置里 &lt;strong&gt;AllowedIPs 写什么，就只路由什么&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;不想影响互联网：&lt;strong&gt;不要写 &lt;code inline=&quot;&quot;&gt;0.0.0.0/0&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;2）准备：确认系统与内核&lt;/h2&gt;&lt;pre&gt;cat&amp;nbsp;/etc/redhat-release
uname&amp;nbsp;-r&lt;/pre&gt;&lt;p&gt;CentOS7 上 WireGuard 的 kmod 模块经常是“按内核版本编译”的，所以 &lt;code inline=&quot;&quot;&gt;uname -r&lt;/code&gt; 要记住。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;3）安装：从 3 个 RPM 包开始（推荐本地安装）&lt;/h2&gt;&lt;h3&gt;3.1 创建目录&lt;/h3&gt;&lt;pre&gt;mkdir&amp;nbsp;-p&amp;nbsp;/root/wg_rpm
cd&amp;nbsp;/root/wg_rpm&lt;/pre&gt;&lt;h3&gt;3.2 下载 3 个包&lt;/h3&gt;&lt;p&gt;这 3 个是常用的最小组合：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;wireguard-tools&lt;/code&gt;：wg / wg-quick 工具&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;kmod-wireguard&lt;/code&gt;：元包（壳）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;wireguard&lt;/code&gt;：noarch（提供 common 依赖）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;#&amp;nbsp;wireguard-tools（工具）
curl&amp;nbsp;-LO&amp;nbsp;&amp;quot;https://mirrors.aliyun.com/elrepo/elrepo/el7/x86_64/RPMS/wireguard-tools-1.0.20210914-1.el7.x86_64.rpm&amp;quot;

#&amp;nbsp;kmod&amp;nbsp;元包（依赖壳）
curl&amp;nbsp;-LO&amp;nbsp;&amp;quot;https://mirrors.aliyun.com/rpmfusion/free/el/updates/7/x86_64/k/kmod-wireguard-1.0.20201221-1.el7.x86_64.rpm&amp;quot;

#&amp;nbsp;wireguard&amp;nbsp;noarch（common&amp;nbsp;依赖）
curl&amp;nbsp;-LO&amp;nbsp;&amp;quot;https://mirrors.aliyun.com/rpmfusion/free/el/updates/7/x86_64/w/wireguard-1.0.20201221-1.el7.noarch.rpm&amp;quot;&lt;/pre&gt;&lt;h3&gt;3.3 关键：下载“内核绑定模块包”&lt;/h3&gt;&lt;p&gt;你 &lt;code inline=&quot;&quot;&gt;uname -r&lt;/code&gt; 如果是 &lt;code inline=&quot;&quot;&gt;3.10.0-1160.el7.x86_64&lt;/code&gt;，就下载：&lt;/p&gt;&lt;pre&gt;curl&amp;nbsp;-LO&amp;nbsp;&amp;quot;https://mirrors.aliyun.com/rpmfusion/free/el/updates/7/x86_64/k/kmod-wireguard-3.10.0-1160.el7.x86_64-1.0.20201221-1.el7.x86_64.rpm&amp;quot;&lt;/pre&gt;&lt;p&gt;如果不是 1160，把文件名里的 &lt;code inline=&quot;&quot;&gt;3.10.0-1160.el7.x86_64&lt;/code&gt; 换成你实际内核版本。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;你之前报错“需要：kmod-wireguard-3.10.0-1160...”就是因为只装了元包，没有装这个“内核绑定包”。&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;3.4 一次性安装&lt;/h3&gt;&lt;pre&gt;yum&amp;nbsp;localinstall&amp;nbsp;-y&amp;nbsp;./*.rpm&lt;/pre&gt;&lt;h3&gt;3.5 验证&lt;/h3&gt;&lt;pre&gt;modprobe&amp;nbsp;wireguard
lsmod&amp;nbsp;|&amp;nbsp;grep&amp;nbsp;wireguard&amp;nbsp;||&amp;nbsp;echo&amp;nbsp;&amp;quot;wireguard&amp;nbsp;module&amp;nbsp;not&amp;nbsp;loaded&amp;quot;
wg&amp;nbsp;--version&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;4）服务端配置（CentOS7）&lt;/h2&gt;&lt;p&gt;下面以一个简单网段为例：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;WireGuard 虚拟网段：&lt;code inline=&quot;&quot;&gt;10.66.66.0/24&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;服务器 wg0：&lt;code inline=&quot;&quot;&gt;10.66.66.1&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;第 1 个客户端：&lt;code inline=&quot;&quot;&gt;10.66.66.2&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;4.1 生成密钥（务必分清 .key / .pub）&lt;/h3&gt;&lt;pre&gt;mkdir&amp;nbsp;-p&amp;nbsp;/etc/wireguard
cd&amp;nbsp;/etc/wireguard
umask&amp;nbsp;077

wg&amp;nbsp;genkey&amp;nbsp;|&amp;nbsp;tee&amp;nbsp;server.key&amp;nbsp;|&amp;nbsp;wg&amp;nbsp;pubkey&amp;nbsp;&amp;gt;&amp;nbsp;server.pub
wg&amp;nbsp;genkey&amp;nbsp;|&amp;nbsp;tee&amp;nbsp;client.key&amp;nbsp;|&amp;nbsp;wg&amp;nbsp;pubkey&amp;nbsp;&amp;gt;&amp;nbsp;client.pub

echo&amp;nbsp;&amp;quot;===&amp;nbsp;server.key(私钥)&amp;nbsp;===&amp;quot;;&amp;nbsp;cat&amp;nbsp;server.key
echo&amp;nbsp;&amp;quot;===&amp;nbsp;server.pub(公钥)&amp;nbsp;===&amp;quot;;&amp;nbsp;cat&amp;nbsp;server.pub
echo&amp;nbsp;&amp;quot;===&amp;nbsp;client.key(私钥)&amp;nbsp;===&amp;quot;;&amp;nbsp;cat&amp;nbsp;client.key
echo&amp;nbsp;&amp;quot;===&amp;nbsp;client.pub(公钥)&amp;nbsp;===&amp;quot;;&amp;nbsp;cat&amp;nbsp;client.pub&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;只记一句：&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;PrivateKey&lt;/code&gt; 填 &lt;code inline=&quot;&quot;&gt;.key&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;PublicKey&lt;/code&gt; 填 &lt;code inline=&quot;&quot;&gt;.pub&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;4.2 写服务端 &lt;code inline=&quot;&quot;&gt;/etc/wireguard/wg0.conf&lt;/code&gt;&lt;/h3&gt;&lt;pre&gt;vim&amp;nbsp;/etc/wireguard/wg0.conf&lt;/pre&gt;&lt;p&gt;内容：&lt;/p&gt;&lt;pre&gt;[Interface]
Address&amp;nbsp;=&amp;nbsp;10.66.66.1/24
ListenPort&amp;nbsp;=&amp;nbsp;51820
PrivateKey&amp;nbsp;=&amp;nbsp;&amp;lt;填&amp;nbsp;server.key&amp;nbsp;内容&amp;gt;

[Peer]
PublicKey&amp;nbsp;=&amp;nbsp;&amp;lt;填&amp;nbsp;client.pub&amp;nbsp;内容&amp;gt;
AllowedIPs&amp;nbsp;=&amp;nbsp;10.66.66.2/32&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;建议不要写 &lt;code inline=&quot;&quot;&gt;SaveConfig = true&lt;/code&gt;，容易出现“文件改了但运行态还是旧 peer”的坑。&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;4.3 启动与开机自启&lt;/h3&gt;&lt;pre&gt;wg-quick&amp;nbsp;up&amp;nbsp;wg0
systemctl&amp;nbsp;enable&amp;nbsp;wg-quick@wg0&lt;/pre&gt;&lt;p&gt;验证：&lt;/p&gt;&lt;pre&gt;ip&amp;nbsp;addr&amp;nbsp;show&amp;nbsp;wg0
ss&amp;nbsp;-lunp&amp;nbsp;|&amp;nbsp;grep&amp;nbsp;51820
wg&amp;nbsp;show&amp;nbsp;wg0&lt;/pre&gt;&lt;h3&gt;4.4 放行 UDP 51820&lt;/h3&gt;&lt;p&gt;firewalld：&lt;/p&gt;&lt;pre&gt;firewall-cmd&amp;nbsp;--add-port=51820/udp&amp;nbsp;--permanent
firewall-cmd&amp;nbsp;--reload&lt;/pre&gt;&lt;p&gt;如果你用 iptables，测试先粗放（后面再细化）：&lt;/p&gt;&lt;pre&gt;iptables&amp;nbsp;-I&amp;nbsp;INPUT&amp;nbsp;-p&amp;nbsp;udp&amp;nbsp;--dport&amp;nbsp;51820&amp;nbsp;-j&amp;nbsp;ACCEPT
iptables&amp;nbsp;-I&amp;nbsp;INPUT&amp;nbsp;-i&amp;nbsp;wg0&amp;nbsp;-j&amp;nbsp;ACCEPT
iptables&amp;nbsp;-I&amp;nbsp;INPUT&amp;nbsp;-i&amp;nbsp;wg0&amp;nbsp;-p&amp;nbsp;icmp&amp;nbsp;-j&amp;nbsp;ACCEPT&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;5）客户端配置（Windows / Linux）&lt;/h2&gt;&lt;p&gt;Windows WireGuard 新建 tunnel，粘贴（示例）：&lt;/p&gt;&lt;pre&gt;[Interface]
PrivateKey&amp;nbsp;=&amp;nbsp;&amp;lt;填&amp;nbsp;client.key&amp;nbsp;内容&amp;gt;
Address&amp;nbsp;=&amp;nbsp;10.66.66.2/24

[Peer]
PublicKey&amp;nbsp;=&amp;nbsp;&amp;lt;填&amp;nbsp;server.pub&amp;nbsp;内容&amp;gt;
Endpoint&amp;nbsp;=&amp;nbsp;你的服务器公网IP:51820
PersistentKeepalive&amp;nbsp;=&amp;nbsp;25

#&amp;nbsp;分流：只走&amp;nbsp;10.66.66.0/24，不影响互联网
AllowedIPs&amp;nbsp;=&amp;nbsp;10.66.66.0/24&lt;/pre&gt;&lt;p&gt;验证：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;Windows：&lt;code inline=&quot;&quot;&gt;ping 10.66.66.1&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;服务器：&lt;code inline=&quot;&quot;&gt;wg show wg0&lt;/code&gt; 看 &lt;code inline=&quot;&quot;&gt;latest handshake&lt;/code&gt; 与 &lt;code inline=&quot;&quot;&gt;transfer&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;6）一键新增用户脚本（自动分配 IP + 生成客户端配置 + 热加载）&lt;/h2&gt;&lt;p&gt;把下面脚本保存为：&lt;code inline=&quot;&quot;&gt;/root/add_wg_user.sh&lt;/code&gt;&lt;/p&gt;&lt;pre&gt;#!/usr/bin/env&amp;nbsp;bash
set&amp;nbsp;-euo&amp;nbsp;pipefail

WG_IF=&amp;quot;wg0&amp;quot;
WG_DIR=&amp;quot;/etc/wireguard&amp;quot;
WG_CONF=&amp;quot;${WG_DIR}/${WG_IF}.conf&amp;quot;

NET_PREFIX=&amp;quot;10.66.66&amp;quot;
CIDR=&amp;quot;24&amp;quot;
SERVER_IP_LAST=&amp;quot;1&amp;quot;

DEFAULT_ALLOWED_IPS=&amp;quot;${NET_PREFIX}.0/${CIDR}&amp;quot;
DEFAULT_ENDPOINT=&amp;quot;110.42.98.59:51820&amp;quot;

usage()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;cat&amp;nbsp;&amp;lt;&amp;lt;EOF
用法：
&amp;nbsp;&amp;nbsp;$0&amp;nbsp;&amp;lt;username&amp;gt;&amp;nbsp;[--ip-last&amp;nbsp;N]&amp;nbsp;[--endpoint&amp;nbsp;IP:PORT]&amp;nbsp;[--allowed&amp;nbsp;&amp;quot;10.66.66.0/24,192.168.10.0/24&amp;quot;]

示例：
&amp;nbsp;&amp;nbsp;$0&amp;nbsp;user3
&amp;nbsp;&amp;nbsp;$0&amp;nbsp;user4&amp;nbsp;--ip-last&amp;nbsp;10
&amp;nbsp;&amp;nbsp;$0&amp;nbsp;user5&amp;nbsp;--allowed&amp;nbsp;&amp;quot;10.66.66.0/24,192.168.10.0/24&amp;quot;
&amp;nbsp;&amp;nbsp;$0&amp;nbsp;user6&amp;nbsp;--endpoint&amp;nbsp;&amp;quot;1.2.3.4:51820&amp;quot;
EOF
}

die()&amp;nbsp;{&amp;nbsp;echo&amp;nbsp;&amp;quot;ERROR:&amp;nbsp;$*&amp;quot;&amp;nbsp;&amp;gt;&amp;amp;2;&amp;nbsp;exit&amp;nbsp;1;&amp;nbsp;}

[[&amp;nbsp;$#&amp;nbsp;-lt&amp;nbsp;1&amp;nbsp;]]&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;usage&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;exit&amp;nbsp;1
NAME=&amp;quot;$1&amp;quot;;&amp;nbsp;shift
[[&amp;nbsp;&amp;quot;$NAME&amp;quot;&amp;nbsp;=~&amp;nbsp;^[a-zA-Z0-9._-]+$&amp;nbsp;]]&amp;nbsp;||&amp;nbsp;die&amp;nbsp;&amp;quot;username&amp;nbsp;只能包含字母数字&amp;nbsp;.&amp;nbsp;_&amp;nbsp;-&amp;quot;

IP_LAST=&amp;quot;&amp;quot;
ENDPOINT=&amp;quot;$DEFAULT_ENDPOINT&amp;quot;
ALLOWED_IPS=&amp;quot;$DEFAULT_ALLOWED_IPS&amp;quot;

while&amp;nbsp;[[&amp;nbsp;$#&amp;nbsp;-gt&amp;nbsp;0&amp;nbsp;]];&amp;nbsp;do
&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;$1&amp;quot;&amp;nbsp;in
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--ip-last)&amp;nbsp;IP_LAST=&amp;quot;${2:-}&amp;quot;;&amp;nbsp;shift&amp;nbsp;2&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--endpoint)&amp;nbsp;ENDPOINT=&amp;quot;${2:-}&amp;quot;;&amp;nbsp;shift&amp;nbsp;2&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--allowed)&amp;nbsp;ALLOWED_IPS=&amp;quot;${2:-}&amp;quot;;&amp;nbsp;shift&amp;nbsp;2&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-h|--help)&amp;nbsp;usage;&amp;nbsp;exit&amp;nbsp;0&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*)&amp;nbsp;die&amp;nbsp;&amp;quot;未知参数：$1（用&amp;nbsp;-h&amp;nbsp;查看帮助）&amp;quot;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;esac
done

[[&amp;nbsp;-f&amp;nbsp;&amp;quot;$WG_CONF&amp;quot;&amp;nbsp;]]&amp;nbsp;||&amp;nbsp;die&amp;nbsp;&amp;quot;找不到&amp;nbsp;$WG_CONF&amp;quot;

#&amp;nbsp;读取服务器公钥（优先用&amp;nbsp;server.pub）
SERVER_PUB=&amp;quot;&amp;quot;
if&amp;nbsp;[[&amp;nbsp;-f&amp;nbsp;&amp;quot;${WG_DIR}/server.pub&amp;quot;&amp;nbsp;]];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;SERVER_PUB=&amp;quot;$(tr&amp;nbsp;-d&amp;nbsp;&amp;#39;\r\n&amp;#39;&amp;nbsp;&amp;lt;&amp;nbsp;&amp;quot;${WG_DIR}/server.pub&amp;quot;)&amp;quot;
else
&amp;nbsp;&amp;nbsp;if&amp;nbsp;ip&amp;nbsp;link&amp;nbsp;show&amp;nbsp;&amp;quot;$WG_IF&amp;quot;&amp;nbsp;&amp;gt;/dev/null&amp;nbsp;2&amp;gt;&amp;amp;1;&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SERVER_PUB=&amp;quot;$(wg&amp;nbsp;show&amp;nbsp;&amp;quot;$WG_IF&amp;quot;&amp;nbsp;public-key&amp;nbsp;2&amp;gt;/dev/null&amp;nbsp;||&amp;nbsp;true)&amp;quot;
&amp;nbsp;&amp;nbsp;fi
fi
[[&amp;nbsp;-n&amp;nbsp;&amp;quot;$SERVER_PUB&amp;quot;&amp;nbsp;]]&amp;nbsp;||&amp;nbsp;die&amp;nbsp;&amp;quot;读取服务器公钥失败（建议放&amp;nbsp;${WG_DIR}/server.pub）&amp;quot;

#&amp;nbsp;自动分配下一个可用&amp;nbsp;IP
if&amp;nbsp;[[&amp;nbsp;-z&amp;nbsp;&amp;quot;$IP_LAST&amp;quot;&amp;nbsp;]];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;USED_LASTS=&amp;quot;$(grep&amp;nbsp;-Eo&amp;nbsp;&amp;quot;${NET_PREFIX}\.[0-9]{1,3}/32&amp;quot;&amp;nbsp;&amp;quot;$WG_CONF&amp;quot;&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;awk&amp;nbsp;-F&amp;#39;[./]&amp;#39;&amp;nbsp;&amp;#39;{print&amp;nbsp;$4}&amp;#39;&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;sort&amp;nbsp;-n&amp;nbsp;|&amp;nbsp;uniq&amp;nbsp;||&amp;nbsp;true)&amp;quot;

&amp;nbsp;&amp;nbsp;for&amp;nbsp;n&amp;nbsp;in&amp;nbsp;$(seq&amp;nbsp;2&amp;nbsp;254);&amp;nbsp;do
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[[&amp;nbsp;&amp;quot;$n&amp;quot;&amp;nbsp;==&amp;nbsp;&amp;quot;$SERVER_IP_LAST&amp;quot;&amp;nbsp;]]&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;$USED_LASTS&amp;quot;&amp;nbsp;|&amp;nbsp;grep&amp;nbsp;-qx&amp;nbsp;&amp;quot;$n&amp;quot;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IP_LAST=&amp;quot;$n&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;done
fi

[[&amp;nbsp;-n&amp;nbsp;&amp;quot;$IP_LAST&amp;quot;&amp;nbsp;]]&amp;nbsp;||&amp;nbsp;die&amp;nbsp;&amp;quot;没有可用&amp;nbsp;IP&amp;nbsp;了（10.66.66.2~254&amp;nbsp;都被占用）&amp;quot;
[[&amp;nbsp;&amp;quot;$IP_LAST&amp;quot;&amp;nbsp;=~&amp;nbsp;^[0-9]+$&amp;nbsp;]]&amp;nbsp;||&amp;nbsp;die&amp;nbsp;&amp;quot;--ip-last&amp;nbsp;必须是数字&amp;quot;
((&amp;nbsp;IP_LAST&amp;nbsp;&amp;gt;=&amp;nbsp;2&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;IP_LAST&amp;nbsp;&amp;lt;=&amp;nbsp;254&amp;nbsp;))&amp;nbsp;||&amp;nbsp;die&amp;nbsp;&amp;quot;--ip-last&amp;nbsp;必须在&amp;nbsp;2~254&amp;quot;

CLIENT_IP=&amp;quot;${NET_PREFIX}.${IP_LAST}/${CIDR}&amp;quot;
CLIENT_ALLOWED_IP=&amp;quot;${NET_PREFIX}.${IP_LAST}/32&amp;quot;

umask&amp;nbsp;077
CLIENTS_DIR=&amp;quot;${WG_DIR}/clients&amp;quot;
mkdir&amp;nbsp;-p&amp;nbsp;&amp;quot;$CLIENTS_DIR&amp;quot;

CLIENT_KEY_FILE=&amp;quot;${CLIENTS_DIR}/${NAME}.key&amp;quot;
CLIENT_PUB_FILE=&amp;quot;${CLIENTS_DIR}/${NAME}.pub&amp;quot;
CLIENT_CONF_FILE=&amp;quot;${CLIENTS_DIR}/${NAME}.conf&amp;quot;

[[&amp;nbsp;-f&amp;nbsp;&amp;quot;$CLIENT_KEY_FILE&amp;quot;&amp;nbsp;||&amp;nbsp;-f&amp;nbsp;&amp;quot;$CLIENT_CONF_FILE&amp;quot;&amp;nbsp;]]&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;die&amp;nbsp;&amp;quot;用户文件已存在，换名或先备份删除&amp;quot;

wg&amp;nbsp;genkey&amp;nbsp;|&amp;nbsp;tee&amp;nbsp;&amp;quot;$CLIENT_KEY_FILE&amp;quot;&amp;nbsp;|&amp;nbsp;wg&amp;nbsp;pubkey&amp;nbsp;&amp;gt;&amp;nbsp;&amp;quot;$CLIENT_PUB_FILE&amp;quot;
CLIENT_PUB=&amp;quot;$(tr&amp;nbsp;-d&amp;nbsp;&amp;#39;\r\n&amp;#39;&amp;nbsp;&amp;lt;&amp;nbsp;&amp;quot;$CLIENT_PUB_FILE&amp;quot;)&amp;quot;
CLIENT_KEY=&amp;quot;$(tr&amp;nbsp;-d&amp;nbsp;&amp;#39;\r\n&amp;#39;&amp;nbsp;&amp;lt;&amp;nbsp;&amp;quot;$CLIENT_KEY_FILE&amp;quot;)&amp;quot;

cat&amp;nbsp;&amp;gt;&amp;nbsp;&amp;quot;$CLIENT_CONF_FILE&amp;quot;&amp;nbsp;&amp;lt;&amp;lt;EOF
[Interface]
PrivateKey&amp;nbsp;=&amp;nbsp;${CLIENT_KEY}
Address&amp;nbsp;=&amp;nbsp;${CLIENT_IP}

[Peer]
PublicKey&amp;nbsp;=&amp;nbsp;${SERVER_PUB}
Endpoint&amp;nbsp;=&amp;nbsp;${ENDPOINT}
PersistentKeepalive&amp;nbsp;=&amp;nbsp;25
AllowedIPs&amp;nbsp;=&amp;nbsp;${ALLOWED_IPS}
EOF

TS=&amp;quot;$(date&amp;nbsp;&amp;#39;+%F_%H%M%S&amp;#39;)&amp;quot;
BK=&amp;quot;${WG_CONF}.bak.${TS}&amp;quot;
cp&amp;nbsp;-a&amp;nbsp;&amp;quot;$WG_CONF&amp;quot;&amp;nbsp;&amp;quot;$BK&amp;quot;

grep&amp;nbsp;-qF&amp;nbsp;&amp;quot;$CLIENT_PUB&amp;quot;&amp;nbsp;&amp;quot;$WG_CONF&amp;quot;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;die&amp;nbsp;&amp;quot;wg0.conf&amp;nbsp;已存在该公钥，备份在：$BK&amp;quot;

{
&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;#&amp;nbsp;${NAME}&amp;nbsp;added&amp;nbsp;${TS}&amp;quot;
&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;[Peer]&amp;quot;
&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;PublicKey&amp;nbsp;=&amp;nbsp;${CLIENT_PUB}&amp;quot;
&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;AllowedIPs&amp;nbsp;=&amp;nbsp;${CLIENT_ALLOWED_IP}&amp;quot;
}&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;&amp;quot;$WG_CONF&amp;quot;

#&amp;nbsp;热加载（不中断现有连接）
if&amp;nbsp;ip&amp;nbsp;link&amp;nbsp;show&amp;nbsp;&amp;quot;$WG_IF&amp;quot;&amp;nbsp;&amp;gt;/dev/null&amp;nbsp;2&amp;gt;&amp;amp;1;&amp;nbsp;then
&amp;nbsp;&amp;nbsp;wg&amp;nbsp;set&amp;nbsp;&amp;quot;$WG_IF&amp;quot;&amp;nbsp;peer&amp;nbsp;&amp;quot;$CLIENT_PUB&amp;quot;&amp;nbsp;allowed-ips&amp;nbsp;&amp;quot;$CLIENT_ALLOWED_IP&amp;quot;&amp;nbsp;||&amp;nbsp;true
fi

echo&amp;nbsp;&amp;quot;OK:&amp;nbsp;已新增用户：${NAME}&amp;quot;
echo&amp;nbsp;&amp;quot;&amp;nbsp;&amp;nbsp;-&amp;nbsp;分配&amp;nbsp;IP：${CLIENT_IP}&amp;quot;
echo&amp;nbsp;&amp;quot;&amp;nbsp;&amp;nbsp;-&amp;nbsp;服务器配置已更新：${WG_CONF}&amp;quot;
echo&amp;nbsp;&amp;quot;&amp;nbsp;&amp;nbsp;-&amp;nbsp;服务器配置备份：${BK}&amp;quot;
echo&amp;nbsp;&amp;quot;&amp;nbsp;&amp;nbsp;-&amp;nbsp;客户端配置文件：${CLIENT_CONF_FILE}&amp;quot;
echo&amp;nbsp;&amp;quot;&amp;quot;
echo&amp;nbsp;&amp;quot;把这个文件发给用户导入即可：&amp;quot;
echo&amp;nbsp;&amp;quot;&amp;nbsp;&amp;nbsp;${CLIENT_CONF_FILE}&amp;quot;&lt;/pre&gt;&lt;p&gt;给执行权限：&lt;/p&gt;&lt;pre&gt;chmod&amp;nbsp;+x&amp;nbsp;/root/add_wg_user.sh&lt;/pre&gt;&lt;h3&gt;6.1 新增用户示例&lt;/h3&gt;&lt;p&gt;自动分配下一个 IP：&lt;/p&gt;&lt;pre&gt;/root/add_wg_user.sh&amp;nbsp;user2&lt;/pre&gt;&lt;p&gt;指定 IP 最后一段：&lt;/p&gt;&lt;pre&gt;/root/add_wg_user.sh&amp;nbsp;user2&amp;nbsp;--ip-last&amp;nbsp;3&lt;/pre&gt;&lt;p&gt;让用户额外能访问内网段（仍然分流，不影响互联网）：&lt;/p&gt;&lt;pre&gt;/root/add_wg_user.sh&amp;nbsp;user2&amp;nbsp;--allowed&amp;nbsp;&amp;quot;10.66.66.0/24,192.168.10.0/24&amp;quot;&lt;/pre&gt;&lt;p&gt;脚本输出里会给你：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;分配的 IP&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;生成的客户端配置路径：&lt;code inline=&quot;&quot;&gt;/etc/wireguard/clients/user2.conf&lt;/code&gt;&lt;br/&gt;把这个文件发给用户导入 WireGuard 客户端即可。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;7）排障最有效的两条命令&lt;/h2&gt;&lt;h3&gt;7.1 看握手（服务端）&lt;/h3&gt;&lt;pre&gt;wg&amp;nbsp;show&amp;nbsp;wg0&lt;/pre&gt;&lt;p&gt;看有没有：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;latest handshake&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;transfer&lt;/code&gt; 是否在涨&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;7.2 抓包判断“端口通不通 / 服务端回不回”&lt;/h3&gt;&lt;pre&gt;tcpdump&amp;nbsp;-ni&amp;nbsp;any&amp;nbsp;udp&amp;nbsp;port&amp;nbsp;51820&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;只有入站，没有回包：通常是 peer key 不匹配/服务端没认出客户端&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;双向都有：再看防火墙/路由/ICMP&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;8）子网互通怎么做（继续分流，不影响互联网）&lt;/h2&gt;&lt;p&gt;当你需要让客户端访问远端内网（例如 &lt;code inline=&quot;&quot;&gt;192.168.10.0/24&lt;/code&gt;）：&lt;/p&gt;&lt;p&gt;客户端 &lt;code inline=&quot;&quot;&gt;AllowedIPs&lt;/code&gt; 加上：&lt;/p&gt;&lt;pre&gt;AllowedIPs&amp;nbsp;=&amp;nbsp;10.66.66.0/24,&amp;nbsp;192.168.10.0/24&lt;/pre&gt;&lt;p&gt;然后“远端内网回程”通常有两种方式：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;给内网网关加静态路由（标准方案）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;服务器做 NAT（省事方案）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这一段跟你的实际网卡/网关有关，确定后再上最终配置就行。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 24 Dec 2025 20:47:25 +0800</pubDate></item><item><title>CentOS 9 下查看 CPU 频率、温度、降频记录，以及如何限频（intel_pstate）</title><link>https://teddyou.com/?id=182</link><description>&lt;p&gt;&lt;/p&gt;&lt;h2&gt;1. 查看 CPU 调频驱动、频率范围、当前策略&lt;/h2&gt;&lt;h3&gt;1.1 查看频率信息&lt;/h3&gt;&lt;pre&gt;cpupower&amp;nbsp;frequency-info&lt;/pre&gt;&lt;p&gt;重点看这些字段：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;driver: intel_pstate&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;硬件限制：800 MHz - 5.70 GHz&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;可用的调节器：performance / powersave&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;current CPU frequency&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;boost state support（是否启用睿频）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如果你看到 current CPU frequency 长期在 5.xGHz，且温度 90°C 以上，基本就是睿频冲顶导致。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;2. 实时查看当前频率（观察是否被限制、是否在抖）&lt;/h2&gt;&lt;h3&gt;2.1 最简单的实时看频率&lt;/h3&gt;&lt;pre&gt;watch&amp;nbsp;-n&amp;nbsp;1&amp;nbsp;&amp;quot;grep&amp;nbsp;-m1&amp;nbsp;&amp;#39;cpu&amp;nbsp;MHz&amp;#39;&amp;nbsp;/proc/cpuinfo&amp;quot;&lt;/pre&gt;&lt;p&gt;更想看多个核心（前 12 行）：&lt;/p&gt;&lt;pre&gt;watch&amp;nbsp;-n&amp;nbsp;1&amp;nbsp;&amp;quot;grep&amp;nbsp;-E&amp;nbsp;&amp;#39;cpu&amp;nbsp;MHz&amp;#39;&amp;nbsp;/proc/cpuinfo&amp;nbsp;|&amp;nbsp;head&amp;nbsp;-n&amp;nbsp;12&amp;quot;&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;3. 查看 CPU 温度（Package / 各核心）&lt;/h2&gt;&lt;h3&gt;3.1 安装 sensors 工具&lt;/h3&gt;&lt;pre&gt;dnf&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;lm_sensors&lt;/pre&gt;&lt;h3&gt;3.2 探测传感器（只需一次）&lt;/h3&gt;&lt;pre&gt;sensors-detect&lt;/pre&gt;&lt;h3&gt;3.3 查看温度&lt;/h3&gt;&lt;pre&gt;sensors&lt;/pre&gt;&lt;p&gt;一般重点看：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;Package id 0（整颗 CPU 温度）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Core X（各核心温度）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;实时刷新：&lt;/p&gt;&lt;pre&gt;watch&amp;nbsp;-n&amp;nbsp;1&amp;nbsp;sensors&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;4. 查看是否发生过热降频（throttling）&lt;/h2&gt;&lt;p&gt;降频有没有发生过，不要靠猜。优先看内核统计计数。&lt;/p&gt;&lt;h3&gt;4.1 查看 thermal throttle 计数（最可靠）&lt;/h3&gt;&lt;pre&gt;grep&amp;nbsp;-i&amp;nbsp;.&amp;nbsp;/sys/devices/system/cpu/cpu*/thermal_throttle/*&amp;nbsp;2&amp;gt;/dev/null&lt;/pre&gt;&lt;p&gt;你会看到类似：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;core_throttle_count&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;package_throttle_count&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;只要出现非 0，就说明发生过热降频。&lt;/p&gt;&lt;hr/&gt;&lt;h3&gt;4.2 查内核日志（不一定有）&lt;/h3&gt;&lt;pre&gt;dmesg&amp;nbsp;|&amp;nbsp;egrep&amp;nbsp;-i&amp;nbsp;&amp;#39;thermal|throttl|overheat&amp;#39;&lt;/pre&gt;&lt;p&gt;注意：有些 BIOS/板子不会打日志，日志空不代表没降频。所以日志只能当辅助，统计计数才是核心。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;5. 限制最高频率（推荐做法：只限上限，不锁死）&lt;/h2&gt;&lt;p&gt;高负载长跑的重点是稳定，不是跑分。限上限能明显降温，减少热保护介入，性能反而更稳。&lt;/p&gt;&lt;h3&gt;5.1 限制最高频率（示例 5.2GHz）&lt;/h3&gt;&lt;pre&gt;cpupower&amp;nbsp;frequency-set&amp;nbsp;-u&amp;nbsp;5.2GHz&lt;/pre&gt;&lt;p&gt;更稳一些的常用档位（按实际情况选）：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;4.2GHz：通常能把温度压到 80-85°C 区间，服务器更稳&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;3.8GHz：适合 7x24 长跑，基本不再触发降频&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;pre&gt;cpupower&amp;nbsp;frequency-set&amp;nbsp;-u&amp;nbsp;4.2GHz
#&amp;nbsp;或
cpupower&amp;nbsp;frequency-set&amp;nbsp;-u&amp;nbsp;3.8GHz&lt;/pre&gt;&lt;p&gt;验证是否生效：&lt;/p&gt;&lt;pre&gt;cpupower&amp;nbsp;frequency-info
watch&amp;nbsp;-n&amp;nbsp;1&amp;nbsp;&amp;quot;grep&amp;nbsp;-m1&amp;nbsp;&amp;#39;cpu&amp;nbsp;MHz&amp;#39;&amp;nbsp;/proc/cpuinfo&amp;quot;&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;6. 调整 EPP（能效策略，配合限频更稳）&lt;/h2&gt;&lt;p&gt;intel_pstate 下的 energy_performance_preference（EPP）会影响 CPU 是否“动不动就冲最高频”。&lt;/p&gt;&lt;p&gt;查看当前：&lt;/p&gt;&lt;pre&gt;cat&amp;nbsp;/sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference&lt;/pre&gt;&lt;p&gt;改为更适合服务器的策略：&lt;/p&gt;&lt;pre&gt;echo&amp;nbsp;balance_performance&amp;nbsp;&amp;gt;&amp;nbsp;/sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference&lt;/pre&gt;&lt;p&gt;再看一次确认：&lt;/p&gt;&lt;pre&gt;cat&amp;nbsp;/sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference&lt;/pre&gt;&lt;p&gt;说明：&lt;br/&gt;performance 更激进，更容易冲顶；balance_performance 更稳，温度更好看。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;7. 一键采集（频率/温度/降频计数），方便截图发群里&lt;/h2&gt;&lt;pre&gt;echo&amp;nbsp;&amp;quot;====&amp;nbsp;CPU&amp;nbsp;FREQ&amp;nbsp;(policy)&amp;nbsp;====&amp;quot;
cpupower&amp;nbsp;frequency-info

echo
echo&amp;nbsp;&amp;quot;====&amp;nbsp;CPU&amp;nbsp;TEMP&amp;nbsp;====&amp;quot;
sensors

echo
echo&amp;nbsp;&amp;quot;====&amp;nbsp;THROTTLE&amp;nbsp;COUNT&amp;nbsp;====&amp;quot;
grep&amp;nbsp;-i&amp;nbsp;.&amp;nbsp;/sys/devices/system/cpu/cpu*/thermal_throttle/*&amp;nbsp;2&amp;gt;/dev/null&amp;nbsp;|&amp;nbsp;head&amp;nbsp;-n&amp;nbsp;60&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;8. 常见现象与判断&lt;/h2&gt;&lt;p&gt;1）Package 长期 90°C+，风扇满速，频率仍能冲 5.x：&lt;br/&gt;基本属于“睿频冲顶 + 持续高负载”，后续很容易开始热降频，表现为性能波动。&lt;/p&gt;&lt;p&gt;2）某几个核心特别热，其他核心低：&lt;br/&gt;多见于进程亲和性绑定不合理（热点集中），不是机箱温度问题。&lt;/p&gt;&lt;p&gt;3）降频计数持续增长：&lt;br/&gt;说明热保护在频繁介入，需要降温（限频/优化绑核/减少负载/检查散热）。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 19 Dec 2025 22:55:32 +0800</pubDate></item><item><title>CentOS 9 系统下 DNF 安装 MySQL 8 数据库</title><link>https://teddyou.com/?id=181</link><description>&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h1&gt;安装 MySQL 官方仓库&lt;/h1&gt;&lt;pre&gt;dnf&amp;nbsp;install&amp;nbsp;https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm&amp;nbsp;-y&lt;/pre&gt;&lt;hr/&gt;&lt;h1&gt;直接关掉 gpgcheck（重点）&lt;/h1&gt;&lt;p&gt;编辑仓库文件：&lt;/p&gt;&lt;pre&gt;vim&amp;nbsp;/etc/yum.repos.d/mysql-community.repo&lt;/pre&gt;&lt;p&gt;把里面所有的段都改成：&lt;/p&gt;&lt;pre&gt;gpgcheck=0&lt;/pre&gt;&lt;p&gt;一般需要改的有：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;[mysql80-community]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[mysql-tools-community]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[mysql-connectors-community]&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;改完之后，这个仓库就不会再卡在 GPG 校验上了。&lt;/p&gt;&lt;hr/&gt;&lt;h1&gt;安装 MySQL 8&lt;/h1&gt;&lt;pre&gt;dnf&amp;nbsp;clean&amp;nbsp;all
dnf&amp;nbsp;install&amp;nbsp;mysql-community-server&amp;nbsp;-y&lt;/pre&gt;&lt;hr/&gt;&lt;h1&gt;启动 MySQL&lt;/h1&gt;&lt;pre&gt;systemctl&amp;nbsp;start&amp;nbsp;mysqld
systemctl&amp;nbsp;enable&amp;nbsp;mysqld
systemctl&amp;nbsp;status&amp;nbsp;mysqld&lt;/pre&gt;&lt;p&gt;看到 active(running) 就说明成功了。&lt;/p&gt;&lt;hr/&gt;&lt;h1&gt;获取 root 初始密码&lt;/h1&gt;&lt;pre&gt;grep&amp;nbsp;&amp;#39;temporary&amp;nbsp;password&amp;#39;&amp;nbsp;/var/log/mysqld.log&lt;/pre&gt;&lt;p&gt;复制那一串临时密码。&lt;/p&gt;&lt;hr/&gt;&lt;h1&gt;登录 MySQL 并修改 root 密码（必做）&lt;/h1&gt;&lt;pre&gt;mysql&amp;nbsp;-uroot&amp;nbsp;-p&lt;/pre&gt;&lt;p&gt;然后执行：&lt;/p&gt;&lt;pre&gt;ALTER&amp;nbsp;USER&amp;nbsp;&amp;#39;root&amp;#39;@&amp;#39;localhost&amp;#39;&amp;nbsp;IDENTIFIED&amp;nbsp;BY&amp;nbsp;&amp;#39;kK&amp;lt;[U5W8V&amp;lt;8N&amp;#39;;&lt;/pre&gt;&lt;p&gt;现在 root 就能正常使用了。&lt;/p&gt;&lt;hr/&gt;&lt;h1&gt;创建一个允许远程登录的超级用户&lt;/h1&gt;&lt;pre&gt;CREATE&amp;nbsp;USER&amp;nbsp;&amp;#39;ted&amp;#39;@&amp;#39;%&amp;#39;&amp;nbsp;IDENTIFIED&amp;nbsp;BY&amp;nbsp;&amp;#39;88BM]NQnTt&amp;#39;;
GRANT&amp;nbsp;ALL&amp;nbsp;PRIVILEGES&amp;nbsp;ON&amp;nbsp;*.*&amp;nbsp;TO&amp;nbsp;&amp;#39;ted&amp;#39;@&amp;#39;%&amp;#39;&amp;nbsp;WITH&amp;nbsp;GRANT&amp;nbsp;OPTION;
FLUSH&amp;nbsp;PRIVILEGES;&lt;/pre&gt;</description><pubDate>Tue, 02 Dec 2025 16:35:22 +0800</pubDate></item><item><title>Proxmox VE 实用命令大全：模板、克隆、删除、批处理全流程</title><link>https://teddyou.com/?id=180</link><description>&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h1&gt;&amp;nbsp;一、PVE 的两类虚拟化：KVM &amp;amp; LXC&lt;/h1&gt;&lt;p&gt;PVE 支持两种虚拟化技术：&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;能跑的系统&lt;/th&gt;&lt;th&gt;特点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;KVM/QEMU&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;qm&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Windows / Linux&lt;/td&gt;&lt;td&gt;全虚拟化，性能稍低但兼容性最好&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LXC 容器&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;pct&lt;/code&gt;&lt;/td&gt;&lt;td&gt;仅 Linux&lt;/td&gt;&lt;td&gt;轻量级、共享宿主环境&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;? &lt;strong&gt;只要是虚拟机（VM），它必定是 KVM → 就必须用 &lt;code inline=&quot;&quot;&gt;qm&lt;/code&gt; 管理。&lt;/strong&gt;&lt;/p&gt;&lt;hr/&gt;&lt;h1&gt;&amp;nbsp;二、常用 &lt;code inline=&quot;&quot;&gt;qm&lt;/code&gt; 命令速查&lt;/h1&gt;&lt;h2&gt;查看所有虚拟机&lt;/h2&gt;&lt;pre&gt;qm&amp;nbsp;list&lt;/pre&gt;&lt;h2&gt;启动 / 关机 / 强制关机&lt;/h2&gt;&lt;pre&gt;qm&amp;nbsp;start&amp;nbsp;101
qm&amp;nbsp;shutdown&amp;nbsp;101
qm&amp;nbsp;stop&amp;nbsp;101&lt;/pre&gt;&lt;h2&gt;删除虚拟机（含磁盘）&lt;/h2&gt;&lt;pre&gt;qm&amp;nbsp;destroy&amp;nbsp;101&amp;nbsp;--purge&lt;/pre&gt;&lt;hr/&gt;&lt;h1&gt;&amp;nbsp;三、将虚拟机转换为模板（Template）&lt;/h1&gt;&lt;p&gt;假设虚拟机 ID 为 &lt;strong&gt;101&lt;/strong&gt;&lt;/p&gt;&lt;h2&gt;1. 先关机&lt;/h2&gt;&lt;pre&gt;qm&amp;nbsp;shutdown&amp;nbsp;101
#&amp;nbsp;如果关不掉
qm&amp;nbsp;stop&amp;nbsp;101&lt;/pre&gt;&lt;h2&gt;2. 转换为模板&lt;/h2&gt;&lt;pre&gt;qm&amp;nbsp;template&amp;nbsp;101&lt;/pre&gt;&lt;p&gt;模板将变为不可启动状态，只能用于克隆。&lt;/p&gt;&lt;hr/&gt;&lt;h1&gt;&amp;nbsp;四、取消模板状态（恢复为可启动 VM）&lt;/h1&gt;&lt;p&gt;很多人不知道模板可以恢复成普通 VM，实际上只需要一条命令。&lt;/p&gt;&lt;pre&gt;qm&amp;nbsp;set&amp;nbsp;101&amp;nbsp;--template&amp;nbsp;0&lt;/pre&gt;&lt;p&gt;恢复后即可启动：&lt;/p&gt;&lt;pre&gt;qm&amp;nbsp;start&amp;nbsp;101&lt;/pre&gt;&lt;p&gt;再次变回模板：&lt;/p&gt;&lt;pre&gt;qm&amp;nbsp;set&amp;nbsp;101&amp;nbsp;--template&amp;nbsp;1&lt;/pre&gt;&lt;p&gt;或&lt;/p&gt;&lt;pre&gt;qm&amp;nbsp;template&amp;nbsp;101&lt;/pre&gt;&lt;hr/&gt;&lt;h1&gt;&amp;nbsp;五、链式克隆（Linked Clone）全流程&lt;/h1&gt;&lt;p&gt;链式克隆（Linked Clone）特点：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;共享模板磁盘&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;创建速度极快&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;占用空间小&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;必须保持模板磁盘为只读（template 状态）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;❗重要：链式克隆不能使用 &lt;code inline=&quot;&quot;&gt;--format&lt;/code&gt;&lt;/h2&gt;&lt;p&gt;如果你执行：&lt;/p&gt;&lt;pre&gt;qm&amp;nbsp;clone&amp;nbsp;101&amp;nbsp;201&amp;nbsp;--name&amp;nbsp;vm201&amp;nbsp;--format&amp;nbsp;qcow2&amp;nbsp;--full&amp;nbsp;0&lt;/pre&gt;&lt;p&gt;会出现错误：&lt;/p&gt;&lt;pre&gt;parameter&amp;nbsp;&amp;#39;format&amp;#39;&amp;nbsp;not&amp;nbsp;allowed&amp;nbsp;for&amp;nbsp;linked&amp;nbsp;clones&lt;/pre&gt;&lt;p&gt;原因：链式克隆必须继承模板的磁盘格式，不能指定新的格式。&lt;/p&gt;&lt;hr/&gt;&lt;h1&gt;&amp;nbsp;正确链式克隆示例&lt;/h1&gt;&lt;p&gt;克隆模板 101 → VM ID=201：&lt;/p&gt;&lt;pre&gt;qm&amp;nbsp;clone&amp;nbsp;101&amp;nbsp;201&amp;nbsp;--name&amp;nbsp;vm201&amp;nbsp;--full&amp;nbsp;0&lt;/pre&gt;&lt;p&gt;克隆 20 台：&lt;/p&gt;&lt;pre&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;102&amp;nbsp;103&amp;nbsp;104&amp;nbsp;105&amp;nbsp;106&amp;nbsp;107&amp;nbsp;108&amp;nbsp;109&amp;nbsp;110&amp;nbsp;111&amp;nbsp;112&amp;nbsp;113&amp;nbsp;114&amp;nbsp;115&amp;nbsp;116&amp;nbsp;117&amp;nbsp;118&amp;nbsp;119&amp;nbsp;120;&amp;nbsp;do
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qm&amp;nbsp;clone&amp;nbsp;101&amp;nbsp;$i&amp;nbsp;--name&amp;nbsp;vm$i&amp;nbsp;--full&amp;nbsp;0
done&lt;/pre&gt;&lt;hr/&gt;&lt;h1&gt;&amp;nbsp;六、链式克隆后的批量硬件配置&lt;/h1&gt;&lt;p&gt;如果希望所有虚拟机都用相同配置：&lt;/p&gt;&lt;pre&gt;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;102&amp;nbsp;103&amp;nbsp;104&amp;nbsp;105&amp;nbsp;106&amp;nbsp;107&amp;nbsp;108&amp;nbsp;109&amp;nbsp;110&amp;nbsp;111&amp;nbsp;112&amp;nbsp;113&amp;nbsp;114&amp;nbsp;115&amp;nbsp;116&amp;nbsp;117&amp;nbsp;118&amp;nbsp;119&amp;nbsp;120;&amp;nbsp;do
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qm&amp;nbsp;clone&amp;nbsp;101&amp;nbsp;$i&amp;nbsp;--name&amp;nbsp;vm$i&amp;nbsp;--full&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qm&amp;nbsp;set&amp;nbsp;$i&amp;nbsp;--cores&amp;nbsp;2&amp;nbsp;--memory&amp;nbsp;2048&amp;nbsp;--net0&amp;nbsp;virtio,bridge=vmbr0
done&lt;/pre&gt;&lt;hr/&gt;&lt;h1&gt;&amp;nbsp;七、快速理解链克隆与模板的关系&lt;/h1&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;模板是只读的父盘&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;链克隆的 VM 是差分盘&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;模板恢复成 VM、启动、修改不会影响已创建的克隆&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;修改模板 → 再转回 template → 再克隆 → 才能影响后续 VM&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这是一个安全、灵活的工作流。&lt;/p&gt;&lt;hr/&gt;&lt;h1&gt;&amp;nbsp;八、KVM 与 LXC 的命令区别&lt;/h1&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th&gt;功能&lt;/th&gt;&lt;th&gt;KVM（qm）&lt;/th&gt;&lt;th&gt;LXC（pct）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;列出&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;qm list&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;pct list&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;启动&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;qm start 101&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;pct start 201&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;停止&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;qm stop 101&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;pct stop 201&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;删除&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;qm destroy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;pct destroy&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 17 Nov 2025 10:09:08 +0800</pubDate></item><item><title>在 Proxmox VE 9 上创建虚拟局域网并通过宿主公网 NAT 上网</title><link>https://teddyou.com/?id=179</link><description>&lt;h1 data-start=&quot;93&quot; data-end=&quot;135&quot;&gt;在 Proxmox VE 9 上创建虚拟局域网并通过宿主公网 NAT 上网&lt;/h1&gt;&lt;blockquote data-start=&quot;137&quot; data-end=&quot;305&quot;&gt;&lt;p data-start=&quot;139&quot; data-end=&quot;305&quot;&gt;环境示例：&lt;br data-start=&quot;144&quot; data-end=&quot;147&quot;/&gt;系统版本：Proxmox VE 9.0.3&lt;br data-start=&quot;170&quot; data-end=&quot;173&quot;/&gt;公网 IP：192.140.182.104&lt;br data-start=&quot;196&quot; data-end=&quot;199&quot;/&gt;外网网关：192.140.182.1&lt;br data-start=&quot;219&quot; data-end=&quot;222&quot;/&gt;外网物理口：&lt;code data-start=&quot;230&quot; data-end=&quot;244&quot;&gt;enp96s0f0np0&lt;/code&gt;&lt;br data-start=&quot;244&quot; data-end=&quot;247&quot;/&gt;默认桥接口：&lt;code data-start=&quot;255&quot; data-end=&quot;262&quot;&gt;vmbr0&lt;/code&gt;&lt;br data-start=&quot;262&quot; data-end=&quot;265&quot;/&gt;新增内网桥接：&lt;code data-start=&quot;274&quot; data-end=&quot;281&quot;&gt;vmbr1&lt;/code&gt;&lt;br data-start=&quot;281&quot; data-end=&quot;284&quot;/&gt;内网网段：&lt;code data-start=&quot;291&quot; data-end=&quot;305&quot;&gt;10.10.0.0/24&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr data-start=&quot;307&quot; data-end=&quot;310&quot;/&gt;&lt;h2 data-start=&quot;312&quot; data-end=&quot;338&quot;&gt;一、创建虚拟局域网 Bridge（vmbr1）&lt;/h2&gt;&lt;p data-start=&quot;340&quot; data-end=&quot;400&quot;&gt;PVE 的网络核心是 Linux Bridge。&lt;br data-start=&quot;364&quot; data-end=&quot;367&quot;/&gt;我们创建一个 &lt;strong data-start=&quot;374&quot; data-end=&quot;385&quot;&gt;不绑定物理网卡&lt;/strong&gt; 的虚拟桥接，用于虚拟机互联。&lt;/p&gt;&lt;p data-start=&quot;402&quot; data-end=&quot;411&quot;&gt;编辑网络配置文件：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;413&quot; data-end=&quot;453&quot;&gt;nano&amp;nbsp;/etc/network/interfaces&lt;/pre&gt;&lt;p data-start=&quot;455&quot; data-end=&quot;462&quot;&gt;添加以下内容：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;464&quot; data-end=&quot;592&quot;&gt;auto&amp;nbsp;vmbr1
iface&amp;nbsp;vmbr1&amp;nbsp;inet&amp;nbsp;static
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;address&amp;nbsp;10.10.0.1/24
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bridge-ports&amp;nbsp;none
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bridge-stp&amp;nbsp;off
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bridge-fd&amp;nbsp;0&lt;/pre&gt;&lt;p data-start=&quot;594&quot; data-end=&quot;600&quot;&gt;保存并应用：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;602&quot; data-end=&quot;625&quot;&gt;ifreload&amp;nbsp;-a&lt;/pre&gt;&lt;p data-start=&quot;627&quot; data-end=&quot;630&quot;&gt;验证：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;632&quot; data-end=&quot;659&quot;&gt;ip&amp;nbsp;a&amp;nbsp;show&amp;nbsp;vmbr1&lt;/pre&gt;&lt;p data-start=&quot;660&quot; data-end=&quot;664&quot;&gt;应看到：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;665&quot; data-end=&quot;690&quot;&gt;inet&amp;nbsp;10.10.0.1/24&lt;/pre&gt;&lt;hr data-start=&quot;692&quot; data-end=&quot;695&quot;/&gt;&lt;h2 data-start=&quot;697&quot; data-end=&quot;712&quot;&gt;二、启用 IPv4 转发&lt;/h2&gt;&lt;p data-start=&quot;714&quot; data-end=&quot;737&quot;&gt;PVE 默认不转发内外网流量，我们需手动开启。&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;739&quot; data-end=&quot;789&quot;&gt;echo&amp;nbsp;1&amp;nbsp;&amp;gt;&amp;nbsp;/proc/sys/net/ipv4/ip_forward&lt;/pre&gt;&lt;p data-start=&quot;791&quot; data-end=&quot;796&quot;&gt;永久生效：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;797&quot; data-end=&quot;885&quot;&gt;echo&amp;nbsp;&amp;quot;net.ipv4.ip_forward=1&amp;quot;&amp;nbsp;&amp;gt;&amp;nbsp;/etc/sysctl.d/99-pve-nat.conf
sysctl&amp;nbsp;--system&lt;/pre&gt;&lt;hr data-start=&quot;887&quot; data-end=&quot;890&quot;/&gt;&lt;h2 data-start=&quot;892&quot; data-end=&quot;919&quot;&gt;三、配置 NAT 出网（nftables 方式）&lt;/h2&gt;&lt;p data-start=&quot;921&quot; data-end=&quot;959&quot;&gt;PVE 9 默认使用 &lt;strong data-start=&quot;932&quot; data-end=&quot;944&quot;&gt;nftables&lt;/strong&gt; 替代传统 iptables。&lt;/p&gt;&lt;p data-start=&quot;961&quot; data-end=&quot;1020&quot;&gt;我们要做的就是在 NAT 表的 postrouting 链上添加 SNAT 规则，让虚拟机流量伪装成宿主机公网 IP。&lt;/p&gt;&lt;blockquote data-start=&quot;1022&quot; data-end=&quot;1056&quot;&gt;&lt;p data-start=&quot;1024&quot; data-end=&quot;1056&quot;&gt;注意：PVE 的默认路由出接口是 &lt;code data-start=&quot;1041&quot; data-end=&quot;1048&quot;&gt;vmbr0&lt;/code&gt;，不是物理网卡！&lt;/p&gt;&lt;/blockquote&gt;&lt;p data-start=&quot;1058&quot; data-end=&quot;1085&quot;&gt;创建或替换 &lt;code data-start=&quot;1064&quot; data-end=&quot;1084&quot;&gt;/etc/nftables.conf&lt;/code&gt;：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;1087&quot; data-end=&quot;1575&quot;&gt;cat&amp;nbsp;&amp;gt;/etc/nftables.conf&amp;nbsp;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;#!/usr/sbin/nft&amp;nbsp;-fflush&amp;nbsp;ruleset#&amp;nbsp;放行转发流量table&amp;nbsp;inet&amp;nbsp;filter&amp;nbsp;{
&amp;nbsp;&amp;nbsp;chain&amp;nbsp;forward&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type&amp;nbsp;filter&amp;nbsp;hook&amp;nbsp;forward&amp;nbsp;priority&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;policy&amp;nbsp;accept;
&amp;nbsp;&amp;nbsp;}
}#&amp;nbsp;NAT&amp;nbsp;出网规则table&amp;nbsp;ip&amp;nbsp;nat&amp;nbsp;{
&amp;nbsp;&amp;nbsp;chain&amp;nbsp;postrouting&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type&amp;nbsp;nat&amp;nbsp;hook&amp;nbsp;postrouting&amp;nbsp;priority&amp;nbsp;100;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;policy&amp;nbsp;accept;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;内网通过&amp;nbsp;vmbr0&amp;nbsp;出公网
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip&amp;nbsp;saddr&amp;nbsp;10.10.0.0/24&amp;nbsp;oif&amp;nbsp;&amp;quot;vmbr0&amp;quot;&amp;nbsp;snat&amp;nbsp;to&amp;nbsp;192.140.182.104&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;可选备用规则（直接物理口出）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip&amp;nbsp;saddr&amp;nbsp;10.10.0.0/24&amp;nbsp;oif&amp;nbsp;&amp;quot;enp96s0f0np0&amp;quot;&amp;nbsp;snat&amp;nbsp;to&amp;nbsp;192.140.182.104
&amp;nbsp;&amp;nbsp;}
}
EOF&lt;/pre&gt;&lt;p data-start=&quot;1577&quot; data-end=&quot;1583&quot;&gt;启动并启用：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;1584&quot; data-end=&quot;1648&quot;&gt;systemctl&amp;nbsp;enable&amp;nbsp;nftables
systemctl&amp;nbsp;restart&amp;nbsp;nftables&lt;/pre&gt;&lt;p data-start=&quot;1650&quot; data-end=&quot;1653&quot;&gt;验证：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;1654&quot; data-end=&quot;1682&quot;&gt;nft&amp;nbsp;list&amp;nbsp;ruleset&lt;/pre&gt;&lt;p data-start=&quot;1684&quot; data-end=&quot;1690&quot;&gt;输出应包含：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;1691&quot; data-end=&quot;1756&quot;&gt;ip&amp;nbsp;saddr&amp;nbsp;10.10.0.0/24&amp;nbsp;oif&amp;nbsp;&amp;quot;vmbr0&amp;quot;&amp;nbsp;snat&amp;nbsp;to&amp;nbsp;192.140.182.104&lt;/pre&gt;&lt;hr data-start=&quot;1758&quot; data-end=&quot;1761&quot;/&gt;&lt;h2 data-start=&quot;1763&quot; data-end=&quot;1775&quot;&gt;四、虚拟机网络配置&lt;/h2&gt;&lt;p data-start=&quot;1777&quot; data-end=&quot;1813&quot;&gt;创建虚拟机时，网卡桥接选择 &lt;strong data-start=&quot;1791&quot; data-end=&quot;1800&quot;&gt;vmbr1&lt;/strong&gt;，模式 &lt;code data-start=&quot;1804&quot; data-end=&quot;1812&quot;&gt;virtio&lt;/code&gt;。&lt;/p&gt;&lt;p data-start=&quot;1815&quot; data-end=&quot;1827&quot;&gt;在虚拟机中配置静态网络：&lt;/p&gt;&lt;div class=&quot;_tableContainer_1rjym_1&quot;&gt;&lt;div tabindex=&quot;-1&quot; class=&quot;group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse&quot;&gt;&lt;table data-start=&quot;1829&quot; data-end=&quot;1938&quot; class=&quot;w-fit min-w-(--thread-content-width)&quot;&gt;&lt;thead data-start=&quot;1829&quot; data-end=&quot;1839&quot;&gt;&lt;tr data-start=&quot;1829&quot; data-end=&quot;1839&quot; class=&quot;firstRow&quot;&gt;&lt;th data-start=&quot;1829&quot; data-end=&quot;1834&quot; data-col-size=&quot;sm&quot;&gt;参数&lt;/th&gt;&lt;th data-start=&quot;1834&quot; data-end=&quot;1839&quot; data-col-size=&quot;sm&quot;&gt;值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody data-start=&quot;1854&quot; data-end=&quot;1938&quot;&gt;&lt;tr data-start=&quot;1854&quot; data-end=&quot;1876&quot;&gt;&lt;td data-start=&quot;1854&quot; data-end=&quot;1862&quot; data-col-size=&quot;sm&quot;&gt;IP 地址&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;1862&quot; data-end=&quot;1876&quot;&gt;10.10.0.10&lt;/td&gt;&lt;/tr&gt;&lt;tr data-start=&quot;1877&quot; data-end=&quot;1901&quot;&gt;&lt;td data-start=&quot;1877&quot; data-end=&quot;1884&quot; data-col-size=&quot;sm&quot;&gt;子网掩码&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;1884&quot; data-end=&quot;1901&quot;&gt;255.255.255.0&lt;/td&gt;&lt;/tr&gt;&lt;tr data-start=&quot;1902&quot; data-end=&quot;1920&quot;&gt;&lt;td data-start=&quot;1902&quot; data-end=&quot;1907&quot; data-col-size=&quot;sm&quot;&gt;网关&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;1907&quot; data-end=&quot;1920&quot;&gt;10.10.0.1&lt;/td&gt;&lt;/tr&gt;&lt;tr data-start=&quot;1921&quot; data-end=&quot;1938&quot;&gt;&lt;td data-start=&quot;1921&quot; data-end=&quot;1927&quot; data-col-size=&quot;sm&quot;&gt;DNS&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;1927&quot; data-end=&quot;1938&quot;&gt;8.8.8.8&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p data-start=&quot;1940&quot; data-end=&quot;1949&quot;&gt;Linux 示例：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;1950&quot; data-end=&quot;2076&quot;&gt;ip&amp;nbsp;addr&amp;nbsp;add&amp;nbsp;10.10.0.10/24&amp;nbsp;dev&amp;nbsp;eth0
ip&amp;nbsp;route&amp;nbsp;add&amp;nbsp;default&amp;nbsp;via&amp;nbsp;10.10.0.1echo&amp;nbsp;&amp;quot;nameserver&amp;nbsp;8.8.8.8&amp;quot;&amp;nbsp;&amp;gt;&amp;nbsp;/etc/resolv.conf&lt;/pre&gt;&lt;hr data-start=&quot;2078&quot; data-end=&quot;2081&quot;/&gt;&lt;h2 data-start=&quot;2083&quot; data-end=&quot;2090&quot;&gt;五、验证&lt;/h2&gt;&lt;h3 data-start=&quot;2092&quot; data-end=&quot;2106&quot;&gt;1️⃣ 宿主机连通性&lt;/h3&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;2107&quot; data-end=&quot;2136&quot;&gt;ping&amp;nbsp;-c&amp;nbsp;3&amp;nbsp;8.8.8.8&lt;/pre&gt;&lt;h3 data-start=&quot;2138&quot; data-end=&quot;2153&quot;&gt;2️⃣ 虚拟机到宿主机&lt;/h3&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;2154&quot; data-end=&quot;2180&quot;&gt;ping&amp;nbsp;10.10.0.1&lt;/pre&gt;&lt;h3 data-start=&quot;2182&quot; data-end=&quot;2197&quot;&gt;3️⃣ 虚拟机上网测试&lt;/h3&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;2198&quot; data-end=&quot;2255&quot;&gt;ping&amp;nbsp;-c&amp;nbsp;3&amp;nbsp;8.8.8.8
curl&amp;nbsp;-s&amp;nbsp;https://ifconfig.me&lt;/pre&gt;&lt;p data-start=&quot;2257&quot; data-end=&quot;2299&quot;&gt;返回的公网 IP 应为 &lt;strong data-start=&quot;2269&quot; data-end=&quot;2288&quot;&gt;192.140.182.104&lt;/strong&gt;，说明 NAT 成功。&lt;/p&gt;&lt;hr data-start=&quot;2301&quot; data-end=&quot;2304&quot;/&gt;&lt;h2 data-start=&quot;2306&quot; data-end=&quot;2341&quot;&gt;六、可选：给 vmbr1 加上 DHCP 服务（自动分配 IP）&lt;/h2&gt;&lt;p data-start=&quot;2343&quot; data-end=&quot;2354&quot;&gt;安装 dnsmasq：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;2355&quot; data-end=&quot;2389&quot;&gt;apt&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;dnsmasq&lt;/pre&gt;&lt;p data-start=&quot;2391&quot; data-end=&quot;2424&quot;&gt;配置文件 &lt;code data-start=&quot;2396&quot; data-end=&quot;2423&quot;&gt;/etc/dnsmasq.d/vmbr1.conf&lt;/code&gt;：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;2425&quot; data-end=&quot;2577&quot;&gt;interface=vmbr1
bind-interfaces
dhcp-range=10.10.0.100,10.10.0.200,255.255.255.0,12h
dhcp-option=3,10.10.0.1
dhcp-option=6,223.5.5.5,8.8.8.8&lt;/pre&gt;&lt;p data-start=&quot;2579&quot; data-end=&quot;2584&quot;&gt;启动服务：&lt;/p&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;2585&quot; data-end=&quot;2647&quot;&gt;systemctl&amp;nbsp;enable&amp;nbsp;dnsmasq
systemctl&amp;nbsp;restart&amp;nbsp;dnsmasq&lt;/pre&gt;&lt;p data-start=&quot;2649&quot; data-end=&quot;2672&quot;&gt;虚拟机网络改为 DHCP 即可自动获取 IP。&lt;/p&gt;&lt;hr data-start=&quot;2674&quot; data-end=&quot;2677&quot;/&gt;&lt;h2 data-start=&quot;2679&quot; data-end=&quot;2688&quot;&gt;七、常见问题&lt;/h2&gt;&lt;div class=&quot;_tableContainer_1rjym_1&quot;&gt;&lt;div tabindex=&quot;-1&quot; class=&quot;group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse&quot;&gt;&lt;table data-start=&quot;2690&quot; data-end=&quot;2968&quot; class=&quot;w-fit min-w-(--thread-content-width)&quot;&gt;&lt;thead data-start=&quot;2690&quot; data-end=&quot;2706&quot;&gt;&lt;tr data-start=&quot;2690&quot; data-end=&quot;2706&quot; class=&quot;firstRow&quot;&gt;&lt;th data-start=&quot;2690&quot; data-end=&quot;2695&quot; data-col-size=&quot;sm&quot;&gt;现象&lt;/th&gt;&lt;th data-start=&quot;2695&quot; data-end=&quot;2700&quot; data-col-size=&quot;sm&quot;&gt;原因&lt;/th&gt;&lt;th data-start=&quot;2700&quot; data-end=&quot;2706&quot; data-col-size=&quot;sm&quot;&gt;解决&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody data-start=&quot;2730&quot; data-end=&quot;2968&quot;&gt;&lt;tr data-start=&quot;2730&quot; data-end=&quot;2787&quot;&gt;&lt;td data-start=&quot;2730&quot; data-end=&quot;2750&quot; data-col-size=&quot;sm&quot;&gt;VM 能 ping 网关但上不了网&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;2750&quot; data-end=&quot;2767&quot;&gt;NAT 未命中（出接口错误）&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;2767&quot; data-end=&quot;2787&quot;&gt;改成 &lt;code data-start=&quot;2772&quot; data-end=&quot;2785&quot;&gt;oif &amp;quot;vmbr0&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr data-start=&quot;2788&quot; data-end=&quot;2855&quot;&gt;&lt;td data-start=&quot;2788&quot; data-end=&quot;2804&quot; data-col-size=&quot;sm&quot;&gt;宿主机能上网但 VM 不行&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;2804&quot; data-end=&quot;2811&quot;&gt;转发未开&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;2811&quot; data-end=&quot;2855&quot;&gt;&lt;code data-start=&quot;2813&quot; data-end=&quot;2853&quot;&gt;echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr data-start=&quot;2856&quot; data-end=&quot;2920&quot;&gt;&lt;td data-start=&quot;2856&quot; data-end=&quot;2874&quot; data-col-size=&quot;sm&quot;&gt;ping 8.8.8.8 不通&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;2874&quot; data-end=&quot;2886&quot;&gt;上级路由防火墙拦截&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;2886&quot; data-end=&quot;2920&quot;&gt;用 &lt;code data-start=&quot;2890&quot; data-end=&quot;2904&quot;&gt;snat to 公网IP&lt;/code&gt; 替换 masquerade&lt;/td&gt;&lt;/tr&gt;&lt;tr data-start=&quot;2921&quot; data-end=&quot;2968&quot;&gt;&lt;td data-start=&quot;2921&quot; data-end=&quot;2933&quot; data-col-size=&quot;sm&quot;&gt;PVE 防火墙开启&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;2933&quot; data-end=&quot;2942&quot;&gt;丢弃转发流量&lt;/td&gt;&lt;td data-col-size=&quot;sm&quot; data-start=&quot;2942&quot; data-end=&quot;2968&quot;&gt;&lt;code data-start=&quot;2944&quot; data-end=&quot;2963&quot;&gt;pve-firewall stop&lt;/code&gt; 测试&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr data-start=&quot;2970&quot; data-end=&quot;2973&quot;/&gt;&lt;h2 data-start=&quot;2975&quot; data-end=&quot;2984&quot;&gt;八、最终效果&lt;/h2&gt;&lt;ul data-start=&quot;2986&quot; data-end=&quot;3073&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p data-start=&quot;2988&quot; data-end=&quot;3011&quot;&gt;虚拟机之间通过 &lt;code data-start=&quot;2996&quot; data-end=&quot;3003&quot;&gt;vmbr1&lt;/code&gt; 局域网互通&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-start=&quot;3014&quot; data-end=&quot;3036&quot;&gt;所有虚拟机上网流量通过宿主 NAT 转发&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-start=&quot;3039&quot; data-end=&quot;3073&quot;&gt;宿主机对外出口为单一公网 IP（192.140.182.104）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr data-start=&quot;3075&quot; data-end=&quot;3078&quot;/&gt;&lt;h2 data-start=&quot;3080&quot; data-end=&quot;3091&quot;&gt;九、完整配置总结&lt;/h2&gt;&lt;h3 data-start=&quot;3093&quot; data-end=&quot;3122&quot;&gt;&lt;code data-start=&quot;3097&quot; data-end=&quot;3122&quot;&gt;/etc/network/interfaces&lt;/code&gt;&lt;/h3&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;3123&quot; data-end=&quot;3541&quot;&gt;auto&amp;nbsp;lo
iface&amp;nbsp;lo&amp;nbsp;inet&amp;nbsp;loopback

iface&amp;nbsp;enp96s0f0np0&amp;nbsp;inet&amp;nbsp;manual

auto&amp;nbsp;vmbr0
iface&amp;nbsp;vmbr0&amp;nbsp;inet&amp;nbsp;static
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;address&amp;nbsp;192.140.182.104/24
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gateway&amp;nbsp;192.140.182.1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bridge-ports&amp;nbsp;enp96s0f0np0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bridge-stp&amp;nbsp;off
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bridge-fd&amp;nbsp;0

iface&amp;nbsp;enp96s0f1np1&amp;nbsp;inet&amp;nbsp;manual

auto&amp;nbsp;vmbr1
iface&amp;nbsp;vmbr1&amp;nbsp;inet&amp;nbsp;static
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;address&amp;nbsp;10.10.0.1/24
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bridge-ports&amp;nbsp;none
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bridge-stp&amp;nbsp;off
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bridge-fd&amp;nbsp;0source&amp;nbsp;/etc/network/interfaces.d/*&lt;/pre&gt;&lt;h3 data-start=&quot;3543&quot; data-end=&quot;3567&quot;&gt;&lt;code data-start=&quot;3547&quot; data-end=&quot;3567&quot;&gt;/etc/nftables.conf&lt;/code&gt;&lt;/h3&gt;&lt;pre class=&quot;overflow-visible!&quot; data-start=&quot;3568&quot; data-end=&quot;3955&quot;&gt;#!/usr/sbin/nft&amp;nbsp;-fflush&amp;nbsp;ruleset

table&amp;nbsp;inet&amp;nbsp;filter&amp;nbsp;{
&amp;nbsp;&amp;nbsp;chain&amp;nbsp;forward&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type&amp;nbsp;filter&amp;nbsp;hook&amp;nbsp;forward&amp;nbsp;priority&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;policy&amp;nbsp;accept;
&amp;nbsp;&amp;nbsp;}
}

table&amp;nbsp;ip&amp;nbsp;nat&amp;nbsp;{
&amp;nbsp;&amp;nbsp;chain&amp;nbsp;postrouting&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type&amp;nbsp;nat&amp;nbsp;hook&amp;nbsp;postrouting&amp;nbsp;priority&amp;nbsp;100;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;policy&amp;nbsp;accept;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip&amp;nbsp;saddr&amp;nbsp;10.10.0.0/24&amp;nbsp;oif&amp;nbsp;&amp;quot;vmbr0&amp;quot;&amp;nbsp;snat&amp;nbsp;to&amp;nbsp;192.140.182.104
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ip&amp;nbsp;saddr&amp;nbsp;10.10.0.0/24&amp;nbsp;oif&amp;nbsp;&amp;quot;enp96s0f0np0&amp;quot;&amp;nbsp;snat&amp;nbsp;to&amp;nbsp;192.140.182.104
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;hr data-start=&quot;3957&quot; data-end=&quot;3960&quot;/&gt;&lt;p data-start=&quot;3962&quot; data-end=&quot;4042&quot;&gt;如果重启后无网络，执行以下命令：&lt;br/&gt;&lt;/p&gt;&lt;p data-start=&quot;3962&quot; data-end=&quot;4042&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;# 1. 重新加载网络接口&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;ifreload -a&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;# 2. 确保内核开启转发&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;sysctl -w net.ipv4.ip_forward=1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;# 3. 手动重载 nftables 规则&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;systemctl restart nftables&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;# 4. 暂停 PVE 自带防火墙（若启用过）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;pve-firewall stop&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;# 5. 验证 NAT 是否生效&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;nft list ruleset | grep -E &amp;quot;snat|masquerade&amp;quot;&lt;/span&gt;&lt;/p&gt;&lt;p data-start=&quot;3962&quot; data-end=&quot;4042&quot;&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 24 Oct 2025 21:31:50 +0800</pubDate></item><item><title>在 Linux 上通过 mitmproxy 获取并信任根证书</title><link>https://teddyou.com/?id=178</link><description>&lt;p&gt;在使用 &lt;strong&gt;mitmproxy&lt;/strong&gt; 做流量拦截时，客户端会收到代理签发的自签证书。如果系统没有信任这个证书，就会出现如下报错：&lt;/p&gt;&lt;pre&gt;Client&amp;nbsp;TLS&amp;nbsp;handshake&amp;nbsp;failed.&amp;nbsp;The&amp;nbsp;client&amp;nbsp;does&amp;nbsp;not&amp;nbsp;trust&amp;nbsp;the&amp;nbsp;proxy&amp;#39;s&amp;nbsp;certificate&lt;/pre&gt;&lt;p&gt;本文将演示如何在 Linux 系统中通过命令行下载 mitmproxy 根证书，并安装到系统信任库，确保应用能够正常通过代理访问 HTTPS 网站。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;1. 背景&lt;/h2&gt;&lt;p&gt;当你使用 mitmproxy 作为 HTTP/HTTPS 代理时，它会自动生成一套自签名 CA，用于重新签发服务端证书。但客户端默认并不信任这套 CA，所以所有走代理的 HTTPS 请求都会因为 &lt;strong&gt;unknown ca&lt;/strong&gt; 而失败。&lt;/p&gt;&lt;p&gt;解决办法就是把 mitmproxy 的根 CA 证书下载下来，并导入到系统信任库中。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;2. 通过代理下载证书&lt;/h2&gt;&lt;p&gt;mitmproxy 自带一个证书分发页面 &lt;code inline=&quot;&quot;&gt;http://mitm.it/&lt;/code&gt;，你可以直接通过代理访问并获取证书。&lt;/p&gt;&lt;p&gt;假设 mitmproxy 运行在 &lt;strong&gt;192.168.157.1:8080&lt;/strong&gt;，执行：&lt;/p&gt;&lt;pre&gt;curl&amp;nbsp;-x&amp;nbsp;http://192.168.157.1:8080&amp;nbsp;http://mitm.it/cert/pem&amp;nbsp;-o&amp;nbsp;mitmproxy-ca-cert.pem&lt;/pre&gt;&lt;p&gt;这条命令会通过代理请求 &lt;code inline=&quot;&quot;&gt;mitm.it&lt;/code&gt;，代理会自动返回它自己的根证书，并保存为 &lt;code inline=&quot;&quot;&gt;mitmproxy-ca-cert.pem&lt;/code&gt;。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;3. 安装证书到系统信任库&lt;/h2&gt;&lt;p&gt;下载完成后，将证书复制到系统的 CA anchors 目录，并刷新信任库：&lt;/p&gt;&lt;pre&gt;mkdir&amp;nbsp;-p&amp;nbsp;/etc/pki/ca-trust/source/anchors/
cp&amp;nbsp;mitmproxy-ca-cert.pem&amp;nbsp;/etc/pki/ca-trust/source/anchors/mitmproxy.crt
update-ca-trust&amp;nbsp;extract&lt;/pre&gt;&lt;p&gt;执行完成后，mitmproxy 的根证书就被系统全局信任了&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description><pubDate>Thu, 04 Sep 2025 10:23:21 +0800</pubDate></item><item><title>在Windows平台部署SCUM服务器</title><link>https://teddyou.com/?id=177</link><description>&lt;p&gt;以下是 &lt;strong&gt;EUGameHost Tech Blog 最新版中文翻译与整理&lt;/strong&gt;，源自其 2025 年 7 月初发布的官方英文指南(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)：&lt;/p&gt;&lt;hr/&gt;&lt;h1&gt;如何部署 SCUM 专属服务器（2025 完整指南）&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;作者：William Allison → 2025年7月4日&lt;/strong&gt;&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;一、前置要求&lt;/h2&gt;&lt;h3&gt;1. 硬件&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;最低配置&lt;/strong&gt;：8 GB RAM（推荐更高以支持高玩家量）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;建议&lt;/strong&gt;：若使用 Mod 或大型配置，建议预留更大资源(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;2. 网络端口&lt;/h3&gt;&lt;p&gt;请确保以下端口已放通并映射至服务器 IP：&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th&gt;端口&lt;/th&gt;&lt;th&gt;协议&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;7777&lt;/td&gt;&lt;td&gt;UDP&lt;/td&gt;&lt;td&gt;游戏客户端主要连接端口&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7778&lt;/td&gt;&lt;td&gt;UDP&lt;/td&gt;&lt;td&gt;原始 UDP 数据流端口（主端口+1）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7779&lt;/td&gt;&lt;td&gt;UDP&lt;/td&gt;&lt;td&gt;Steam 查询端口（主端口+2）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7777&lt;/td&gt;&lt;td&gt;TCP&lt;/td&gt;&lt;td&gt;可选的 RCON 远程控制端口&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 请避免使用端口区间 27020–27050，以防与 Steam 服务冲突(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;3. 操作系统与依赖（仅限 Windows）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;必须运行 64 位 Windows（SCUMServer.exe 为 64 位应用）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;安装以下运行时：&lt;/p&gt;&lt;/li&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;Visual&amp;nbsp;C++ Redistributables（从 2012 到 2022）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;DirectX End-User Runtimes(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h3&gt;4. SteamCMD&lt;/h3&gt;&lt;p&gt;从官方渠道下载并安装 Win 版 SteamCMD&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;二、服务器安装与更新&lt;/h2&gt;&lt;h3&gt;安装/更新脚本：&lt;code inline=&quot;&quot;&gt;install_update_scum.bat&lt;/code&gt;&lt;/h3&gt;&lt;pre&gt;@echo&amp;nbsp;off
set&amp;nbsp;INSTALL_DIR=C:\scumserver
set&amp;nbsp;STEAMCMD_DIR=C:\steamcmd

if&amp;nbsp;not&amp;nbsp;exist&amp;nbsp;&amp;quot;%STEAMCMD_DIR%\steamcmd.exe&amp;quot;&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;SteamCMD&amp;nbsp;not&amp;nbsp;found&amp;nbsp;in&amp;nbsp;%STEAMCMD_DIR%.&amp;nbsp;Please&amp;nbsp;install&amp;nbsp;it&amp;nbsp;first.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pause
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&amp;nbsp;/b
)

&amp;quot;%STEAMCMD_DIR%\steamcmd.exe&amp;quot;&amp;nbsp;+force_install_dir&amp;nbsp;&amp;quot;%INSTALL_DIR%&amp;quot;&amp;nbsp;+login&amp;nbsp;anonymous&amp;nbsp;+app_update&amp;nbsp;3792580&amp;nbsp;validate&amp;nbsp;+quit

echo&amp;nbsp;SCUM&amp;nbsp;Server&amp;nbsp;installed&amp;nbsp;or&amp;nbsp;updated&amp;nbsp;successfully.
pause&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;将 &lt;code inline=&quot;&quot;&gt;INSTALL_DIR&lt;/code&gt; 和 &lt;code inline=&quot;&quot;&gt;STEAMCMD_DIR&lt;/code&gt; 修改为你的实际路径&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;每次安装或更新时运行此脚本，确保服务器保持最新(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;三、启动服务器&lt;/h2&gt;&lt;p&gt;在 &lt;code inline=&quot;&quot;&gt;SCUM\Binaries\Win64\&lt;/code&gt; 文件夹中新建 &lt;code inline=&quot;&quot;&gt;scum_server.bat&lt;/code&gt;：&lt;/p&gt;&lt;pre&gt;start&amp;nbsp;SCUMServer.exe&amp;nbsp;-log&amp;nbsp;-port=7777&amp;nbsp;-MaxPlayers=64&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;可根据需求调整 &lt;code inline=&quot;&quot;&gt;-port&lt;/code&gt; 和 &lt;code inline=&quot;&quot;&gt;-MaxPlayers&lt;/code&gt; 参数(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;可选参数：&lt;/p&gt;&lt;/li&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;-nobattleye&lt;/code&gt;：禁用 BattlEye 反作弊（不建议）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;-queryPort=&lt;/code&gt;：自定义查询端口（应为主端口+2）(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;四、端口映射说明&lt;/h2&gt;&lt;p&gt;确保在你的路由器或防火墙规则中映射上述 UDP 与 TCP 端口到服务器本地 IP(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;br/&gt;（如需帮助，可参考 portforward.com）&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;五、服务器列表可见性&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;游戏中使用 &lt;code inline=&quot;&quot;&gt;IP:端口&lt;/code&gt; 收藏你的主机&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;也可通过 SCUM 内置的社区服务器列表查找&lt;br/&gt;但可见性可能不稳定(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;六、设置开机自动启动（仅限 Windows）&lt;/h2&gt;&lt;p&gt;使用 &lt;strong&gt;任务计划程序&lt;/strong&gt;：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;创建基本任务，触发条件设置为系统启动&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;操作设为运行 &lt;code inline=&quot;&quot;&gt;scum_server.bat&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;“起始于”路径设为脚本所在文件夹&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在“一般”标签页中：&lt;/p&gt;&lt;/li&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;选择“无论用户是否登录都运行”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;勾选“使用最高权限运行”(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;七、更新机制&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;更新只需再次运行 &lt;code inline=&quot;&quot;&gt;install_update_scum.bat&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;可将此脚本定时加入任务计划程序，建议每天或每周更新一次&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;更新前请确保服务器已关闭，以免发生文件冲突(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;八、数据备份&lt;/h2&gt;&lt;h3&gt;手动备份&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;停止服务器&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;进入 &lt;code inline=&quot;&quot;&gt;C:\scumserver\SCUM\Saved\&lt;/code&gt; 文件夹&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;复制保存在其他安全目录中(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;自动备份：&lt;code inline=&quot;&quot;&gt;backup_scum.bat&lt;/code&gt;&lt;/h3&gt;&lt;pre&gt;@echo&amp;nbsp;off
set&amp;nbsp;SERVER_DIR=C:\scumserver
set&amp;nbsp;BACKUP_DIR=D:\scum_backups\%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%%time:~3,2%
mkdir&amp;nbsp;&amp;quot;%BACKUP_DIR%&amp;quot;
xcopy&amp;nbsp;&amp;quot;%SERVER_DIR%\SCUM\Saved&amp;quot;&amp;nbsp;&amp;quot;%BACKUP_DIR%&amp;quot;&amp;nbsp;/E&amp;nbsp;/I&amp;nbsp;/Y&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;建议每日夜间运行&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;设置“使用最高权限运行”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;可选步骤：备份前停止服务器，结束后重启(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;备份优化建议：&lt;/h4&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;使用 &lt;code inline=&quot;&quot;&gt;.zip&lt;/code&gt; 或其他压缩方式节省空间&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;自动删除旧备份，避免数据堆积&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;将数据存储在本地或离线位置，提高安全性(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;九、故障排查&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;无法显示服务器：检查防火墙和端口映射&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;更新失败：重新运行 &lt;code inline=&quot;&quot;&gt;install_update_scum.bat&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;RCON 无响应：确认 TCP 7777 已放行(&lt;a href=&quot;https://www.eugamehost.com/blog/how-to-set-up-a-scum-dedicated-server-2025-complete-step-by-step-guide/?utm_source=chatgpt.com&quot; title=&quot;How to Set Up a SCUM Dedicated Server (2025) - EUGameHost&quot;&gt;eugamehost.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Mon, 07 Jul 2025 10:54:38 +0800</pubDate></item><item><title>使用 LVM 将系统盘扩容至 500G，并恢复原 /data 数据</title><link>https://teddyou.com/?id=176</link><description>&lt;p&gt;在日常 Linux 系统维护中，随着数据积累，根目录 &lt;code inline=&quot;&quot;&gt;/&lt;/code&gt; 空间容易告急。本文记录了我在一台 Ubuntu 系统中，使用 LVM（逻辑卷管理）将系统盘 &lt;code inline=&quot;&quot;&gt;/&lt;/code&gt; 从原始的 12.5G 扩容至 500G，并安全地从 &lt;code inline=&quot;&quot;&gt;/dev/sdb&lt;/code&gt; 中恢复原 &lt;code inline=&quot;&quot;&gt;/data&lt;/code&gt; 数据的全过程，供参考。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;? 背景信息&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;根分区 &lt;code inline=&quot;&quot;&gt;/&lt;/code&gt; 使用 LVM 管理，原大小为约 13G，磁盘空间已满：&lt;/p&gt;&lt;pre&gt;df&amp;nbsp;-h&amp;nbsp;/
#&amp;nbsp;/dev/mapper/ubuntu--vg-ubuntu--lv&amp;nbsp;&amp;nbsp;&amp;nbsp;13G&amp;nbsp;&amp;nbsp;&amp;nbsp;12G&amp;nbsp;&amp;nbsp;&amp;nbsp;58M&amp;nbsp;&amp;nbsp;100%&amp;nbsp;/&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;有一块额外的 1.8T 硬盘 &lt;code inline=&quot;&quot;&gt;/dev/sdb&lt;/code&gt;，原挂载为 &lt;code inline=&quot;&quot;&gt;/data&lt;/code&gt;，已备份至 &lt;code inline=&quot;&quot;&gt;/usb/data&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;?️ 操作步骤&lt;/h2&gt;&lt;h3&gt;? 第一步：备份原始 &lt;code inline=&quot;&quot;&gt;/data&lt;/code&gt; 数据&lt;/h3&gt;&lt;p&gt;确保数据安全是第一位，我将原 &lt;code inline=&quot;&quot;&gt;/data&lt;/code&gt; 内容复制到了另一个 U 盘：&lt;/p&gt;&lt;pre&gt;cp&amp;nbsp;-rp&amp;nbsp;/data&amp;nbsp;/usb/data&lt;/pre&gt;&lt;hr/&gt;&lt;h3&gt;? 第二步：清理 &lt;code inline=&quot;&quot;&gt;/dev/sdb&lt;/code&gt; 原有分区信息&lt;/h3&gt;&lt;p&gt;卸载 &lt;code inline=&quot;&quot;&gt;/data&lt;/code&gt;（如果正在使用）：&lt;/p&gt;&lt;pre&gt;umount&amp;nbsp;/data&lt;/pre&gt;&lt;p&gt;删除旧分区并清除签名：&lt;/p&gt;&lt;pre&gt;fdisk&amp;nbsp;/dev/sdb
#&amp;nbsp;输入&amp;nbsp;d&amp;nbsp;删除分区，输入&amp;nbsp;w&amp;nbsp;保存
wipefs&amp;nbsp;-a&amp;nbsp;/dev/sdb&lt;/pre&gt;&lt;hr/&gt;&lt;h3&gt;? 第三步：将 /dev/sdb 转为 LVM 使用&lt;/h3&gt;&lt;p&gt;初始化为物理卷：&lt;/p&gt;&lt;pre&gt;pvcreate&amp;nbsp;/dev/sdb&lt;/pre&gt;&lt;p&gt;扩展卷组（我的卷组叫 &lt;code inline=&quot;&quot;&gt;ubuntu-vg&lt;/code&gt;）：&lt;/p&gt;&lt;pre&gt;vgextend&amp;nbsp;ubuntu-vg&amp;nbsp;/dev/sdb&lt;/pre&gt;&lt;hr/&gt;&lt;h3&gt;? 第四步：将系统根卷扩展到 500G&lt;/h3&gt;&lt;pre&gt;lvextend&amp;nbsp;-L&amp;nbsp;500G&amp;nbsp;/dev/ubuntu-vg/ubuntu-lv&lt;/pre&gt;&lt;p&gt;扩展文件系统（ext4）：&lt;/p&gt;&lt;pre&gt;resize2fs&amp;nbsp;/dev/ubuntu-vg/ubuntu-lv&lt;/pre&gt;&lt;p&gt;确认结果：&lt;/p&gt;&lt;pre&gt;df&amp;nbsp;-h&amp;nbsp;/
#&amp;nbsp;应显示大小约为&amp;nbsp;500G&lt;/pre&gt;&lt;hr/&gt;&lt;h3&gt;? 第五步：恢复 &lt;code inline=&quot;&quot;&gt;/data&lt;/code&gt; 数据&lt;/h3&gt;&lt;p&gt;恢复已备份的数据：&lt;/p&gt;&lt;pre&gt;mkdir&amp;nbsp;/data
cp&amp;nbsp;-rp&amp;nbsp;/usb/data/*&amp;nbsp;/data/&lt;/pre&gt;&lt;p&gt;确认数据恢复无误。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;✅ 最终效果&lt;/h2&gt;&lt;pre&gt;df&amp;nbsp;-h
#&amp;nbsp;/&amp;nbsp;现在为&amp;nbsp;500G&amp;nbsp;大小，空间充足
#&amp;nbsp;/data&amp;nbsp;目录也已恢复&lt;/pre&gt;</description><pubDate>Wed, 07 May 2025 00:56:10 +0800</pubDate></item><item><title>CentOS 源码环境下 Certbot 安装 + HTTPS 配置完整指南</title><link>https://teddyou.com/?id=175</link><description>&lt;h2&gt;☑️ 背景信息&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;系统&lt;/strong&gt;：CentOS 7&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt;：源码安装 Python 3.11，路径 &lt;code inline=&quot;&quot;&gt;/usr/bin/python3&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nginx&lt;/strong&gt;：源码安装，配置目录 &lt;code inline=&quot;&quot;&gt;/usr/local/nginx/conf/nginx.conf&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Web 路径&lt;/strong&gt;：&lt;code inline=&quot;&quot;&gt;/usr/local/nginx/html/bctc/wordpress&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;域名&lt;/strong&gt;：&lt;code inline=&quot;&quot;&gt;bctc-squad.cn&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;☑️ 安装 certbot 并解决路径问题&lt;/h2&gt;&lt;h3&gt;① 确保 Python3 pip3 正常&lt;/h3&gt;&lt;pre&gt;python3&amp;nbsp;-m&amp;nbsp;ensurepip&amp;nbsp;--upgrade
python3&amp;nbsp;-m&amp;nbsp;pip&amp;nbsp;install&amp;nbsp;--upgrade&amp;nbsp;pip&lt;/pre&gt;&lt;h3&gt;② pip 安装 certbot&lt;/h3&gt;&lt;pre&gt;pip3&amp;nbsp;install&amp;nbsp;certbot
pip3&amp;nbsp;install&amp;nbsp;certbot-nginx&lt;/pre&gt;&lt;h3&gt;③ 找不到 certbot 输入点&lt;/h3&gt;&lt;p&gt;执行 &lt;code inline=&quot;&quot;&gt;certbot&lt;/code&gt; 时报错:&lt;/p&gt;&lt;pre&gt;-bash:&amp;nbsp;certbot:&amp;nbsp;command&amp;nbsp;not&amp;nbsp;found&lt;/pre&gt;&lt;p&gt;解决办法：搜索 certbot 实际命令位置：&lt;/p&gt;&lt;pre&gt;find&amp;nbsp;/usr/python3.11&amp;nbsp;-type&amp;nbsp;f&amp;nbsp;-name&amp;nbsp;certbot&lt;/pre&gt;&lt;p&gt;如果找到：&lt;/p&gt;&lt;pre&gt;/usr/python3.11/bin/certbot&lt;/pre&gt;&lt;p&gt;创建全局软链接：&lt;/p&gt;&lt;pre&gt;ln&amp;nbsp;-s&amp;nbsp;/usr/python3.11/bin/certbot&amp;nbsp;/usr/bin/certbot&lt;/pre&gt;&lt;p&gt;此时再执行:&lt;/p&gt;&lt;pre&gt;certbot&amp;nbsp;--version&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;☑️ 签发 SSL 证书&lt;/h2&gt;&lt;pre&gt;/usr/bin/certbot&amp;nbsp;certonly&amp;nbsp;\
&amp;nbsp;&amp;nbsp;--webroot&amp;nbsp;\
&amp;nbsp;&amp;nbsp;-w&amp;nbsp;/usr/local/nginx/html/bctc/wordpress&amp;nbsp;\
&amp;nbsp;&amp;nbsp;-d&amp;nbsp;bctc-squad.cn&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;成功后证书保存于:&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;/etc/letsencrypt/live/bctc-squad.cn/fullchain.pem&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;/etc/letsencrypt/live/bctc-squad.cn/privkey.pem&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;☑️ 配置 Nginx 支持 HTTPS&lt;/h2&gt;&lt;pre&gt;server&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;80;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;注意需要放开80端口
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server_name&amp;nbsp;*.bctc-squad.cn&amp;nbsp;bctc-squad.cn;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rewrite&amp;nbsp;^/(.*)$&amp;nbsp;https://bctc-squad.cn/$1;
}

server&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;443&amp;nbsp;ssl;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server_name&amp;nbsp;bctc-squad.cn;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssl_certificate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/etc/letsencrypt/live/bctc-squad.cn/fullchain.pem;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssl_certificate_key&amp;nbsp;/etc/letsencrypt/live/bctc-squad.cn/privkey.pem;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;其他配置省略
}&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;重载 Nginx ：&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;nginx&amp;nbsp;-s&amp;nbsp;reload&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;☑️ 设置证书自动续签 crontab&lt;/h2&gt;&lt;pre&gt;crontab&amp;nbsp;-e&lt;/pre&gt;&lt;h3&gt;推荐版：每两个月一次（使用绝对路径）&lt;/h3&gt;&lt;pre&gt;0&amp;nbsp;3&amp;nbsp;1&amp;nbsp;*/2&amp;nbsp;*&amp;nbsp;/usr/bin/certbot&amp;nbsp;renew&amp;nbsp;--quiet&amp;nbsp;--post-hook&amp;nbsp;&amp;quot;/usr/local/nginx/sbin/nginx&amp;nbsp;-s&amp;nbsp;reload&amp;quot;&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;☑️ 结论&lt;/h2&gt;&lt;p&gt;这次配置经历了：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;certbot 安装位置异常&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;缺少 &lt;strong&gt;main&lt;/strong&gt; 时无法 &lt;code inline=&quot;&quot;&gt;python3 -m certbot&lt;/code&gt; 运行&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;手动创建软链接解决 certbot not found&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;成功签发证书并配置 nginx 支持 https&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;配置自动续签&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这套思路适用于所有使用清空系统或静态 Nginx 环境、自行编译 Python 环境的情况。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 19 Apr 2025 17:31:35 +0800</pubDate></item></channel></rss>