王某某的笔记

记录我的编程之路

https://hexo.io/zh-cn/

https://hexo.io/docs/

Hexo 是一个快速、简洁且高效的博客框架。 Hexo 使用 Markdown(或其他标记语言)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。

使用 Node.js 编写

安装 Node.js 和 git

Hexo 需要 Node.js 和 npm(Node.js 的包管理器)。你可以从 Node.js 官网 下载并安装最新版本的 Node.js。安装 Node.js 后,npm 会自动随之安装。

Node.js (Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本)

git 正常安装即可

安装 Hexo

打开终端或命令提示符,运行以下命令来全局安装 Hexo:

1
2
npm install -g hexo-cli

有点慢,好像需要科学上网
可以指定国内镜像:–registry=https://registry.npmmirror.com

创建新的 Hexo 博客

选择一个你希望存放博客的目录,并进入该目录,然后运行:

1
hexo init blog

这将会在 blog 目录下创建一个新的 Hexo 博客项目。你也可以将 blog 替换为你希望的项目名称。

安装依赖

进入你的博客目录后,安装项目依赖:

1
2
3
4
5
cd blog
npm install

#或者指定淘宝镜像
npm install --registry=https://registry.npmmirror.com

创建新的文章

使用 Hexo 提供的命令来创建新的文章:

1
2
hexo new "我的第一篇文章"

这会在 source/_posts 目录下生成一个新的 Markdown 文件,你可以在这个文件中编写你的文章。

生成和预览网站

在生成网站之前,你可以先在本地预览网站:

1
hexo server

然后在浏览器中访问 http://localhost:4000 来查看你的博客。

当你对博客的内容感到满意时,可以生成静态文件:

1
hexo generate

生成的静态文件会放在 public 目录下。


部署博客

Hexo 支持多种部署方式,如 GitHub Pages、Netlify 等。以下是将博客部署到 GitHub Pages 的步骤:

  1. 在 GitHub 上创建一个新的仓库。
  2. 修改 Hexo 配置文件 _config.yml 中的部署设置,添加你的仓库地址。例如:
    1
    2
    3
    4
    5
    deploy:
    type: git
    repo: https://github.com/你的用户名/你的仓库名.git
    branch: main

  3. 安装 Hexo 部署插件:
    1
    npm install hexo-deployer-git --save
  4. 部署到 GitHub Pages:
    1
    hexo deploy

配置和主题

Hexo 的配置文件 _config.yml 可以用来设置网站的基本信息,如标题、描述、作者等。你还可以通过安装和配置主题来改变博客的外观,主题通常放在 themes 目录下。

要添加新的主题,你可以从 Hexo 官方主题库 下载,然后将其放在 themes 目录下,修改 _config.yml 中的 theme 选项以使用新的主题。

https://hexo.io/zh-cn/docs/front-matter

Front-matter 是文件开头的 YAML 或 JSON 代码块,用于配置写作设置。 以 YAML 格式书写时,Front-matter 以三个破折号结束;以 JSON 格式书写时,Front-matter 以三个分号结束。

YAML

1
2
3
4
---
title: Hello World
date: 2013/7/13 20:46:25
---

JSON

1
2
3
"title": "Hello World",
"date": "2013/7/13 20:46:25"
;;;

设置 & 默认值

设置 描述 默认值
layout 布局 config.default_layout
title 标题 文章的文件名
date 建立日期 文件建立日期
updated 更新日期 文件更新日期
comments 开启文章的评论功能 true
tags 标签(不适用于分页)
categories 分类(不适用于分页)
permalink 覆盖文章的永久链接. 永久链接应该以 / 或 .html 结尾 null
excerpt 纯文本的页面摘要。 使用 该插件 来格式化文本
disableNunjucks 启用时禁用 Nunjucks 标签 { { } }/{ % % } 和 标签插件 的渲染功能 false
lang 设置语言以覆盖 自动检测 继承自 _config.yml
published 文章是否发布 对于 _posts 下的文章为 true,对于 _draft 下的文章为 false

分类和标签

只有文章支持分类和标签。

分类按顺序应用于帖子,从而产生分类和子分类的层次结构。标签都定义在相同的层次结构上,因此它们的出现顺序并不重要。

