250901-MySQL--skip-grant-tables跳过权限表-处理数据库异常恢复数据

你可以将 --skip-grant-tables 选项添加到 MySQL 的配置文件中,以便在每次启动时自动应用此设置。然而,需要注意的是,
--skip-grant-tables 选项会跳过权限表的加载,这意味着所有用户都可以无需密码登录到 MySQL
服务器,这会带来重大的安全风险。因此,通常只在进行特定维护任务时临时使用此选项。

--skip-grant-tables 添加到配置文件

  1. 找到 MySQL 配置文件: MySQL 的配置文件通常名为 my.cnfmy.ini,位于 /etc/mysql//etc/mysql/mysql.conf.d/
    或 MySQL 安装目录下。

  2. 编辑配置文件: 打开配置文件,找到 [mysqld] 部分,并添加 --skip-grant-tables 选项。例如:

    1
    2
    [mysqld]
    skip-grant-tables
  3. 保存并关闭文件

  4. 重启 MySQL 服务: 重启 MySQL 服务以应用更改:

    1
    sudo systemctl restart mysql

使用 --skip-grant-tables 的注意事项

  • 安全性:由于 --skip-grant-tables 会跳过权限检查,任何用户都可以无需密码登录到 MySQL
    服务器。因此,在使用此选项时,必须确保数据库服务器不对外部网络开放,或者在防火墙中严格限制访问权限。
  • 临时使用:通常只在需要修复权限表或进行其他需要跳过权限检查的维护任务时临时使用 --skip-grant-tables
    。完成这些任务后,应立即从配置文件中移除此选项,并重启 MySQL 服务。
  • 备份:在修改配置文件或进行任何可能影响数据库安全性的操作之前,确保备份所有重要数据。

从配置文件中移除 --skip-grant-tables

完成维护任务后,应立即从配置文件中移除 --skip-grant-tables 选项,并重启 MySQL 服务以恢复正常的权限检查:

250805-Docker Images离线打包

docker images如何离线打包

脚本示例

1
2
3
4
5
6
7
8
9
# 导出
sudo docker save mongo > mongo_250805.tar
sudo docker save postgres > postgres_250805.tar
sudo docker save ghcr.io/ferretdb/all-in-one > ferretdb_250805.tar

# 导入
sudo docker load -i mongo_250805.tar
sudo docker load -i postgres_250805.tar
sudo docker load -i ferretdb_250805.tar

在有网络的机器上,可以使用以下步骤将 Docker 镜像离线打包:

打包镜像

  • 使用 docker save 命令:将指定的 Docker 镜像保存为一个 .tar 格式的归档文件。例如,要将名为 nginx 的镜像打包,可以运行以下命令:

    1
    docker save nginx > nginx.tar
  • 指定输出路径:也可以使用 -o 参数指定输出文件的路径。例如:

    1
    docker save -o /path/to/nginx.tar nginx

传输打包后的文件

  • 将生成的 .tar 文件复制到离线机器上。可以使用 USB 驱动器、SCP、SFTP 等方式。

在离线机器上加载镜像

  • 使用 docker load 命令:加载 .tar 格式的镜像文件。例如:

    1
    docker load -i nginx.tar

或者:

1
docker load < nginx.tar
  • 确认镜像加载成功:运行 docker images 命令,查看加载的镜像是否出现在列表中。

打包多个镜像

如果需要将多个镜像打包到一个文件中,可以将多个镜像名称作为参数传递给 docker save 命令。例如:

1
docker save image1 image2 > images.tar

2508-(转载)项目管理流程图

https://www.sohu.com/a/747270060_121119370
https://zhuanlan.zhihu.com/p/1914602995661907658

01

项目管理工作流程图

img

这张图就对项目管理的全流程做了详细的解析。

从图中可以看到一个完整的项目流程全貌,以及在不同流程需要项目经理重点关注的内容。

02

集成项目工作流程图

img

03

敏捷迭代项目流程图

img

04

IT项目验收流程图

img

05

互联网产品

项目管理流程图

img

06

项目立项流程图

img

07

项目提案流程图

img

08

项目实施流程图

img

09

技术部开发流程图

img

10

软件开发流程图

img

11

项目交付流程图

img

12

P2流程图

img

