首页
学习笔记
经验教程
标杆项目
个人简历
ZDREAM
一万年太久,只争朝夕
累计撰写
35
篇文章
累计创建
2
个标签
累计收到
1
条评论
栏目
首页
学习笔记
经验教程
标杆项目
个人简历
目 录
CONTENT
以下是
学习笔记
相关的文章
2023-09-28
拒绝文档虚无主义:运维迭代期的必要文档清单
在小团队的项目管理世界里,我们总是在与混乱作斗。手头的工作常常是一团乱麻:既要处理线上系统的日常维护,又要应对突如其来的紧急对接;既要按部就班地推进合同里的升级改造,又要见缝插针地实现那些计划外的“小需求”。在这样的节奏下,“写文档”这三个字听起来就像个遥远的理想。当问题扑面而来时,第一反应是挽起袖子去解决,而不是坐下来先记录。但时间一长,我们付出的代价是惨痛的:同样的问题反复向不同的人解释;一个简单的修改引发了意想不到的连锁反应;核心成员一休假,某个模块就成了无人敢碰的“黑盒”。这些经历让我不得不重新审视文档的价值。《GB/T 8567-2006 计算机软件文档编制规范》是一套完整的软件文档体系。虽然该标准非常全面,但完整照搬的话实在有点不切实际,但我们可以借鉴其核心思想,根据项目实际情况,选取最关键的文档进行编制和维护。以下是根据实践经验,从该标准中提炼出的、在不同阶段应重点关注的核心过程文档。它们就像航海图和压舱石,帮助我们在信息的风浪中保持航向。一、开发与改造阶段:打好地基,立好梁柱无论是启动一个新项目,还是对现有系统进行一次“大手术”,前期的文档工作就是在打地基。地基不牢,上层建筑再华丽也终将动摇。1.《软件需求规格说明书 (SRS)》:所有工作的“宪法”。一份合格的SRS,从来不是功能的简单罗列。我踩过最大的坑,就是对需求的描述充满了“大概”、“尽快”、“更好”这类模糊的词。后来我们强制要求,每一条需求都必须是可验证的。“系统响应速度快”是空话,而“95%的查询请求在2秒内返回结果”才是可以写进测试用例的承诺。除了功能,性能、安全、兼容性这些非功能性需求也必须白纸黑字地写清楚,这能挡掉未来无数的扯皮。我们还会大量使用流程图和原型线框图,一张图往往比几百字更能清晰地表达业务逻辑和用户交互。最关键的是,这份文档必须经过所有关键角色的正式评审确认,一旦确认,它就是我们抵挡需求随意变更的第一道防线。2.《软件(结构)设计说明书 (SDD)》:开发团队内部的“通用语言”这份文档是写给未来的自己和同事看的。它不仅仅是画几个架构图、贴几段数据库表结构那么简单。我们最强调的一点是,不仅要写“是什么”和“怎么做”,更要写“为什么这么做”。比如,为什么要用Redis而不是Memcached做缓存?为什么这个模块要设计成策略模式?这些设计决策背后的思考,对于后来者理解系统、进行维护的价值,远超代码本身。在接口设计上,我们要求把请求方法、参数(包括类型、是否必填)、成功和失败的返回示例都写得一清二楚,这极大地减少了前后端联调时的沟通成本。3.《软件测试计划 (STP)》:保证质量不是一句口号测试不能是随意的“点点点”。一份测试计划,首先要明确“测什么”和“不测什么”,把测试范围框定清楚。接着,要定义好通过标准,比如我们会规定“不允许存在致命和严重级别的缺陷”是版本上线的红线。测试环境、测试账号、测试数据这些准备工作,也必须提前规划,否则到了测试阶段就会手忙脚乱。二、运维服务项目:留好航迹,有据可查如果说开发是造船,运维就是日复一日的航行。航行中最重要的,就是清晰的航行日志。1.运维工作的核心,是一份动态的“问题与变更管理记录”无论是用户反馈的Bug,还是内部提出的优化,我们都坚持走一个简单的工单流程。这个记录很简单,但必须包含几个要素:谁提的、什么问题、什么时候、怎么解决的、谁解决的。这个习惯的价值在半年后就体现出来了:当遇到类似问题时,我们可以快速翻阅历史记录找到解决方案;进行工作复盘时,我们能清晰地看到问题的分布和趋势。它把零散的工作,变成了一份可分析、可追溯的宝贵数据。2.在代码层面,任何修改都要有迹可循。动手修复一个Bug前,我们要求开发人员做的第一件事,就是去翻阅相关的设计文档(SDD)。这能帮助他们理解这部分代码的“前世今生”,避免好心办了坏事。如果某次修改涉及到底层架构或数据库结构的变更,那么同步更新设计文档就是一条铁律。否则,文档就会慢慢变成一堆废纸。3.雷打不动的任务:更新《软件版本说明 (SVD)》。这份文档连接了开发、测试和用户。我们把它格式化,固定包含“新增功能”、“优化改进”、“缺陷修复”和“部署注意事项”这几部分。每一个条目,我们都要求关联到最初的需求或问题工单ID。这样,任何一个版本的任何一个改动,我们都能一路追溯回它的源头。对于部署人员来说,这是一份清晰的操作手册;对于用户来说,这是一份透明的更新公告。说给自己文档工作确实会占用时间,但它是一种投资,而不是成本。它投资的是团队的沟通效率、知识的传承和项目的长期稳定性。在一片混乱中,正是这些看似“多余”的文档,为我们构建了秩序,让我们能更从容地应对未来的各种不确定性。附文《GBT 8567-2006 计算机软件文档编制规范》确实是一套非常完备的指南性规范,适用于从零开始的、非常规范的大型软件开发项目。一、开发过程文档名称 (代码)主要内容简介1. 规划与启动阶段可行性分析(研究)报告 (FAR)对项目的必要性、技术方案、经济效益、风险等进行全面分析,得出“做”或“不做”的结论。软件开发计划 (SDP)项目的总体管理蓝图。包含项目范围、目标、进度计划、资源分配、风险管理、交付物清单等。2. 需求分析阶段软件需求规格说明 (SRS)极为核心的文档。详细、准确地描述软件的功能、性能、数据、接口、用户界面及非功能性需求。系统/子系统规格说明 (SSS)从更高层次定义整个系统的需求,特别是当项目包含硬件和多个软件子系统时。3. 设计阶段系统/子系统设计说明 (SSDD)描述系统的高层体系结构,划分主要的子系统和组件,定义它们之间的关系和接口。软件(结构)设计说明 (SDD)详细描述软件的内部设计。包括模块划分、程序流程、算法、数据结构、模块间接口等。数据库(顶层)设计说明 (DBDD)专门针对数据库的设计。包括概念模型(E-R图)、逻辑设计(表结构)、物理设计、视图、索引等。接口设计说明 (IDD)详细描述软件与外部系统、硬件或软件内部模块之间的接口细节,包括数据格式、协议、调用方式等。4. 实现与测试阶段软件测试计划 (STP)规划整个测试活动。定义测试范围、测试策略、测试环境、测试用例设计方法、通过/失败标准。软件测试报告 (STR)记录测试活动的结果。总结执行了哪些测试、发现了哪些缺陷、缺陷的修复情况,并对软件质量给出评估。5. 交付与部署阶段软件版本说明 (SVD)"Release Notes"。描述特定软件版本的新增功能、修改内容、修复的缺陷、已知问题及安装方法。软件用户手册 (SUM)提供给最终用户的操作指南。说明软件的安装、配置、各项功能的使用方法、常见问题处理等。计算机操作手册 (COM)提供给系统操作员的指南(如有)。说明系统的启动、关闭、备份、恢复等日常操作流程。6. 项目管理与支持软件配置管理计划 (SCMP)定义如何对项目的代码、文档等所有产物进行版本控制和变更管理。软件质量保证计划 (SQAP)定义为保证软件质量所要进行的各项活动、遵循的标准和流程。项目开发总结报告 (PDSR)项目结束后,对整个开发过程进行回顾和总结,分析成功经验和失败教训,为未来项目提供参考。二、运维过程文档名称主要内容简介软件需求规格说明 (SRS)理解功能的原始设计意图,判断用户提出的问题或新需求是否在原范围之内。软件(结构)设计说明 (SDD)定位问题、评估修改影响时,必须参考的核心技术文档,用于理解代码逻辑和系统架构。数据库(顶层)设计说明 (DBDD)在处理数据相关问题或进行数据库变更时,用于理解数据表结构和关系。软件用户手册 (SUM)从用户视角复现问题,或在解答用户疑问时提供标准答案。(变更/问题报告单)(通常为内部管理工具中的记录)运维工作的起点。记录问题的来源、描述、优先级、处理过程和结果。软件测试计划 (STP)针对某次变更(如Bug修复或小功能增加)制定测试方案,特别是回归测试的范围。软件测试报告 (STR)记录针对本次变更的测试结果,确认问题已修复且未引入新问题。软件版本说明 (SVD)运维阶段最重要的输出。每次发布更新都必须提供,清晰说明本次更新修复了什么、优化了什么。(更新的)设计说明 (SDD)如果变动较大,影响了系统原有架构或核心逻辑,必须同步更新此文档,保持文档与代码一致。(更新的)用户手册 (SUM)如果变更影响了用户操作界面或流程,必须同步更新用户手册。软件移交计划 (STrP)当运维责任需要从一个团队移交给另一个团队时,用于规划移交内容、时间、培训等事宜。
2023-09-28
13
0
0
项目管理
2023-06-24
用金字塔原理做好汇报:穷举-归纳-总结
无论是周报、月报,还是临时的进展同步,繁多的汇报是一项无法回避的任务。面对繁杂的事务——系统维护、功能开发、临时需求、多方沟通——如何将这些信息组织成一份清晰、有力的汇报,而不仅仅是流水账式的罗列,是一个值得思考的问题。我对“金字塔原理”的理解是“穷举-归纳-总结”三步,并由此开展工作。第一步:穷举 - 把所有事情都摆上台面这是最基础,也是最原始的一步。在准备汇报前,先把所有与当前周期、当前项目相关的工作事项,不分大小、不分主次,全部列出来。这个阶段的目标是完整性,而非结构性。就像整理房间前,先把所有东西都拿出来摊在地上。通常,这个列表会包含以下内容:常规维护:解决了哪些线上问题,处理了多少用户工单,系统的运行状态如何。项目进展:计划内的功能开发到了哪个阶段(设计、开发、测试、上线),里程碑的达成情况。临时任务:响应了哪些计划外的需求,完成了哪些紧急的对接工作。沟通协调:与哪些合作方进行了会议,达成了什么共识,明确了哪些下一步计划。风险与问题:识别了哪些潜在风险,正在跟进或已经解决了哪些阻碍。团队内部事务:资源调配、技术评审等。“穷举”清单是后续所有工作的基础,它很凌乱,但确保了信息的全面,防止在后续整理中遗漏重要细节第二步:归纳 - 从无序到有序的梳理单纯的罗列是低效的,因为它把理解和分析的压力抛给了汇报的接收方。第二步的核心,就是对穷举出的事项进行分类和组织,找到它们背后的逻辑关联。如何归纳?没有唯一的标准,需要根据汇报的对象和目的来定。常见的归纳维度有:按工作模块:这是最直接的方式。例如,可以分为“平台稳定性保障”、“核心功能A升级”、“数据服务B优化”等几个大类。每个类别下,再放入对应的工作项。按目标导向:这种方式更进一步,关注工作的价值。例如,可以分为“提升系统性能与用户体验”、“响应核心业务需求”、“保障项目按期交付”等。这种分法能更好地体现工作的目的性。按项目状态:比如“已完成事项”、“进行中事项”、“下一步计划”。这种结构简单明了,适合用于快速的进展同步。归纳的过程,本身就是一次对工作的复盘和思考。它强迫我们去审视,每一件具体事务,究竟是为了服务于哪个更大的目标。当这些事项被有序地组织在一起后,工作的脉络就变得清晰可见了。第三步:总结 - 提炼核心结论,先说结果这是将信息结构化为“金字塔”的最后一步,也是最关键的一步。汇报的最终目的是传递信息和结论,而非单纯展示工作量。在完成了归纳之后,需要为每一个归纳好的类别提炼出一个小结。这个小结就是这个类别的“论点”。例如,在“平台稳定性保障”这个类别下,可能罗列了“修复了3个高优Bug”、“优化了数据库查询性能”、“完成了服务器安全补丁更新”等具体事项。那么,这个类别的小结就可以是:“本周平台整体运行平稳,关键性能指标得到优化。”当所有类别都有了各自的小结之后,再将这些小结进行整合,提炼出整个汇报的总览性结论,放在汇报的最顶端。一个结构化的汇报就此成型:总览结论:例如,“本周项目按计划顺利推进,核心功能开发完成,外部协作风险已得到控制。”分项论点1:平台稳定性得到提升,本周处理了X个高优问题。支撑事实1.1支撑事实1.2分项论点2:新功能模块A已完成开发,进入联调测试阶段。支撑事实2.1支撑事实2.2分项论点3:与合作方的对接工作取得进展,明确了下一步接口标准。支撑事实3.1这种“结论先行,以上统下”的结构,极大地降低了信息接收方的认知负荷。他们可以先快速了解整体情况,如果对某个部分感兴趣,再深入查看具体的支撑细节。写在最后从“穷举”的混乱,到“归纳”的有序,再到“总结”的清晰,这个过程不仅仅是一种汇报技巧,更像是一种思维习惯的养成。它帮助我们在纷繁的日常事务中,保持对整体目标的关注,并能够清晰、准确地将价值传递出去。这套方法并不复杂,贵在坚持实践。在每一次准备汇报时,都进行这样的结构化思考,久而久之,逻辑和条理便会内化于心。
2023-06-24
28
0
0
项目管理
2023-04-24
FRP部署配置及安全性加强
frp 是什么?frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。一、基础配置使用(ssh为例)下载地址:https://github.com/fatedier/frp/releases1、在具有公网 IP 的机器上部署 frps部署 frps 并编辑 frps.toml 文件以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:bindPort = 7000 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。$ sudo nano /etc/systemd/system/frps.service 写入内容[Unit] 命令启动服务器:./frps -c ./frps.toml。使用 systemd 命令管理 frps 服务# 启动frp 设置 frps 开机自启动sudo systemctl enable frps2、在需要被访问的内网机器上部署 frpc部署 frpc 并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 x.x.x.x。示例配置:serverAddr = "x.x.x.x" name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = 6000 localIP 和 localPort 配置为需要从公网访问的内网服务的地址和端口。remotePort 表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。启动客户端:./frpc -c ./frpc.toml。3、通过 SSH 访问内网机器使用以下命令通过 SSH 访问内网机器,假设用户名为 test:ssh -o Port=6000 test@x.x.x.x frp 将请求发送到 x.x.x.x:6000 的流量转发到内网机器的 22 端口。二、更安全地暴露内网服务通过创建一个只有授权用户能够访问的 SSH 服务代理,实现内网服务的安全暴露。某些内网服务,如果直接暴露在公网上,可能存在安全风险。使用 stcp(secret tcp) 类型的代理可以让您安全地将内网服务暴露给经过授权的用户,这需要访问者也部署 frpc 客户端。配置 frps.toml在 frps.toml 文件中添加以下内容:bindPort = 7000 部署 frpc 客户端并配置在需要将内网服务暴露到公网的机器上部署 frpc,并创建如下配置:serverAddr = "x.x.x.x" serverPort = 7000 [[proxies]] 在访问者机器上部署并配置 frpc在想要访问内网服务的机器上也部署 frpc,并创建如下配置:serverAddr = "x.x.x.x" 通过 SSH 访问内网机器使用以下命令通过 SSH 访问内网机器,假设用户名为 test:ssh -o Port=6000 test@127.0.0.1三、通过自定义域名访问内网的 Web 服务通过简单配置 HTTP 类型的代理,您可以让用户通过自定义域名访问内网的 Web 服务。HTTP 类型的代理非常适合将内网的 Web 服务通过自定义域名提供给外部用户。相比于 TCP 类型代理,HTTP 代理不仅可以复用端口,还提供了基于 HTTP 协议的许多功能。HTTPS 与此类似,但是需要注意,frp 的 https 代理需要本地服务是 HTTPS 服务,frps 端不会做 TLS 终止。也可以结合 https2http 插件来实现将本地的 HTTP 服务以 HTTPS 协议暴露出去。1、配置 frps.toml在 frps.toml 文件中添加以下内容,以指定 HTTP 请求的监听端口为 8080:bindPort = 7000 如果需要配置 HTTPS 代理,还需要设置 vhostHTTPSPort。2、配置 frpc.toml在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器 IP 地址、本地 Web 服务监听端口和自定义域名:serverAddr = "x.x.x.x" 3、启动 frps 和 frpc略。4、域名解析将 www.yourdomain.com 和 www.yourdomain2.com 的域名 A 记录解析到服务器的 IP 地址 x.x.x.x。如果服务器已经有对应的域名,您还可以将 CNAME 记录解析到原始域名。另外,通过修改 HTTP 请求的 Host 字段也可以实现相同的效果。5、通过浏览器访问使用浏览器访问 http://www.yourdomain.com:8080 即可访问内网机器上的 80 端口服务,访问 http://www.yourdomain2.com:8080 可以访问内网机器上的 8080 端口服务。四、点对点内网穿透这个示例将演示如何通过点对点 (P2P) 连接来访问内网服务,流量不会通过服务器中转。frp 提供了一种新的代理类型 xtcp,用于在需要传输大量数据且不希望流量经过服务器的情况下实现内网穿透。与 stcp 类似,使用 xtcp 需要在两端都部署 frpc 以建立直接连接。需要注意的是,xtcp 并不适用于所有类型的 NAT 设备,如果穿透失败,可以尝试使用 stcp 代理。1、配置需要暴露到外网的机器上的 frpc.toml 文件在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器地址和端口以及共享密钥 (secretKey),以及本地服务的 IP 地址和端口:serverAddr = "x.x.x.x" 2、在想要访问内网服务的机器上部署 frpc在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器地址和端口,共享密钥 (secretKey) 以及要访问的 P2P 代理的名称:serverAddr = "x.x.x.x" 3、通过 SSH 访问内网机器使用 SSH 命令访问内网机器,假设用户名为 test:ssh -oPort=6000 test@127.0.0.1
2023-04-24
6
0
0
数通网工
2023-03-29
内网穿透的几点思考:从FRP原理到方案选择
一、核心原理市面上许多内网穿透服务,如花生壳,其技术基石与开源项目FRP是相通的,即反向代理。可以把这个过程理解为一个“服务总机”模型:内网设备(Client):身处一座无法从外部直接拨号进入的大楼内部。它知道“总机”的公共电话号码。公网服务器(Server):就是那台“总机”,它拥有一个所有人都能拨打的公共电话号码(公网IP)。外部访问者(Visitor):想要联系大楼内某个特定服务的人。工作流程如下:主动注册:内网的frpc(客户端)启动后,会主动拨打公网frps(服务端)的电话,并保持这条线路通话。它告诉总机:“你好,我是内部的3389端口服务。如果外面有人打总机的12345分机号找我,请把通话转接给我。”请求中继:当外部访问者访问公网服务器IP:12345时,请求实际上是打给了“总机”。连接建立:总机frps收到请求,根据之前frpc注册的规则,通过已经建立好的那条内部线路,将这个外部请求原封不动地转发给内网的frpc。frpc再将请求交给本地的3389端口。至此,一次从公网到内网的连接就打通了。花生壳花生壳可以看作是一个大规模、商业化、并提供了友好图形界面的FRP服务集群。它的特点是:针对端口 (Port-based):操作的核心对象是端口。用户创建一个映射规则,如 your-domain.hsk.me:12345 -> 192.168.1.100:3389。公网暴露 (Publicly Exposed):映射一旦建立,your-domain.hsk.me:12345这个地址就在公网上变得可访问。任何知道该地址的人都可以尝试连接,因此服务的安全性高度依赖于被暴露的内网服务本身(例如,Windows的登录密码强度)。 二、典型场景:远程桌面(RDP)将内网Windows主机的3389端口通过FRP或花生壳暴露到公网,是实现远程桌面控制的常见“DIY”方案。但它和“向日葵”、“TeamViewer”这类成熟的远程桌面软件相比,存在显著差异。这好比是“DIY手动挡”与“品牌自动挡”的区别。FRP/花生壳 + RDP:一个强大、灵活的工具包。它利用基础协议实现远程访问,适合技术人员连接自己完全受控的设备,但使用者必须对安全加固措施有清晰的认知。向日葵/TeamViewer:一个成熟、可靠的一站式产品。它封装了所有复杂的技术细节,提供安全、易用、功能丰富的体验,更适合为非技术人员提供支持,或在不稳定的网络环境中工作。特性FRP/花生壳 + RDP (3389) 向日葵/TeamViewer安全性高风险! 直接将RDP端口暴露在公网,是黑客和扫描机器人的首要攻击目标。安全性完全依赖于:<br>1. 极其复杂的Windows登录密码。<br>2. 开启网络级别身份验证(NLA)。<br>3. (可选)修改默认的3389端口为其他高位端口。<br>安全责任完全在你。高得多。它们不直接暴露端口。连接是通过一个ID和随机密码来建立的,这个密码通常是临时的。所有连接都经过其服务器中继和强加密。它们有专门的团队负责安全。易用性对技术人员友好。你需要知道域名、端口号,并使用Windows自带的“远程桌面连接”客户端。对于非技术人员(比如父母)来说,这个过程很复杂。对所有人友好。设计初衷就是为了简单。只需要告诉对方一个ID和密码即可连接,几乎不需要任何网络知识。功能丰富度基础。你只能得到一个纯粹的远程桌面。文件传输需要手动映射驱动器,没有内置的聊天、会话录制、远程重启等功能。非常丰富。集成了文件传输、远程命令行(CMD)、聊天、会话录制、多屏幕切换、远程重启到安全模式等大量为远程支持量身定做的功能。网络适应性一般。Windows RDP协议对网络延迟和丢包比较敏感。在网络状况不佳时,体验会很差。优秀。这些软件的核心技术之一就是智能网络优化。它们会根据当前网络状况自动调整画质、帧率和压缩算法,以保证在糟糕的网络下依然有可用的流畅度。三、frp和vpn的异同FRP解决了“将特定服务请出来”的问题,而VPN(如WireGuard, OpenVPN)则解决了“让自己走进去”的问题。1、核心比喻FRP 方案: 像一个大楼的前台总机。你想找大楼里的“张三”(内网的Web服务),你告诉总机(frps服务器),总机帮你接通张三的电话分机(内网端口)。你只能和张三通话,但你不能在大楼里自由走动去拜访“李四”。VPN 方案: 像一张大楼的门禁卡。你刷卡进入大楼后(连接VPN),你就身处大楼内部了。你可以自由地去访问任何你被授权进入的房间(内网的任何设备和服务),就像你本人就在大楼里一样。2、详细对比表格FeatureFRP (Fast Reverse Proxy)VPN (e.g., WireGuard, OpenVPN)核心目标发布服务 (Publishing):将内网的特定服务安全地暴露到公网上。加入网络 (Joining):将远程的设备安全地接入到内网中,使其成为内网的一员。访问范围端口级 (Per-Port):只能访问你在配置文件里明确指定的端口/服务。网络级 (Network-Level):一旦连接,理论上可以访问内网中的任何设备和任何端口(受防火墙限制)。工作原理反向代理 / 隧道中继:所有流量都由frps服务器进行中转。虚拟网卡 / IP隧道:在你的设备上创建一个虚拟网卡,分配一个内网IP,所有数据包通过加密隧道传输。访问者体验对访问者透明:朋友访问 http://<你的公网IP>:8080 即可,不需要安装任何客户端。需要专用客户端:朋友必须安装VPN客户端软件,并配置好证书/密钥,每次访问前都要先“连接”VPN。网络层级主要工作在应用层/传输层 (Layer 4/7)。主要工作在网络层 (Layer 3)。安全性隧道本身可以加密(需配置),安全性依赖于token和单个服务的认证。默认且强制对整个隧道进行强加密,认证机制更完善(如证书体系)。安全性是其核心设计。典型场景1. 将家里的NAS分享给朋友访问。<br>2. 临时将本地开发环境的网站展示给客户看。<br>3. 搭建一个我的世界(Minecraft)服务器让朋友加入。1. 远程办公,安全访问公司内部的文件服务器、数据库等。<br>2. 组建一个私有的游戏局域网。<br>3. 在外地安全地管理家里的所有智能设备。3、总结异同相同点:都解决了远程访问内网资源的问题。都依赖一个公网服务器作为“跳板”或“网关”。都可以对传输的数据进行加密,保证了基本的安全性。不同点(核心差异):范围的本质区别: 这是最大的不同。frp 是“点对点”的服务暴露,而 VPN 是“点对面”的网络接入。用 frp,你朋友的内网只为你打开了几扇小窗户;用VPN,你朋友给了你一把他家大门的钥匙。对访问者的要求不同: frp 对访问者极其友好,他们只需要一个URL。VPN 则要求访问者进行软件安装和配置,更适合固定的、受信任的用户(比如你自己或公司员工)。网络集成度不同: 连接VPN后,你的电脑会获得一个内网IP地址(例如 192.168.1.101),在网络层面,你的电脑和内网中的其他设备是“对等”的。而frp不会改变你电脑的任何网络配置。
2023-03-29
6
0
0
数通网工
2023-02-15
服务器基础安全加固
我自己的服务器是ubuntu,目前我们的国产化服务器也是兼容的Ubuntu(也有兼容centos的)。一、修改登录验证方式把密码验证换成秘钥文件验证:生成秘钥windows下使用powershell即可创建秘钥文件#使用Ed25519算法生成秘钥文件 ssh-keygen -t ed25519 -C "your_email@example.com" #或者兼容性强的话,使用RSA算法,4096位生成秘钥 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 设置密码(Passphrase):接下来,系统会提示您输入一个密码来保护您的私钥文件。为秘钥再设置密码,多重保险将公钥上传到Linux服务器添加到~/.ssh/authorized_keys 文件中,上传的话需要授权,手动创建文件编辑保存则不需要修改配置修改验证方式 /etc/ssh/sshd_configPasswordAuthentication no MaxAuthTries 3重启ssh服务 sudo systemctl restart sshd二、安装防火墙第一步:基础防火墙配置 (只需配置一次)在开始屏蔽IP之前,我们需要确保防火墙已正确设置并启用。1. 检查 UFW 状态首先,查看 UFW 是否已经激活。codeBashsudo ufw status如果是 inactive (未激活),请继续以下步骤。如果是 active (激活),请检查现有规则,确保SSH端口已开放,然后再进行后续操作。2. 设置默认规则 (安全基石)我们先设置一个安全的默认策略:拒绝所有进入的连接,允许所有出去的连接。codeBash# 拒绝所有未经允许的入站连接 sudo ufw default deny incoming # 允许所有出站连接 sudo ufw default allow outgoing3. 开放必要端口 (!!! 防止失联 !!!)这是最关键的一步!在启用防火墙之前,必须先允许 SSH 连接,否则您将会被服务器拒之门外。codeBash# 允许默认的 SSH 端口 (22) sudo ufw allow ssh # 如果您的 SSH 端口是自定义的,比如 2222,请使用下面的命令 # sudo ufw allow 2222/tcp同时,根据您的服务开放其他必要端口,例如网站服务:codeBash# 允许 HTTP (80端口) sudo ufw allow http # 允许 HTTPS (443端口) sudo ufw allow https4. 启用 UFW确认 SSH 规则已添加后,可以安全地启用防火墙。codeBashsudo ufw enable系统会提示操作可能中断现有连接,输入 y 并回车。第二步:分析日志并管理 IP 黑名单当服务器配置完成后,我们可以日常监控并屏蔽有恶意行为的 IP。1. 查询 SSH 连接日志这些命令可以帮助我们快速定位可疑 IP。codeBash# 查询近期成功的 SSH 登录记录和来源 IP grep 'sshd' /var/log/auth.log | grep 'Accepted' # 查询近期失败的 SSH 登录记录 grep 'sshd' /var/log/auth.log | grep 'Failed' # 统计每个 IP 的失败登录次数,并排序 grep 'sshd' /var/log/auth.log | grep 'Failed' | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr``` 通过最后一个命令的输出,您可以轻松找到那些频繁尝试登录失败的 IP 地址。 **2. 添加 IP 到黑名单** 假设我们发现 IP `139.162.154.81` 存在恶意行为,使用下面简单的命令即可屏蔽它。 ```bash sudo ufw deny from 139.162.154.813. 检查防火墙状态可以随时查看当前的规则列表,确认 IP 是否已被屏蔽。codeBash# 使用 numbered 参数可以显示规则序号,方便后续删除 sudo ufw status numbered您会在列表中看到一条 DENY 规则针对 139.162.154.81。4. 从黑名单中移除 IP (如果误伤)如果需要解除对某个 IP 的屏蔽,操作同样简单。codeBash# 直接通过规则内容删除 sudo ufw delete deny from 139.162.154.81 # 或者,通过 "ufw status numbered" 看到的规则序号来删除(假设序号是 10) # sudo ufw delete 10三、安装杀毒软件以ClamAV为例:1. 安装 ClamAV 核心组件此命令会安装 clamscan (手动扫描工具) 和 freshclam (病毒库更新工具)。codeBashsudo apt update sudo apt install clamav2. 理解并检查病毒库自动更新安装完成后,系统会自动创建一个名为 clamav-freshclam 的后台服务,该服务会定时自动更新病毒库。这是为什么不应手动执行 freshclam 的原因:因为后台服务在运行时会锁定日志文件,此时如果您在命令行中手动运行 freshclam,就会因无法获取文件锁而报错。正确的检查方法是查看日志文件:codeBash# 查看最新的日志,确认更新状态 (按 Ctrl+C 退出) sudo tail -f /var/log/clamav/freshclam.log如果您在日志中看到 Database is up-to-date 或下载更新的记录,就证明自动更新工作正常。(仅在特殊情况下)如何手动强制更新:如果您确实需要立即强制更新,需要先停掉后台服务。codeBash# 1. 临时停止后台服务 sudo systemctl stop clamav-freshclam # 2. 手动执行更新 sudo freshclam # 3. 重新启动后台服务以恢复自动更新 sudo systemctl start clamav-freshclam第二部分:执行手动扫描 (clamscan)clamscan 是一个按需运行的命令行扫描工具。1. 扫描指定目录 (推荐)扫描单个用户的家目录或网站目录,目标明确,耗时较短。codeBash# -r: 递归扫描子目录 # -i: 只打印被感染的文件 clamscan -r -i /home2. 扫描整个系统 (谨慎使用)警告:此操作会扫描您的整个文件系统,将消耗大量 CPU 和 I/O 资源,并可能需要数小时才能完成。请在服务器负载较低时执行。codeBashclamscan -r /3. 高级扫描示例您可以指定多个路径进行扫描,并使用更多参数。codeBash# 扫描多个指定的、风险较高的目录 clamscan -r --bell -i /root /tmp /var/www /opt--bell: 在发现病毒时发出系统响铃提示。-i: 只显示(打印)被感染文件的详细信息,正常的扫描过程不会显示。第三部分:安装并使用后台扫描服务 (高级)clamav-daemon 是一个后台守护进程 (clamd),它会将病毒库一直加载在内存中,提供更快的扫描性能。它主要用于:为其他需要调用杀毒引擎的应用(如邮件服务器)提供实时扫描接口。执行更快的、由 clamdscan 命令触发的扫描。1. 安装守护进程codeBashsudo apt install clamav-daemon -y2. 启动并设置开机自启安装后,服务可能不会自动启动,需要手动操作。codeBashsudo systemctl start clamav-daemon sudo systemctl enable clamav-daemon # 检查服务状态,确保其 'active (running)' sudo systemctl status clamav-daemon3. 编辑守护进程配置 (可选)守护进程的配置位于 clamd.conf。大多数情况下,默认配置即可工作。codeBashsudo nano /etc/clamav/clamd.conf注意:修改此配置文件只影响 clamav-daemon 服务,不影响手动运行的 clamscan。4. 使用 clamdscan 进行快速扫描当 clamav-daemon 运行时,您应该使用 clamdscan 命令来请求服务进行扫描,而不是 clamscan。因为 clamdscan 只是一个客户端,它将扫描任务发送给已在内存中准备就绪的守护进程,速度会快得多。codeBash# 使用 clamdscan 的语法与 clamscan 基本相同 clamdscan -r /home总结:命令速查目的命令备注安装sudo apt install clamav clamav-daemon一次性安装所有组件检查更新日志sudo tail -f /var/log/clamav/freshclam.log首选的更新检查方式手动扫描clamscan -r -i [目录]适合按需、不频繁的扫描服务控制sudo systemctl [start/stop/status] clamav-daemon管理后台服务快速服务扫描clamdscan -r [目录]当 clamav-daemon 运行时使用四、安装fail2bansudo apt update sudo apt install fail2ban -y #查看启动状态 systemctl status fail2ban #查看ssh封禁状态 fail2ban-client status sshd Status for jail: sshd |- Filter | |- Currently failed: 1 # 当前失败次数(在重置周期内) | |- Total failed: 78 # 自服务启动后,总共记录到的失败尝试次数 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 5 # 当前正处于封禁状态的 IP 地址数量 |- Total banned: 12 # 自服务启动后,总共执行了多少次封禁操作 `- Banned IP list: 1.2.3.4 5.6.7.8 9.10.11.12 13.14.15.16 17.18.19.20Fail2ban 的主配置文件是 /etc/fail2ban/jail.conf。我们永远不要直接修改这个文件,因为它在软件更新时可能会被覆盖。正确的做法是创建一个本地配置文件 jail.local,在这里覆盖默认设置。复制配置文件:codeBashsudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local编辑本地配置文件:codeBashsudo nano /etc/fail2ban/jail.local修改 [DEFAULT] 全局设置:在 jail.local 文件中找到 [DEFAULT] 段落,这里是几个最需要关注的核心参数:codeIni[DEFAULT] # # "bantime" is the number of seconds that a host is banned. # bantime = 10m bantime = 1h # 封禁时长,例如 1小时 (1h), 1天 (1d) # "findtime" is the number of seconds that a host is observed. # findtime = 10m findtime = 10m # 观察时间窗口,例如 10分钟 # "maxretry" is the number of failures before a host get banned. # maxretry = 5 maxretry = 3 # 在观察时间内,允许的最大失败次数简单理解: 如果一个 IP 在 10分钟 (findtime) 内失败了 3次 (maxretry),它就会被封禁 1小时 (bantime)。保存并退出编辑器 (在 nano 中是 Ctrl+X, Y, Enter)。重启 Fail2ban 服务 以应用新的配置:codeBashsudo systemctl restart fail2ban检查服务状态,确保没有错误:codeBashsudo systemctl status fail2ban看到 active (running) 就表示成功了。检查 sshd 监狱是否已激活:codeBashsudo fail2ban-client status你应该能在 Jail list 中看到 sshd。查看 sshd 监狱的详细状态:codeBashsudo fail2ban-client status sshd这里会显示当前被封禁的 IP 列表和统计数据。附一:CentOS防火墙管理查看防火墙状态systemctl status firewalld查看端口放通情况firewall-cmd --list-ports添加放通的端口firewall-cmd --add-port=6379/tcp --permanent重启防火墙应用更改firewall-cmd --reload附二:其他措施了解入侵检测系统(IDS)推荐:Snort:Snort 是一款开源软件,因此是免费的。它可以在通用的硬件上运行,但对于高速网络或大规模部署,可能需要更强大的硬件支持。Suricata:Suricata 也是一款开源软件,免费使用。它需要一定的硬件资源来支持高性能的流量分析,因此在大规模部署时可能需要更强大的硬件支持。Zeek(前身为Bro):Zeek 也是开源软件,免费使用。它需要在通用硬件上运行,并且可以根据需要进行灵活的配置。入侵防御系统(IPS)推荐:Cisco Firepower:Cisco Firepower 是商业产品,需要购买许可证来使用。它通常需要专门的硬件设备,如Cisco Firepower安全设备,以支持其功能和性能。Palo Alto Networks:Palo Alto Networks 提供商业级的入侵防御系统,通常需要购买许可证和专门的硬件设备来支持其功能和性能。Fortinet FortiGate:Fortinet FortiGate 也是商业产品,需要购买许可证来使用。它通常需要专门的硬件设备,如FortiGate安全网关,以支持其功能和性能。
2023-02-15
16
0
0
Linux
2023-02-11
混合部署:云服务器结合私有机房
云服务器结合私有机房的混合部署,可以规避家庭宽带没有固定IP的短板,也绕开了云服务器高性能配置的价格壁垒。它为个人开发者、极客和小型技术团队提供了一个兼具高性能、低成本和高度灵活性的服务部署选择。虽然配置过程比直接购买云服务或成品穿透服务要多几个步骤,但由此换来的自主权和性价比是值得的。一、 方案概述:一种非典型的“混合云”传统的混合云通常指企业利用专线或VPN将内部数据中心与公有云连接,实现资源的统一管理和调度。而对于个人开发者或小型团队而言,可以借鉴这种思路,构建一个轻量级的、更注重成本效益的混合架构。核心思路是将核心资源部署在本地的私有服务器上,而将公网IP、网络转发和安全接入等功能交由一台廉价的云服务器处理。具体构成如下:核心服务节点(内网):一台位于家庭或办公室网络环境下的高性能服务器。它承担了应用、数据库、AI模型等所有计算密集型和存储密集型的任务。这台机器不直接暴露在公网上,甚至没有固定的公网IP。网络接入节点(云端):一台配置较低、但拥有固定公网IP的云服务器(例如腾讯云的轻量应用服务器)。它的唯一职责是作为公网流量的入口和中转站,接收来自用户的请求,并通过安全的隧道转发给内网的核心服务节点。连接隧道:通过反向代理工具(如frp、NPS等)在云端和内网节点之间建立一条稳定的、加密的通信隧道。用户访问云服务器的特定端口,流量被无缝转发至内网服务器的对应端口。这种架构下,云服务器像一个“门卫”,负责接收访客并引路;而内网服务器则是真正的“功能区”,负责处理所有实际业务。二、 动机与必要性:成本与性能的平衡选择这样的架构,主要驱动力来自于对成本和性能的双重考量。1、公网IP成本家庭宽带:通常提供较高的下行带宽(如千兆),但上行带宽受限,且绝大多数不提供固定的公网IP地址。动态IP对于需要稳定访问的服务而言是不可接受的。企业专线:提供固定公网IP,但价格昂贵,对于小团队或个人项目来说,成本过高。2、商业穿透服务市面上存在一些商业化的内网穿透服务,例如“花生壳”。通过其价格表可以看出,即便是企业级套餐,其在带宽、并发连接数和功能上也存在诸多限制。例如,一个年费数千元的套餐可能只提供有限的带宽和映射数量,性价比不高,难以支撑稍有规模的应用。 3、云服务器直接在云端租用一台与自建服务器同等配置(如8核16G内存、1T固态硬盘)的服务器,每年的费用会非常可观。而作为“门卫”角色的低配云服务器则极为便宜。例如,一台2核2G或4核4G,带有3-5Mbps带宽的轻量云服务器,年费可能仅需几十到一百元。这笔开销远低于企业专线或功能完善的商业穿透服务。 4、自建硬件一次性投入。一台配置不错的服务器(例如8核16线程CPU、32G内存、1T SSD)的组装成本大约在3000元左右,但可以长期使用。性能与数据所有权。可以获得远超同价位云服务器的计算性能和存储空间,并且所有数据都保留在本地,拥有完全的控制权。综上,通过“云端转发+本地计算”的模式,可以用极低的年费(一台轻量云服务器+一个域名)撬动起本地强大的硬件资源,实现了成本和性能的最佳平衡。三、 实现细节:关键技术点记录要实现此架构,核心在于“动态域名解析”与“反向代理”的协同工作。云服务器像一个地址固定的“总机”,而DDNS则负责实时告诉“总机”我们内网这个“分机”的最新号码。域名与DDNS (Dynamic DNS)这是整个方案的基石。由于家庭宽带的公网IP会不定期变动,我们需要DDNS服务将一个固定的域名(例如 home.example.com)实时解析到我们家里的动态公网IP上。服务选择:市面上有许多DDNS服务商,一些域名注册商(如Cloudflare, GoDaddy)也自带免费的DDNS功能。客户端配置:需要在内网环境中运行一个DDNS客户端。许多现代路由器(如OpenWrt、梅林固件)都内置了DDNS客户端,只需填写域名和API密钥即可。也可以在内网的服务器或NAS上通过Docker等方式运行一个DDNS更新程序。最终效果:配置完成后,无论家里IP如何变化,访问 home.example.com 总能准确地找到我们的网络入口。内网路由器:端口转发DDNS解决了“找到家门”的问题,端口转发则解决了“进入哪个房间”的问题。云服务器的Nginx请求到达路由器后,路由器需要知道把这个请求交给内网的哪一台机器的哪个端口。在路由器管理界面中,设置端口转发规则。例如,将外部访问的 8080 端口,转发到内网服务器(如IP为192.168.1.100)的Web服务端口 80。云服务器:Nginx反向代理配置云服务器是用户访问的固定入口。我们在这里部署Nginx,让它充当反向代理,最主要是把非标端口转化成443。四、 总结与思考通过 DDNS + Nginx反向代理 的组合,实现了利用廉价云服务器作为公网固定入口,撬动内网高性能硬件资源的目标。这种方案的技术栈更为通用,对于熟悉Nginx的开发者而言几乎没有新的学习成本。同时,DDNS域名本身也具备了独立使用的价值。对于一些非Web服务,如远程桌面、NAS文件访问等,可以通过配置不同的端口转发,直接使用DDNS域名进行连接,无需经过云服务器中转,灵活性更高。当然,此方案的成立依赖于一个前提:拥有一个可用的公网IP,哪怕是动态的。
2023-02-11
10
0
0
经验教程
数通网工
2023-02-03
群晖NAS-3种不同的备份方式比较
1 Synology Drive如果系统支持的话,其实Synology Drive体验真的挺好的,不管是windows、Linux、还是移动端。1.1 工作模式服务端(NAS)启用 Synology Drive Server,客户端(Windows/Linux/手机)安装 Synology Drive Client,配置一下备份策略和要同步的文件夹,就完事了,轻松愉快。1.2 个人体验我比较喜欢定
2023-02-03
8
0
0
NAS
Linux
2022-10-29
主要的非互联网IP段及用途简介
以下是所有不能在公共互联网上自由路由的主要IP地址段,它们各自有明确的用途:私有网络地址 (Private Network Addresses - RFC 1918)这是我们最熟悉的内网IP,可在任何组织内部自由使用,无需申请,但不能在公共互联网上路由。10.0.0.0/8 (10.0.0.0 到 10.255.255.255)用途: 大型企业网络。它提供了超过1600万个地址,非常适合需要划分大
2022-10-29
14
0
0
数通网工
2022-10-29
同一个端口,同时支持http和https访问
1 需求背景有点奇葩的一个需求,出现的原因是平台很久以前上线的时候使用的是“http://ip:port/”,系统运行了两年多,培训材料中写的登录地址、用户保存的书签地址都是这种形式。我接手项目时,为了强化安全(过密评)着手启用https+域名,同时为了保障业务正常不受影响、还得确保市县各部门的老用户正常使用之前收藏的地址打开也不报错。2 解决方案2.1 可选思路-重定向最简单的方法就是直接根据
2022-10-29
4
0
0
Linux
2022-09-29
SSL证书部署
建议优先参考:Nginx 安装 SSL 配置 HTTPS 超详细完整教程全过程-阿里云开发者社区 (aliyun.com) 如何转换证书格式? (aliyun.com) 在CentOS系统Tomcat 8.5或9上部署SSL证书 (aliyun.com) 个人笔记:1.1. 准备SSL证书进入当前Nginx运行目录,创建cert目录存放证书:cd /usr/local/nginx/conf #需确认为实际运行的nginx配置文件夹mkdir cert将证书及秘钥文件复制到该文件夹可用pwd确认当前路径举例: /usr/local/nginx/nginx-1.22.0/conf/cert 1.2. 开通443端口(或指定的其他https端口)设置并保存防火墙配置:iptables -I INPUT -p tcp --dport 443 -j ACCEPTservice iptables save重启防火墙:service iptables restart检查端口开通情况:netstat -tunlp查看占用端口的程序和进程:lsof -i :443杀掉占用端口的进程(须先确认):kill -9 进程id1.3. 修改nginx配置进入当前nginx运行目录下的conf文件夹修改前先备份:cp nginx.conf nginx-bak.conf编辑nginx.conf配置文件vim nginx.conf打开配置文件后按i进入编辑模式: 将所有HTTP请求通过rewrite指令重定向到HTTPS:server { listen 80; server_name yourdomain; #需要将yourdomain替换成证书绑定的域名。 rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。 location / { index index.html index.htm; }}设置https模块配置:server { listen 443 ssl; #配置HTTPS的默认访问端口为443(或根据网络拓扑确认实际应使用的端口)。 #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。 #如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。 server_name www.hitagi.cn; root html; index index.html index.htm; ssl_certificate cert/xxx.pem; #替换证书文件名称 ssl_certificate_key cert/xxx.key; #替换秘钥文件名称 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #表示使用的加密套件的类型。 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。 ssl_prefer_server_ciphers on; location / { root html; #Web网站程序存放目录。 proxy_pass http://127.0.0.1:8080; index index.html index.htm; }}编辑完成后按esc退出编辑模式。保存并关闭文件::wq检查当前运行的nginx版本是否包含ssl模块(在nginx的sbin目录下执行如已配置环境变量可忽略):./nginx -V如果返回结果中不包含 “--with-http_ssl_module”则需添加模块并重新编译nginx程序。在运行的nginx下sbin文件夹备份nginx程序:cp nginx nginx-bak在nginx安装包文件夹内使用修改后的配置:./configure --with-http_ssl_module #(需添加原有模块)编译:make请勿使用编译并安装!# make install停止运行中的nginx服务:./nginx -s stop将安装包文件夹中编译后生成的新nginx程序复制到到原运行中的目录替换:cp 安装包目录/sbin/nginx 实际运行目录/sbin/nginx进入运行目录的sbin,测试配置文件是否正确:./nginx -t -c /usr/local/nginx/conf/nginx.conf启动Nginx:./nginx查看是否启动成功ps -ef | grep nginx附:Nginx重载配置并启动命令:./nginx -s reload
2022-09-29
19
0
0
Linux
1
2
3