1
2
3
4
5
6
7
categories:
- Sports
- Baseball
tags:
- Injury
- Fight
- Shocking

多级分类

如创建多个文章,其分类定义如:

1
2
categories:
- [Java, Spring]
1
2
categories:
- [Java, Spring, Spring MVC]
1
2
categories:
- [Java, SpringBoot]

则展示效果如:
1721879855319.png

https://github.com/fatedier/frp

frp 采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。 在此基础上,frp 支持 TCP, UDP, HTTP, HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力。此外,还可以通过 xtcp 实现 P2P 通信。

https://gofrp.org/zh-cn/#td-block-1

安装与配置

在centos 7 上安装和使用

下载最新版本到指定目录:

1
wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz

创建 frps.service 文件

1
$ sudo vim /etc/systemd/system/frps.service

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /opt/frp/current/frps -c /opt/frp/current/frps.toml

[Install]
WantedBy = multi-user.target

使用 systemd 命令管理 frps 服务

1
2
3
4
5
6
7
8
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps

设置 frps 开机自启动

1
sudo systemctl enable frps

修改配置文件

1
vim /opt/frp/current/frps.toml 

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bindPort = 6800

auth.token = "abc123"


######################
#日志配置
######################
log.to = "/opt/frp/logs/frps.log"
log.level = "info"
log.maxDays = 7
log.disablePrintColor = false


###############################
### 服务端 Dashboard
###############################
# 默认为 127.0.0.1,如果需要公网访问,需要修改为 0.0.0.0。
webServer.addr = "0.0.0.0"
webServer.port = 7500
# dashboard 用户名密码,可选,默认为空
webServer.user = "admin"
webServer.password = "admin"

修改完之后重启

查看web 管理界面

http://192.168.1.8:7500/


防火墙和端口映射

在路由器上进行端口映射

16800端口映射:

1
2
3
4
5
192.168.1.8
6800
tcp+udp

frp主端口

16801端口映射:

1
2
3
4
5
192.168.1.8
16801
tcp+udp

frp 映射端口1

这里先只开放一个端口

防火墙放开端口

放开端口6800

1
2
3
4
firewall-cmd --permanent --zone=public --add-port=6800/tcp

firewall-cmd --reload
firewall-cmd --zone=public --list-ports

放开端口16801

1
2
3
firewall-cmd --permanent --zone=public --add-port=16801/tcp
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

客户端测试

下载

https://github.com/fatedier/frp/releases

下载windows版本的程序

下载了一个v0.59.0版本的,被报检测到病毒

后面又下载了一个v0.56.0版本的

配置

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
serverAddr = "[你的域名或公网ip]"
serverPort = 16800

auth.token = "abc123"