许多人对项目管理的整个流程缺乏清晰的了解,只知道有启动、规划、执行、监控和收尾这五个大的过程组。然而,这五个过程组之间存在着密切的关系,并且相互影响。

1、项目管理工作流程图

img

img

img

img

**
**

2、项目管理全流程图

img

3、产品开发全流程

4、项目整体流程图

5、IT项目管理流程图

img

6、软件项目研发流程图

img

7、产品研发工作流程图

img

8、产品研发流程图

img

*
*

9、 集成项目工作流程图

img

*img*

10、 敏捷迭代项目流程图

img

*img*

11、 项目验收流程图

img

*
*

12、 互联网项目管理流程图

*img*

13、 项目立项流程图

*img*

14、 项目提案流程图

*img*

15、 项目实施全景流程图

*img*

16、技术部开发流程图

*img*

17、软件开发流程图

*img*

18、 硬件开发流程图

img

250711-LinuxBox安装Chrome提示:Aw,Snap! Something went wrong while displaying this webpage. Error codeRESULT CODE_INVALID_SANDBOX_STATE

Aw,Snap! Something went wrong while displaying this webpage. Error codeRESULT CODE_INVALID_SANDBOX_STATE

下载链接

google-chrome-stable_current_amd64.deb

提示错误信息

1
2
3
4
5
2025/07/11 11:55:13.705417 cmd_run.go:1344: WARNING: cannot create user data directory: failed to verify SELinux context of /home/ubuntu/snap: exec: "matchpathcon": executable file not found in $PATH
cannot set capabilities: Operation not permitted

chromedriver
cannot set capabilities: Operation not permitted

250724-Ubuntu-Linux-netplan-ifconfig网卡名字调整