[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 16801

启动

启动客户端程序

进入目录执行:

1
>frpc -c frpc.toml

这里代理了一个80端口,在本地随便启动一个80端口的程序,这里用HFS,然后访问:
http://[你的域名或公网ip]:16801

Let’s Encrypt 是一家证书颁发机构。
推荐使用 Certbot ACME 客户端,Certbot 是 Let’s Encrypt 提供的官方工具,用于自动化证书的申请和更新。

https://certbot.eff.org/instructions?ws=nginx&os=centosrhel7&tab=wildcard

https://eff-certbot.readthedocs.io/en/latest/install.html

Let’s Encrypt 的主要特点:

  • 免费: 任何个人或组织都可以免费申请和使用 Let’s Encrypt 的证书(包括通配符证书)。
  • 自动化: 通过工具(如 certbot)可以自动生成、验证、颁发、安装和更新证书,减少了手动管理的复杂性。
  • 短生命周期: Let’s Encrypt 证书的有效期为 90 天,建议用户在证书到期前 30 天内更新。自动化工具如 certbot 可以帮助定期自动更新证书。
  • 广泛兼容: Let’s Encrypt 证书在现代浏览器中得到广泛支持,可以被大多数用户信任。

安装环境说明

CentOS Linux release 7.9
nginx version: nginx/1.20.x

安装Certbot

https://eff-certbot.readthedocs.io/en/latest/install.html

不使用 snapd 安装,太麻烦了,直接使用yum安装

1
yum install certbot

手动获取通配符证书

使用DNS认证,申请通配符证书

1
sudo certbot certonly --manual --preferred-challenges dns -d wangwen135.top -d '*.wangwen135.top'

1715755367252.png

输入邮箱地址,同意条款等,然后就需要去域名解析那边配置一个txt记录

1715755617357.png

确保解析生效:

1
nslookup -type=txt _acme-challenge.wangwen135.top

然后回到控制台,继续

然后提示还需要再添加一条,重复上面的操作,不要删除之前的,名字相同是可以的

1
2
3
4
5
6
7
8
9
10
11
>nslookup -type=txt _acme-challenge.wangwen135.top
服务器: dns4.xxx.cn
Address: 10.10.66.12

非权威应答:
_acme-challenge.wangwen135.top text =

"GBp_6iDCPE44wOkjTHwxUvlFzDNgwbZV0pRF5MDhpEw"
_acme-challenge.wangwen135.top text =

"aVWrn3qBdTBIz5GW6JRwF8C858gE5N3r_8MQljYjfhw"

回车生成成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
Waiting for verification...
Resetting dropped connection: acme-v02.api.letsencrypt.org
Cleaning up challenges
Subscribe to the EFF mailing list (email: wangwen135@gmail.com).
Starting new HTTPS connection (1): supporters.eff.org

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/wangwen135.top/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/wangwen135.top/privkey.pem
Your certificate will expire on 2024-08-13. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again. To non-interactively renew *all* of your
certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

生成的证书文件在:/etc/letsencrypt/live/wangwen135.top 目录中

不要移动或者重命名生成的文件


使用证书

直接在nginx中配置,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 8443 ssl http2;
server_name wangwen135.top home.wangwen135.top;

ssl_certificate /etc/letsencrypt/live/wangwen135.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wangwen135.top/privkey.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
...
...

自动续签

使用 Let’s Encrypt 的 –manual 模式进行证书验证时,需要在每次续期时手动在 DNS 解析中添加 TXT 记录。因为 –manual 模式要求用户手动完成域名所有权的验证过程。

Let’s Encrypt 官方提供了一些 DNS 插件来支持不同的 DNS 提供商,这些插件可以帮助自动化 DNS 记录的管理,可以通过 API 自动更新 DNS 记录。
如:certbot-dns-cloudflare、certbot-dns-google 等。

但是官方提供的 Certbot 客户端没有直接支持阿里云 DNS API 的插件。

在github上找了一个certbot-dns-alidns 这个插件可以用于与阿里云 DNS API 集成,实现自动化证书续期。

https://github.com/justjavac/certbot-dns-aliyun

安装阿里云CLI命令行工具

1
2
3
4
wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
tar xzvf aliyun-cli-linux-latest-amd64.tgz
sudo cp aliyun /usr/local/bin
rm aliyun

安装完成后需要配置凭证信息

准备key:

1
2
3
4
5
AccessKey ID:  
LTAI5txxxxxxxxxxx

AccessKey Secret:
A0ooBtxxxxxxxxxxxxxxxxxxxxxxxx

上阿里云上操作

执行:aliyun configure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@centos7-85 ~]# aliyun configure
Configuring profile 'default' in 'AK' authenticate mode...
Access Key Id [*********************kvh]:
Access Key Secret [***************************zVy]:
Default Region Id []: cn-hangzhou
Default Output Format [json]: json (Only support json)
Default Language [zh|en] zh:
Saving profile[default] ...Done.

Configure Done!!!
..............888888888888888888888 ........=8888888888888888888D=..............
...........88888888888888888888888 ..........D8888888888888888888888I...........
.........,8888888888888ZI: ...........................=Z88D8888888888D..........
.........+88888888 ..........................................88888888D..........
.........+88888888 .......Welcome to use Alibaba Cloud.......O8888888D..........
.........+88888888 ............. ************* ..............O8888888D..........
.........+88888888 .... Command Line Interface(Reloaded) ....O8888888D..........
.........+88888888...........................................88888888D..........
..........D888888888888DO+. ..........................?ND888888888888D..........
...........O8888888888888888888888...........D8888888888888888888888=...........
............ .:D8888888888888888888.........78888888888888888888O ..............

安装 certbot-dns-aliyun 插件

1
2
3
4
5
6
git clone git@github.com:justjavac/certbot-dns-aliyun.git
cd certbot-dns-aliyun/
sudo cp alidns.sh /usr/local/bin
sudo chmod +x /usr/local/bin/alidns.sh
sudo ln -s /usr/local/bin/alidns.sh /usr/local/bin/alidns

申请证书

测试是否能正确申请:

1
2
certbot certonly -d wangwen135.top -d *.wangwen135.top --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run

正式申请时去掉 –dry-run 参数:

1
2
certbot certonly -d wangwen135.top -d *.wangwen135.top --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" 

证书续期

1
2
certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --dry-run

如果以上命令没有错误,把 --dry-run 参数去掉。

自动续期

添加定时任务 crontab。

1
sudo crontab -e

以root身份执行

输入

1
2
3
1 1 */1 * * certbot renew --manual --preferred-challenges dns --manual-auth-hook "alidns" --manual-cleanup-hook "alidns clean" --deploy-hook "nginx -s reload" >> /var/log/letsencrypt/c
rontab/certbot_renew.log 2>&1

上面脚本中的 –deploy-hook “nginx -s reload” 表示在续期成功后自动重启 nginx。

创建日志目录:

1
mkdir -p /var/log/letsencrypt/crontab/

日志文件位于:

  • /var/log/letsencrypt/letsencrypt.log
  • /var/log/letsencrypt/crontab/certbot_renew.log

certbot renew 命令会检查所有已安装的证书,并在证书的有效期少于 30 天时尝试更新它们。如果证书在此期间成功更新,新的有效期将从更新的日期开始重新计算。



调试

crontab 可能没有正常执行,查看记录:

1
cat /var/log/cron

查看任务执行日志

1
tail -33f /var/log/letsencrypt/crontab/certbot_renew.log 

将定时任务调整为:

1
*     *      *        *       *       certbot renew....

每分钟一次,确保没有什么异常

2024-9-6 修改,新增CSS样式

nginx 指定一个目录提供文件列表和下载功能

原始的

nginx 配置文件

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
36
37
38
39
server {
listen 8443 ssl;
server_name download.yousite.com;

access_log /var/log/nginx/downloads_access.log;

# 证书
ssl_certificate /etc/letsencrypt/live/yousite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yousit.com/privkey.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# 根目录设置为 /www/mnt/downloads
root /www/mnt/downloads;

# 启用目录列表
location / {
autoindex on; # 启用目录列表
autoindex_exact_size off; # 以更人性化的格式显示文件大小
autoindex_localtime on; # 以服务器本地时间显示文件时间
charset utf-8; # 设置字符集为 UTF-8
try_files $uri $uri/ =404; # 确保请求的文件或目录存在,否则返回 404

#阻止其他网站直接链接你的文件
valid_referers none blocked yousite.com *.yousite.com;
if ($invalid_referer) {
return 403;
}
}

# 禁止访问上级目录,防止目录遍历攻击
location ~ /\.\./ {
deny all;
}

}

展示效果

1725635088030.png

但是这个页面比较难看,特别是对于移动端浏览器很难用,文件都选不中,于是就想着修改一下

修改后的

不想使用其他的文件服务程序,就用 sub_filter 替换内容来实现引入一个CSS样式文件