我能将这个网卡名字调整到enp0s25吗

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 192.168.0.197 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::19d7:fdf9:9247:539 prefixlen 64 scopeid 0x20<link>
ether 00:e0:4d:03:5e:6f txqueuelen 1000 (以太网)
RX packets 41902 bytes 56368729 (56.3 MB)
RX errors 0 dropped 54 overruns 0 frame 0
TX packets 16055 bytes 1453031 (1.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (本地环回)
RX packets 636 bytes 49767 (49.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 636 bytes 49767 (49.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

wlp1s0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether cc:3d:82:d2:4e:ca txqueuelen 1000 (以太网)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

在 Ubuntu 20.04 里,网络接口名称默认是由 systemd-networkd / udev 的“Predictable Network Interface Names”机制决定的,也就是
enp0s25 这种格式。但你现在看到的是 eno1,说明系统可能禁用了该机制,或者主板/BIOS 提供了特定的 eno1 名称。


你可以改成 enp0s25,但需要注意以下几点:

1. 确认当前命名机制

运行以下命令确认当前命名策略:

1
sudo dmesg | grep -i 'renamed from\|eth\|enp\|eno'

或者:

1
udevadm test-builtin net_id /sys/class/net/eno1

2. 方法一:使用 GRUB 开启 Predictable Names(推荐)

编辑 GRUB 配置:

1
sudo vim /etc/default/grub

找到这一行:

1
GRUB_CMDLINE_LINUX=""

改成:

1
GRUB_CMDLINE_LINUX="net.ifnames=1 biosdevname=0"

说明:

  • net.ifnames=1 开启 systemd 的命名机制
  • biosdevname=0 关闭 Dell 的 biosdevname 工具(如果存在)

保存后更新 GRUB:

1
sudo update-grub

然后重启:

1
sudo reboot

重启后,接口名可能会变成 enp0s25(取决于硬件总线拓扑)。


3. 方法二:手动创建 udev 规则(强制改名)

如果你知道硬件路径(比如 enp0s25 是 PCI 设备 0000:00:19.0),可以强制改名:

1
2
3
4
sudo vim /etc/udev/rules.d/10-rename-network.rules

sudo mkdir -p /etc/udev/rules.d/
sudo touch /etc/udev/rules.d/10-rename-network.rules

添加如下内容:

1
2
3
4
5
6
7
8
sudo vim /etc/udev/rules.d/10-rename-network.rules

SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:e0:4d:03:5e:6f", NAME="enp0s25"


SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:e0:4d:03:5e:6f", NAME="enp0s25"


替换 00:e0:4d:03:5e:6f 为你网卡的实际 MAC 地址

然后重启:

1
sudo reboot

4. 验证是否成功

重启后运行:

1
ip link

或:

1
ifconfig -a

确认是否已变为 enp0s25


⚠️ 注意事项

  • 改名后,Netplan、NetworkManager 或其他网络配置文件中引用的接口名也要同步修改。
  • 如果你使用的是 Netplan,路径通常是 /etc/netplan/*.yaml,记得改成 enp0s25

250728-Nmap 使用帮助(中文翻译)

Nmap 7.93 使用帮助(中文翻译)

用法:
nmap [扫描类型] [选项] {目标说明}


目标说明(Target Specification)

  • 可直接写主机名、IP、网段等。
    例:scanme.nmap.orgmicrosoft.com/24192.168.0.1; 10.0.0-255.1-254
  • -iL <文件名>:从文件读取目标列表
  • -iR <数量>:随机选择目标
  • --exclude <主机1,主机2…>:排除指定主机/网段
  • --excludefile <排除文件>:从文件读取排除列表

主机发现(Host Discovery)

  • -sL:列表扫描,仅列出目标,不真正扫描
  • -sn:Ping 扫描,不扫端口
  • -Pn:跳过主机发现,默认所有主机在线
  • -PS/PA/PU/PY[端口列表]:TCP SYN/ACK、UDP 或 SCTP 发现
  • -PE/PP/PM:ICMP Echo、时间戳、子网掩码请求
  • -PO[协议列表]:IP 协议 Ping
  • -n/-R:不做/始终做 DNS 解析
  • --dns-servers :自定义 DNS 服务器
  • --system-dns:使用系统 DNS 解析器
  • --traceroute:对每个目标做路由追踪

扫描技术(Scan Techniques)

  • -sS/sT/sA/sW/sM:TCP SYN / Connect / ACK / Window / Maimon 扫描
  • -sU:UDP 扫描
  • -sN/sF/sX:TCP Null / FIN / Xmas 扫描
  • --scanflags :自定义 TCP 标志位
  • -sI <僵尸主机[:端口]>:Idle 扫描
  • -sY/sZ:SCTP INIT / COOKIE-ECHO 扫描
  • -sO:IP 协议扫描
  • -b :FTP 反弹扫描

端口指定与扫描顺序

  • -p <端口范围>:只扫指定端口
    例:-p22-p1-65535-p U:53,111,T:21-25,80
  • --exclude-ports <端口范围>:排除端口
  • -F:快速模式(少端口)
  • -r:顺序扫描,不随机
  • --top-ports <数量>:扫描最常见的 N 个端口
  • --port-ratio <比例>:扫描比该比例更常见的端口

服务/版本检测

  • -sV:探测服务与版本
  • --version-intensity <0-9>:探测强度
  • --version-light:轻量级(强度 2)
  • --version-all:尝试所有探测(强度 9)
  • --version-trace:显示详细版本探测过程

脚本扫描(NSE)

  • -sC:等价于 --script=default
  • --script=<脚本列表>:指定脚本文件、目录或类别
  • --script-args=:给脚本传参
  • --script-args-file=文件名:从文件读取参数
  • --script-trace:显示脚本收发数据
  • --script-updatedb:更新脚本数据库
  • --script-help=<脚本>:查看脚本帮助

操作系统检测

  • -O:启用 OS 检测
  • --osscan-limit:只对“有希望”的目标做 OS 检测
  • --osscan-guess:更激进地猜测 OS

定时与性能

  • -T<0-5>:定时模板,数字越大越快
  • --min-hostgroup/--max-hostgroup <大小>:并行主机组大小
  • --min-parallelism/--max-parallelism <探测数>:并行探测数
  • --min-rtt-timeout/--max-rtt-timeout/--initial-rtt-timeout <时间>:RTT 超时
  • --max-retries <次数>:最大重传次数
  • --host-timeout <时间>:主机超时放弃
  • --scan-delay/--max-scan-delay <时间>:探测间隔
  • --min-rate <包/秒>:最低发包速率
  • --max-rate <包/秒>:最高发包速率

防火墙/IDS 规避与欺骗

  • -f; --mtu <值>:分片包
  • -D <诱饵1,诱饵2[,ME],…>:使用诱饵掩盖扫描
  • -S :伪造源地址
  • -e <接口>:指定网卡
  • -g/--source-port <端口>:指定源端口
  • --proxies :通过 HTTP/SOCKS4 代理
  • --data <十六进制>:附加自定义负载
  • --data-string <字符串>:附加 ASCII 字符串
  • --data-length <长度>:附加随机数据
  • --ip-options <选项>:设置 IP 选项
  • --ttl <值>:设置 TTL
  • --spoof-mac <地址>:伪造 MAC
  • --badsum:发送错误校验和

输出(Output)

  • -oN/-oX/-oS/-oG <文件>:正常/XML/脚本小子/可 grep 格式
  • -oA <基本名>:同时输出三种主要格式
  • -v:增加详细度(可多次使用 -vv
  • -d:增加调试级别(可多次使用 -dd
  • --reason:显示端口状态原因
  • --open:仅显示 open 或可能 open 的端口
  • --packet-trace:显示所有收发报文
  • --iflist:打印主机接口与路由
  • --append-output:追加到输出文件
  • --resume <文件>:恢复中断的扫描
  • --stylesheet <路径/URL>:指定 XML 转 HTML 的 XSL
  • --webxml:使用 Nmap.org 的在线 XSL
  • --no-stylesheet:不关联 XSL 样式表

杂项(Misc)

  • -6:启用 IPv6 扫描
  • -A:启用 OS 检测、版本检测、脚本扫描和路由追踪
  • --datadir <目录>:自定义数据文件位置
  • --send-eth/--send-ip:使用原始以太网帧 / IP 层发包
  • --privileged:假设拥有完整权限
  • --unprivileged:假设无原始套接字权限
  • -V:打印版本
  • -h:打印本帮助

示例(Examples)

1
2
3
nmap -v -A scanme.nmap.org
nmap -v -sn 192.168.0.0/16 10.0.0.0/8
nmap -v -iR 10000 -Pn -p 80

运行示例(Examples)

1

如需更多选项与示例,请阅读手册页:
https://nmap.org/book/man.html

250605-AngularJS-Button防止重复点击解决办法

范式

1
2
3
4
5
6
7
8
9
10
11
12
13
let isProcessing = false;


if (isProcessing) {
return false; // 防止重复点击
}
isProcessing = true;


// 模拟异步操作完成后恢复按钮状态
setTimeout(function() {
isProcessing = false;
}, 2000);

方案一

angularjs 能不能实现一个组件,放到所有的按钮上面,控制ng-click防重复提交策略

在 AngularJS 中,可以通过创建一个自定义指令来实现一个通用的防重复点击组件,这个指令可以附加到任何按钮上,以控制 ng-click
的防重复提交策略。

以下是一个完整的示例:

1. 创建防重复点击指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 增加按钮防重复点击组件
app.directive('preventRepeatedClick', function ($parse, $timeout) {
return {
restrict: 'A',
priority: 1000, // 确保指令在ngClick之后执行
scope: {
clickDelay: '@'
},
link: function (scope, element, attrs) {
var isProcessing = false;

var delay = parseInt(attrs.clickDelay) || 2000; // 默认延迟 2000 毫秒
delay = (delay >= 2000) ? delay : 2000;

element.on('click', function (event) {
// 如果正在处理事件,直接返回,防止重复点击
if (isProcessing) {
event.preventDefault();
event.stopPropagation();
return;
}

// 禁用按钮,防止重复点击
isProcessing = true;
element.attr('disabled', 'disabled');

// 延迟后启用按钮
$timeout(function () {
isProcessing = false;
element.removeAttr('disabled');
}, delay);
});
}
};
});

2. 使用自定义指令

在 HTML 中,将 prevent-repeated-click 指令附加到按钮上,并可选地指定 click-delay 属性来设置按钮禁用的时间(以毫秒为单位)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<title>AngularJS 防重复点击指令</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<script src="app.js"></script>
</head>
<body>
<div ng-controller="myCtrl">
<button prevent-repeated-click click-delay="2000" ng-click="buttonClick()">点击我</button>
<p>{{message}}</p>
</div>
</body>
</html>

3. 控制器逻辑

在控制器中定义按钮的点击处理函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
app.controller('myCtrl', function ($scope) {
$scope.message = '';

$scope.buttonClick = function () {
console.log('按钮被点击了');
$scope.message = '按钮被点击,正在处理...';
// 模拟处理逻辑
setTimeout(function () {
$scope.message = '处理完成';
$scope.$apply(); // 触发 AngularJS 的 digest 循环
}, 2000);
};
});

解释

  1. **自定义指令 preventRepeatedClick**:
    • **restrict: 'A'**:指定该指令为属性类型。
    • **scope**:定义指令的隔离作用域,ngClick 用于绑定按钮的点击事件,clickDelay 用于设置按钮禁用的时间。
    • link 函数:在指令的链接函数中,监听按钮的点击事件。
      • **isProcessing**:标记按钮是否正在处理事件。
      • **delay**:从 click-delay 属性获取按钮禁用的时间,如果没有指定则使用默认值 2000 毫秒。
      • 禁用按钮:在点击事件发生时,如果 isProcessingtrue,阻止事件的默认行为并返回,防止重复点击。否则,将
        isProcessing 设置为 true 并禁用按钮。
      • **触发 ng-click**:调用绑定的 ngClick 函数。
      • 延迟启用按钮:使用 $timeout 在指定的延迟时间后将 isProcessing 设置为 false 并启用按钮。
  2. 使用指令
    • 在按钮上添加 prevent-repeated-click 指令,并可选地使用 click-delay 属性来指定按钮禁用的时间。
    • 绑定 ng-click 到按钮的点击处理函数。
  3. 控制器逻辑
    • 定义按钮的点击处理函数 buttonClick,在其中执行相关的业务逻辑。

通过这种方式,你可以将 prevent-repeated-click 指令附加到任何按钮上,以实现防重复点击的功能,而无需在每个按钮的控制器中重复编写相同的逻辑。

方案二

AngularJS 的双向数据绑定来实现。以下是一个示例:

  1. HTML 部分:使用 ng-disabled 指令来绑定按钮的禁用状态。
  2. JavaScript 部分:在控制器中定义一个变量来控制按钮的禁用状态,并在事件处理函数中修改这个变量。

HTML

1
2
3
4
5
<div ng-app="myApp">
<div ng-controller="myCtrl">
<button ng-click="buttonClick($event)" ng-disabled="isDisabled">点击我</button>
</div>
</div>

JavaScript

1
2
3
4
5
6
7
8
9
10
11
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
// 初始化按钮禁用状态为 false
$scope.isDisabled = false;

$scope.buttonClick = function($event) {
console.log('按钮被点击了');
// 修改按钮的禁用状态
$scope.isDisabled = !$scope.isDisabled;
};
});

在这个示例中,我们使用了 ng-disabled 指令来绑定按钮的禁用状态到 $scope.isDisabled 变量。当点击按钮时,buttonClick
函数会被调用,它会切换 $scope.isDisabled 的值,从而改变按钮的禁用状态。

  • 初始状态下,$scope.isDisabledfalse,按钮是启用状态。
  • 当按钮被点击时,buttonClick 函数将 $scope.isDisabled 设置为 true,按钮变为禁用状态。
  • 再次点击按钮时,buttonClick 函数将 $scope.isDisabled 设置为 false,按钮恢复启用状态。

Windows关闭内核隔离-(内核隔离)AVX指令集

Windows虚拟机没有AVX指令集导致安装MongoDB数据库失败(Windows禁用内核隔离机制)

问题描述和解决

  • Windows安装的虚拟机,没有AVX指令集,导致安装MongoDB数据库出错,需要禁用内核隔离机制,才可以让虚拟机支持AVX指令集。

基础内容

  1. 背景介绍
    • Windows 内核隔离 :Windows 内核隔离是一种安全功能,用于在 Windows
      操作系统中将敏感的系统进程和资源与可能受到恶意软件威胁的常规用户进程隔离开来。它旨在保护操作系统的核心功能,防止恶意软件通过漏洞直接访问和篡改系统关键组件,如驱动程序、系统服务等。
    • Hyper - V :Hyper - V 是微软提供的虚拟化技术,它允许在一台物理计算机上创建和运行多个虚拟机(VM)。每个虚拟机都可以运行不同的操作系统,如
      Windows、Linux 等,并且这些虚拟机在硬件资源上是相对独立的。
  2. 两者的关系
    • 技术关联基础
      • Windows 内核隔离可以利用 Hyper - V 的虚拟化功能来实现其隔离目标。在 Windows 系统中,当启用内核隔离时,会借助
        Hyper - V 来创建一个受保护的虚拟环境,用于安全地运行内核进程。
      • 从技术角度讲,Hyper - V 提供了虚拟化底层硬件支持,包括对 CPU、内存和 I/O 的虚拟化。Windows
        内核隔离可以利用这些虚拟化功能来划分安全边界。例如,它可以在虚拟化的内存空间中划分出专门的区域用于存储和处理敏感的内核数据,防止这些数据被恶意进程访问。
    • 安全协同机制
      • Hyper - V 为内核隔离提供了硬件辅助的隔离特性。在传统的操作系统安全机制下,恶意软件一旦突破应用层的防御,就有可能威胁到内核。而通过
        Hyper - V 与内核隔离的结合,可以将内核关键部件置于一个类似 “虚拟机” 的保护空间中。
      • 这种保护空间使得恶意软件很难像在没有隔离的情况下直接与内核交互。就好像给内核加了一层
        “防护罩”,只有经过严格验证和授权的操作才能穿透这个防护罩,从而增强了系统的安全性。
    • 性能和资源分配方面
      • Windows 内核隔离与 Hyper - V 的结合也会影响系统性能和资源分配。由于 Hyper - V
        的虚拟化机制,当启用内核隔离时,系统需要为虚拟化的内核环境分配一定的 CPU、内存等资源。
      • 然而,这种资源分配是经过优化的,以确保在提供安全隔离的同时,尽量减少对系统整体性能的负面影响。例如,Windows
        系统会智能地管理资源,确保关键的用户应用程序和系统服务仍然能够流畅运行,而不会因为内核隔离和 Hyper - V
        的虚拟化机制而受到过度的性能损失。

Windows关闭内核隔离-(内核隔离)AVX指令集

Windows虚拟机没有AVX指令集导致安装MongoDB数据库失败(Windows禁用内核隔离机制)

问题描述和解决

  • Windows安装的虚拟机,没有AVX指令集,导致安装MongoDB数据库出错,需要禁用内核隔离机制,才可以让虚拟机支持AVX指令集。

基础内容

  1. 背景介绍
    • Windows 内核隔离 :Windows 内核隔离是一种安全功能,用于在 Windows
      操作系统中将敏感的系统进程和资源与可能受到恶意软件威胁的常规用户进程隔离开来。它旨在保护操作系统的核心功能,防止恶意软件通过漏洞直接访问和篡改系统关键组件,如驱动程序、系统服务等。
    • Hyper - V :Hyper - V 是微软提供的虚拟化技术,它允许在一台物理计算机上创建和运行多个虚拟机(VM)。每个虚拟机都可以运行不同的操作系统,如
      Windows、Linux 等,并且这些虚拟机在硬件资源上是相对独立的。
  2. 两者的关系
    • 技术关联基础
      • Windows 内核隔离可以利用 Hyper - V 的虚拟化功能来实现其隔离目标。在 Windows 系统中,当启用内核隔离时,会借助
        Hyper - V 来创建一个受保护的虚拟环境,用于安全地运行内核进程。
      • 从技术角度讲,Hyper - V 提供了虚拟化底层硬件支持,包括对 CPU、内存和 I/O 的虚拟化。Windows
        内核隔离可以利用这些虚拟化功能来划分安全边界。例如,它可以在虚拟化的内存空间中划分出专门的区域用于存储和处理敏感的内核数据,防止这些数据被恶意进程访问。
    • 安全协同机制
      • Hyper - V 为内核隔离提供了硬件辅助的隔离特性。在传统的操作系统安全机制下,恶意软件一旦突破应用层的防御,就有可能威胁到内核。而通过
        Hyper - V 与内核隔离的结合,可以将内核关键部件置于一个类似 “虚拟机” 的保护空间中。
      • 这种保护空间使得恶意软件很难像在没有隔离的情况下直接与内核交互。就好像给内核加了一层
        “防护罩”,只有经过严格验证和授权的操作才能穿透这个防护罩,从而增强了系统的安全性。
    • 性能和资源分配方面
      • Windows 内核隔离与 Hyper - V 的结合也会影响系统性能和资源分配。由于 Hyper - V
        的虚拟化机制,当启用内核隔离时,系统需要为虚拟化的内核环境分配一定的 CPU、内存等资源。
      • 然而,这种资源分配是经过优化的,以确保在提供安全隔离的同时,尽量减少对系统整体性能的负面影响。例如,Windows
        系统会智能地管理资源,确保关键的用户应用程序和系统服务仍然能够流畅运行,而不会因为内核隔离和 Hyper - V
        的虚拟化机制而受到过度的性能损失。

frp实现内网穿透(Windows版本)

frp

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网

IP 节点的中转暴露到公网。

github 下载地址:github.com/fatedier/frp/releases

frp配置参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[common]
bind_port = 7000
# 启用面板
dashboard_port = 7500
# 面板登录名和密码
dashboard_user = admin
dashboard_pwd = xxxxxx
# 使用http代理并使用80端口进行穿透
vhost_http_port = 80
# 使用https代理并使用443端口进行穿透
vhost_https_port = 443
# 日志路径
log_file = ./frps.log
# 日志级别
log_level = info
# 日志最大保存天数
log_max_days = 7
# 认证超时时间
authentication_timeout = 900
# 认证token,客户端需要和此对应
token=123123123
# 最大连接数
max_pool_count = 5
max_ports_per_client = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[common]
bind_port = 7000
# 启用面板
dashboard_port = 7500
# 面板登录名和密码
dashboard_user = admin
dashboard_pwd = xxxxxx
# 使用http代理并使用80端口进行穿透
vhost_http_port = 80
# 使用https代理并使用443端口进行穿透
vhost_https_port = 443
# 日志路径
log_file = ./frps.log
# 日志级别
log_level = info
# 日志最大保存天数
log_max_days = 2
# 认证超时时间
authentication_timeout = 900
# 认证token,客户端需要和此对应
token=123123123
# 最大连接数
max_pool_count = 5
max_ports_per_client = 0

frpClient

1
2
3
4
5
6
7
8
9
10
11
12
[common]
serverAddr = 127.0.0.1
serverPort = 7000

auth.method = "token"
auth.token = "gKpsGx0AMSVRVjAVvo2Qa94kU81"

[web]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8080

frpServer

1
2
3
4
5
6
7
8
9
10
11
[common]
bind_addr = 0.0.0.0
bindPort = 7000

auth.method = "token"
auth.token = "gKpsGx0AMSVRVjAVvo2Qa94kU8"

dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = "SuxqcRvNC2iknszYNpZmuxfrtp"

公网、内网服务器都下载一份。

找到第一条,然后下载 frp_windwos_amd64.zip 这个 (amd64 是 64 系统,386 是 32 位系统,现在电脑基本 64 位了),比如图片上的
frp_0.33.0_windows_amd64.zip

2、将 frp_0.33.0_windows_amd64.zip 解压至任意目录

3、进入解压目录这里所有 frpc 开头的文件都是客户端文件,所以全部删了,我们服务器只需要 frps 开头的文件

4、配置服务端(公网服务器)
我们打开 frps.ini(我用的 notepad++ 编辑器,记事本也可以)
注意配置文件不支持注释,请不要把汉字复制进去

1
2
3
[common]
bind_port = 7000 #与客户端绑定的进行通信的端口
vhost_http_port = 6081 #访问客户端web服务自定义的端口号

保存然后打开 cmd 进入当前目录(cmd 不会用自行百度),输入:frps.exe -c ./frps.ini,此时会提示网络防火墙安全警告,点允许

提示 start frps success 则服务启动成功

警告:云服务器一定要开放端口,不会开放自行百度,图中的 7000 是 frp 绑定的默认端口要打开,另外一个是 http(用不到可以删了)

至此服务端配置完成!
5、配置客户端(内网服务器),首先删掉 frps 开头文件文件,然后再进行配置,编辑 frpc.ini
注意配置文件不支持注释,请不要把汉字复制进去

1
2
3
4
5
6
7
8
9
[common]
server_addr = xx.xx.xx.xx #公网服务器ip
server_port = 7000 #与服务端bind_port一致

[yclj]
type = tcp
local_ip = 127.0.0.1
local_port = 3389 # 3389是windows的远程连接端口
remote_port = 24567 # 远程服务器端口(自定义)

保存然后执行
windows 使用 cmd 或者 powershell 进入当前目录,执行

frpc.exe -c frpc.ini
6、访问方式
(1) 远程连接 windows bind_post 要绑定 3389,其他的不行
ip:xx.xx.xx.xx:24567 (这个是服务器开放的端口,映射本地的 3389)

三、结尾

  1. 客户端连接服务端提示访问被拒绝,则需要服务端开放防火墙端口(学习的话全开就行了,生产环境除外)。

示例代码

frpc.ini(客户端)frpc.exe -c frpc.ini

1
2
3
4
5
6
7
8
9
[common]
server_addr = xx.xx.xx.xx
server_port = 7000

[yclj]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 80

frps.ini(服务端)frps.exe -c frps.ini

1
2
3
[common]
bind_port = 7000
vhost_http_port = 6081

frp 如何增加密码校验

FRP(Fast Reverse Proxy)可以通过以下几种方式增加密码校验:

1. 使用 Token 鉴权

FRP 支持通过 Token 进行身份验证。你需要在服务端(frps)和客户端(frpc)的配置文件中设置相同的 token 值。

  • 服务端配置(frps.toml

    toml

    复制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [common]
    bind_port = 7000
    auth.method = "token"
    auth.token = "your_secret_token"


    auth.method = "token"
    auth.token = "gKpsGx0AMSVRVjAVvo2Qa94kU8"

    dashboard_addr = 127.0.0.1
    dashboard_port = 7500
    dashboard_user = admin
    dashboard_pwd = "SuxqcRvNC2iknszYNpZmuxfrtp"
  • 客户端配置(frpc.toml

    toml

    复制

    1
    2
    3
    4
    5
    6
    7
    8
    [common]
    server_addr = x.x.x.x
    server_port = 7000
    auth.method = "token"
    auth.token = "your_secret_token"

    auth.method = "token"
    auth.token = "gKpsGx0AMSVRVjAVvo2Qa94kU8"

2. 使用 OpenID Connect (OIDC) 鉴权

FRP 也支持使用 OpenID Connect (OIDC) 进行身份验证。

  • 服务端配置(frps.toml

    toml

    复制

    1
    2
    3
    4
    5
    [common]
    bind_port = 7000
    auth.method = "oidc"
    auth.oidc.issuer = "https://example-oidc-issuer.com/"
    auth.oidc.audience = "https://oidc-audience.com/.default"
  • 客户端配置(frpc.toml

    toml

    复制

    1
    2
    3
    4
    5
    6
    7
    8
    [common]
    server_addr = x.x.x.x
    server_port = 7000
    auth.method = "oidc"
    auth.oidc.clientID = "your_client_id"
    auth.oidc.clientSecret = "your_client_secret"
    auth.oidc.audience = "https://oidc-audience.com/.default"
    auth.oidc.tokenEndpointURL = "https://example-oidc-endpoint.com/oauth2/v2.0/token"

3. 使用 BasicAuth 鉴权

如果你需要对 HTTP/HTTPS 代理进行密码校验,可以使用 BasicAuth 鉴权。

  • 客户端配置(frpc.ini

    ini

    复制

    1
    2
    3
    4
    5
    6
    7
    8
    [http]
    type = http
    local_port = 80
    remote_port = 8080
    use_encryption = true
    use_compression = true
    http_user = admin
    http_passwd = 123456
  • 服务端配置(frps.ini

    ini

    复制

    1
    2
    [common]
    bind_port = 7000

4. 使用签名验证

在某些高级场景中,可以通过签名验证来保护配置文件不被篡改。例如,通过计算配置文件的 MD5 值并进行验证,但这种方法需要结合额外的工具或脚本实现。

5. 使用 TLS 双向认证

虽然 TLS 双向认证主要用于加密通信,但也可以通过证书来验证客户端和服务端的身份。

  • 服务端配置(frps.toml

    toml

    复制

    1
    2
    3
    transport.tls.certFile = "/path/to/server.crt"
    transport.tls.keyFile = "/path/to/server.key"
    transport.tls.trustedCaFile = "/path/to/ca.crt"
  • 客户端配置(frpc.toml

    toml

    复制

    1
    2
    3
    transport.tls.certFile = "/path/to/client.crt"
    transport.tls.keyFile = "/path/to/client.key"
    transport.tls.trustedCaFile = "/path/to/ca.crt"

根据你的需求选择合适的密码校验方式,并按照上述配置进行设置即可。