修改后的nginx配置

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
server {
listen 8443 ssl;
server_name download.yousite.com;

access_log /var/log/nginx/downloads_access.log;

# 证书
ssl_certificate /etc/letsencrypt/live/yousite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yousite.com/privkey.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# 根目录设置为 /www/mnt/downloads
root /www/mnt/downloads;

# 启用目录列表
location / {
autoindex on; # 启用目录列表
autoindex_exact_size off; # 以更人性化的格式显示文件大小
autoindex_localtime on; # 以服务器本地时间显示文件时间
charset utf-8; # 设置字符集为 UTF-8
try_files $uri $uri/ =404; # 确保请求的文件或目录存在,否则返回 404

#内容替换
sub_filter '</head>' '<link rel="stylesheet" href="/css/download.css"></head>';
sub_filter '<title>Index of' '<title>目录';
sub_filter '<h1>Index of' '<h1>目录';
sub_filter '</body>' '<p>王某某的公开下载服务</p></body>';
sub_filter '<hr>' '';
sub_filter_once off;

#阻止其他网站直接链接你的文件
valid_referers none blocked yousite.com *.yousite.com;
if ($invalid_referer) {
return 403;
}
}

# 禁止访问上级目录,防止目录遍历攻击
location ~ /\.\./ {
deny all;
}

#配置自定义的CSS
location /css/download.css {
alias /www/mnt/service/download/download.css;
}

#favicon.ico
location /favicon.ico {
alias /www/mnt/service/download/favicon.ico;
}

}

主要是使用 sub_filter 替换内容,从而实现引入一个CSS 文件

download.css文件内容

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
body {
margin: 0;
box-sizing: border-box;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}

body pre {
font-family: Microsoft YaHei;
font-size: 1rem;
width: 960px;
text-align: right;
padding-right: 20px;
margin-top: 0px;
}

a {
text-decoration: none;
border: 1px solid #ccc;
border-radius: 5px;
padding: 5px 10px;

display: flex;
position: relative;
top: 26px;
left: 10px;
}

a:hover {
border-color: #000;
}

body p {
margin-top: auto;
margin-bottom: 10px;
}

/* 针对移动设备的 */
@media (max-width: 980px) {
body pre {
font-size: 1.4rem;
}

a {
top: 35px;
}
}

将CSS文件保存到上面指定的位置,如:/www/mnt/service/download/download.css;

展示效果

1725634593930.png

手机端浏览器

1725634719193.png

在Linux中,文件或目录权限为777时会显示高亮的绿底,这是因为使用了特定的颜色配置来表示文件权限。可以通过修改终端的颜色配置来去除这种高亮显示。以下是具体步骤:

修改.bashrc或.zshrc文件:

打开你的shell配置文件(例如.bashrc或.zshrc),并添加或修改以下内容:

1
2
3
4
LS_COLORS="$LS_COLORS:ow=0;34:" # 将ow=0;34:添加到LS_COLORS
export LS_COLORS


这里的ow=0;34:表示将拥有所有权限的文件的颜色设置为蓝色(你可以根据需要修改颜色代码)。

重新加载配置文件:

保存文件后,执行以下命令以重新加载配置文件:

1
2
3
4
source ~/.bashrc
# 或者
source ~/.zshrc


颜色代码参考:

  • 0:默认颜色
  • 1:加粗
  • 4:下划线
  • 31:红色
  • 32:绿色
  • 33:黄色
  • 34:蓝色
  • 35:紫色
  • 36:青色
  • 37:白色

什么是网络唤醒WOL

见维基百科:https://zh.wikipedia.org/wiki/%E7%B6%B2%E8%B7%AF%E5%96%9A%E9%86%92

Wake-on-LAN简称WOLWoL,中文多译为“网络唤醒”、“远程唤醒”技术。WOL是一种技术,同时也是该技术的规范标准,它的功效在于让==休眠==状态或==关机==状态的电脑,透过局域网的另一台电脑对其发令,使其唤醒、恢复成运作状态,或从关机状态转成引导状态。

要求

要想实现WOL,首先必须要有具备WOL功能的主板、网卡。

现在的主板通常只需在BIOS中开启PCI/PCIe唤醒功能或网卡唤醒功能,主板内置的网卡可支持WOL。除了开启BIOS中的PCIe唤醒功能外,可能还要在操作系统中设置网卡的唤醒功能

除了古董机之外现在的电脑一般都支持,多在BIOS中找找相关选项

工作原理

电脑处在关机(或休眠)状态时,机内的网卡及主板部分仍保有微弱的供电,此微弱供电能让网卡保有最低的运作能力,使网卡能聆听来自电脑外部的网络广播信息,并对信息内容进行侦测与解读,一旦发现网络广播的内容中有特定的“魔法数据包”(Magic Packet),就会对该数据包的内容进行研判。

魔法数据包是以广播方式发送的,广播的方式与范畴可以是整个局域网(LAN),也可以是特定的子网(Subnet),同时魔法数据包内会有某部(或一群)电脑的网络地址资料,网卡一旦解读研判出所指的地址是自身所处的电脑时,网卡就会通知机内的主板、电源供应器,开始进行引导(或唤醒)的程序。

魔法数据包

魔法数据包(Magic Packet)是一个广播性的帧(frame),透过端口7或端口9进行发送,且可以用无连接(Connectionless protocol)的通信协议(如UDP、IPX)来传递,不过一般而言多是用UDP

在魔法数据包内,每次都会先有连续6个”FF”(十六进制,换算成二进制即:11111111)的资料,即:FF FF FF FF FF FF,在连续6个”FF”后则开始带出MAC地址信息,有时还会带出4字节或6字节的密码,一旦经由网卡侦测、解读、研判(广播)魔法数据包的内容,内容中的MAC地址、密码若与电脑自身的地址、密码吻合,就会引导唤醒、引导的程序。

如:

1
2
3
4
5
6
7
8
00000000 : FF FF FF FF FF FF 6C BC 4A B3 F4 BC 6C BC 4A B3 
00000010 : F4 BC 6C BC 4A B3 F4 BC 6C BC 4A B3 F4 BC 6C BC
00000020 : 4A B3 F4 BC 6C BC 4A B3 F4 BC 6C BC 4A B3 F4 BC
00000030 : 6C BC 4A B3 F4 BC 6C BC 4A B3 F4 BC 6C BC 4A B3
00000040 : F4 BC 6C BC 4A B3 F4 BC 6C BC 4A B3 F4 BC 6C BC
00000050 : 4A B3 F4 BC 6C BC 4A B3 F4 BC 6C BC 4A B3 F4 BC
00000060 : 6C BC 4A B3 F4 BC

设置

BIOS设置

BIOS设置各不相同,如:

  1. 高级 -> 唤醒事件设置 -> 将 PCIE设备唤醒 和 网络唤醒 设置为 允许 (Enable)

  2. BIOS选单,选择Power Management Setup 把PME Event Wake Up 改成 Enabled即可设置成功

  3. 进入BIOS设置,Power->Automatic Power On里面,设置Wake on LAN = Enable/Automatic

不同机器的BIOS设置位置不同,找到对应的Wake on LAN选项设置就OK。一般2010年后的网卡都支持网卡唤醒功能,如果在BIOS设置里面找不到相应的设置项,很可能默认就是开启的。

电脑端设置

进入网络适配器 ,选择对应网卡 右键 -> 属性 -> 配置 -> 高级

  • 魔术封包唤醒 = 开启

电源管理 -> 勾选 允许此设备唤醒计算机

软件

这个网站有各个平台的工具
https://www.depicus.com/wake-on-lan/

WEB网页工具

http://www.dslreports.com/wakeup

桌面软件

发包软件:
https://www.depicus.com/downloads/wakeonlangui.zip

收包测试软件:
https://www.depicus.com/downloads/wakeonlanmonitor.zip

不用真正的不停的开关机,这个软件有监听到数据包就可以了
建议还是用Wireshark,规则栏里面写wol就可以,这个工具只能收指定端口的UDP包

手机端控制软件

下载:

https://www.depicus.com/wake-on-lan/wake-on-lan-andriod

安装 -> 打开应用,提示不兼容 没有关系忽略

或者:https://apkpure.com/search?q=wake+on+lan
里面有很多app

测试

这里用手机测试

手机连入和电脑相同的局域网中

输入mac地址,通过 getmac 或 ipconfig /all 获取

IP地址输入广播地址,如:192.168.31.255

子网掩码输入当前网络的子网掩码,如:255.255.255.0

端口随意,点击 Wake Up

即可启动电脑

公网远程开机

前提是:路由器取得公网IP

没有公网IP就打电话找网络运营商,如中国电信,让他们改
光猫弄成桥接模式,用路由器拨号上网,要做端口映射

直接百度IP

1
2
3
123.0.99.18(本机)  
地理地址: 中国 XXX XXX XXX
运营商: 中国电信

路由器设置端口映射

由于路由的端口转发不支持广播地址

“子网定向广播”,默认情况下,大多数路由器和防火墙都禁用此选项

这里做一下 DHCP静态IP分配

设备名称 IP地址 MAC地址
TEST-PC 192.168.31.111 AA:BB:CC:11:11:11

端口转发规则列表:

名称 协议 外部端口 内部IP地址 内部端口
远程唤醒 TCP和UDP 999 192.168.31.111 9

用唤醒工具,填入公网的ip

设置了DDNS后就可以用域名唤醒了,不用管IP的变化

注意子网掩码填:255.255.255.255

这里唤醒的是指定的IP,不再是广播了,掩码要全是1

端口填 前面映射的999


问题

配置到这里,已经可以通过因特网发送唤醒数据包到我的电脑,电脑关机后两分钟内可以再次唤醒,但是超过2分钟,唤醒操作失败,原因就是路由器arp映射表动态更新后把关机电脑的arp项删除了,导致路由器接收到魔术包后不能正确的转发。

参考:
https://github.com/melonbo/wolTool
https://www.office26.com/luyouqi/miwifi-wol-waiwang.html

解决办法

路由器开启ssh,获取root权限,配置静态arp

配置arp

通过ssh登录路由器

设置arp静态绑定mac

1
2
arp -s ip地址 ma地址

用 man arp 查看说明

完了可以用arp命令查看结果

路由器重启自动配置

但是有个问题,重启之后会丢失

window下就是永久的….

所以我们把这条指令写到启动脚本rc.local里面

1
2
3
4
$ vi /etc/rc.local 

# 增加arp映射
arp -s 192.168.31.111 XX:XX:XX:XX:XX:XX
如果需要配置多个可以考虑配置在文件中

查看说明可以看到有个 arp -f 命令,可以从文件中读取,默认文件是:/etc/ethers

我们在这个文件中写入配置:

1
2
3
4
vi /etc/ethers

192.168.31.aa XX:XX:XX:XX:XX:XX
192.168.31.aa XX:XX:XX:XX:XX:XX

在开机启动下加入

1
2
3
vi /etc/rc.local 

arp -f

远程桌面

在电脑上设置一下开启远程桌面,设置一个强密码
在路由器上再配置一个端口映射,远程桌面的端口是3389

名称 协议 外部端口 内部IP地址 内部端口
远程桌面 TCP和UDP 43389 192.168.31.111 3389

远程桌面软件:

电脑端:mstsc

手机端:RD client


Centos wol 工具

1
2
3
[root@wol ~]# yum -y install net-tools
# ether-wake [MAC address of the computer you'd like to turn on]
[root@wol ~]# ether-wake 00:22:68:5E:34:06 # send magick packets

指定接口

1
ether-wake -i eth0 11:22:33:44:55

java 工具

https://github.com/wangwen135/wol4j

直接java -jar 运行

参数说明:Mac地址 [广播地址] [端口]

如:

1
# java -jar wol4j-1.0.0.jar 22-00-DD-11-44-7A 192.168.1.255

默认端口是:9

这个工具也是发的UDP包

在 Nginx 中,你可以使用 ngx_http_limit_req_module 模块来限制一个 IP 每分钟的访问次数。

首先,确保 Nginx 已经启用 ngx_http_limit_req_module 模块,默认情况下,这个模块是启用的。如果不确定,可以通过 nginx -V 检查。

配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http {
# 定义限制规则,rate 表示每秒允许的请求数
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/m;

server {
listen 80;
server_name example.com;

location / {
# 应用限制
limit_req zone=one burst=5 nodelay;

# 其他配置...
proxy_pass http://backend;
}
}
}

说明:

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/m;

该行定义了一个限流区域 one,使用 $binary_remote_addr 作为键(即基于客户端 IP 地址),总共使用 10MB 内存(大约可存储 16,000 个唯一 IP 地址)。rate=10r/m 表示每个 IP 地址每分钟最多允许 10 个请求。

limit_req zone=one burst=5 nodelay;

应用限流规则,burst=5 允许最多积累 5 个请求的突发请求,nodelay 指定突发请求也立即处理,而不是按速率排队。

配置:

limit_req zone 不能直接写在 server 段中,必须写在具体的 location 段内。limit_req 指令是作用于某个 location,用于限制该 location 的访问速率。

如果你的 server 段下配置的是一个 root,你仍然可以在 location 段中使用 limit_req 进行速率限制,而不必具体区分路径。实际上,即使你不明确定义 location,Nginx 也会有一个默认的隐式 location /,你只需在该隐式 location 中添加 limit_req 规则即可。

1
2
3
4
# 对所有请求设置访问限制
location / {
limit_req zone=one burst=5 nodelay;
}

速度说明

在 Nginx 中,rate=10r/m 实际上是按照秒来计算的,即每 6 秒钟允许 1 个请求,而不是严格按照 1 分钟的时间间隔。虽然配置中使用的是 “r/m”(每分钟请求数),但 Nginx 是将这个速率平滑到每秒来控制请求的频率。

如果请求频率超过了这个速率(即短时间内请求超过这个阈值),Nginx 将根据 burst 参数来决定是否允许额外请求排队,或直接拒绝返回 503 错误。

burst 不涉及时间单位,它只是指在短时间内允许的突发请求数。当请求超过速率限制时,Nginx 会将多余的请求放入队列,队列的长度最多为 burst,之后的请求将被拒绝(返回 503 错误)。

测试

打开测试页面,强制刷新10次(快速刷新7次),就能看到

1
503 Service Temporarily Unavailable

现象

1
2
3
4
5
6
>git pull
ssh: connect to host github.com port 22: Connection timed out
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

但是443端口可以

1
2
3
4
5
6
7
>ssh -T -p 443 git@ssh.github.com
The authenticity of host '[ssh.github.com]:443 ([20.205.243.160]:443)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[ssh.github.com]:443' (ED25519) to the list of known hosts.
Hi wangwen135! You've successfully authenticated, but GitHub does not provide shell access.

在用户目录新增config文件

1
$ vim ~/.ssh/config

内容如下:

1
2
3
4
# Add section below to it
Host github.com
Hostname ssh.github.com
Port 443

再测试一下:

1
2
3
4
$ ssh -T git@github.com
Hi xxxxx! You've successfully authenticated, but GitHub does not
provide shell access.

脚本:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash

# 配置源目录和备份目录
source_dir="/etc/nginx/conf.d"
backup_dir="/www/mnt/backup/nginx"

# 创建备份目录(如果不存在)
mkdir -p "$backup_dir"

# 获取当前日期(格式:YYYY-MM-DD)
current_date=$(date +%Y-%m-%d)

# 压缩配置文件到临时tar包
tar_filename="/tmp/nginx_config_backup_$current_date.tar.gz"
tar -czf "$tar_filename" -C "$source_dir" .

# 检查上一个备份是否存在且与当前备份不同
last_backup=$(ls -t "$backup_dir" | head -1)
if [ -n "$last_backup" ]; then
# 解压上一个备份和当前备份
mkdir -p /tmp/last_backup /tmp/current_backup
tar -xzf "$backup_dir/$last_backup" -C /tmp/last_backup
tar -xzf "$tar_filename" -C /tmp/current_backup

# 使用diff命令比较两个目录中的文件差异
diff_output=$(diff -r /tmp/last_backup /tmp/current_backup)

# 清理临时目录
rm -r /tmp/last_backup /tmp/current_backup

if [ -z "$diff_output" ]; then
# 上一个备份与当前备份相同,抛弃当前备份
echo "No changes in Nginx configuration. Discarding backup."
rm "$tar_filename"
exit 0
fi
fi

# 移动当前备份到备份目录
mv "$tar_filename" "$backup_dir"

# 删除多余的备份(保留最多10个备份)
backup_count=$(ls -1 "$backup_dir" | wc -l)
if [ "$backup_count" -gt 10 ]; then
oldest_backup=$(ls -t "$backup_dir" | tail -1)
rm "$backup_dir/$oldest_backup"
fi

echo "Nginx configuration backup completed."

编辑定时任务

1
crontab -e

增加:

1
5     3       *       *       *       /opt/shell/nginx/nginx_config_backup.sh
0%