「KUBERNETES-ADDONS」- cert-manager | CERT-MANAGER

认识
以前,我们使用 ACME 脚本来申请 Let’s Encrypt 证书,享受着免费证书和脚本自动化的便利,部署 HTTPS 是那么简单。现在,我们切换到 Kubernetes 环境后,我们该怎样处理呢?最简单最直接的方法就是继续使用 ACME 申请证书,然后使用这个证书创建 Secret 对象,最后在 Ingress 中应用该 Secret 对象。但是 Let’s Encrypt 证书三个月到期,届时我们则需要继续证书续期,然后更新 Secret 信息,这绝对是项繁琐且易失误的工作。
我们使用 Certbot 工具向 Let’s Encrypt 免费申请并自动续期证书。在 Kubernetes Cluster 中,我们使用 cert-manager 组件来实现。
我们能够将 ACME 搬到 Kubernetes 集群中,实现证书的管理。但是,现在已有 cert-manager 组件,它将负责完成证书申请、自动续期等等系列任务,让我们从繁琐的工作中解脱出来。
该部分笔记将记录:在 Kubernetes 中,如何使用 Cert Manager 来管理 Let’s Encrypt 证书,以及相关问题的处理方法。
组成
整体架构以及各资源的作用

—— 该部分将介绍在 cert-manager 中需要知晓的基本概念及其技术架构。
Certificate -> CertificateRequest -> Order -> Challenge
Issuer
在 cert-manager 中,术语 Issuer 能够理解为“证书颁发机构(CA)”。支持以下类型: 1)SelfSigned,自签名证书; 2)CA,此类似代表证书及私钥在集群中的证书颁发机构; 3)Vault,第三方证书颁发机构; 4)Venafi,第三方证书颁发机构; 5)ACME,使用 ACME 协议获取证书。当然不限于 Let’s Encrypt 机构; 5)External,除了上述类型外,通过该方法能够自定义证书机构,以处理 CertificateRequest 资源;
Issuer 分为两种:命名空间级别的 Issuer 资源;集群级别的 ClusterIssuer 资源;
Certificate
当定义 CA(Issuer)之后,便能够申请证书,此时使用 Certificate 资源。
该对象引用 Issuer 或 ClusterIssuer 资源:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: acme-crt
spec:
secretName: acme-crt[……]

READ MORE

「CSS」- 文本处理

修改文本样式
text-transform
https://developer.mozilla.org/en-US/docs/Web/CSS/text-transform
大写:text-transform: capitalize;
隐藏过长的文本,使其显示为省略号
html – text-overflow: ellipsis not working – Stack Overflow
我们需要隐藏文本行过长的部分,使其显示为省略号,保持其仅占有一行,而不是换行继续显示。该笔记将记录:如何隐藏过长文本,使其仅占用一行,而超出的部分显示为省略号。

span {
white-space: nowrap;
text-overflow: ellipsis;
width: 100%;
display: block;
overflow: hidden
}

注意事项,需要设置 width 才可以,否则 text-overflow: ellipsis; 无法生效。
内容居中
配置 div 居中 | https://stackoverflow.com/questions/18649106/vertical-align-middle-in-div

#abc{
font:Verdana, Geneva, sans-serif;
font-size:18px;
text-align:left;
background-color:#0F0;
height:50px;
display: table;
width: 100%;
}

#abc span {
vertical-align:middle;
display: table-cell;
}[……]

READ MORE

「lsof」

lsof | lists open files for running processes.
查找使用进程的目录:lsof +D /path/to/folder
参考文献

BLFS/lsof-4.89[……]

READ MORE

「TMV/NETWORK」- Web 应用防火墙 | WAF | Web Application Firewall

认识
WAF(Web Application Firewall,Web 应用防火墙)
Web 应用防火墙(Web Application Firewall,WAF),通过对 HTTP(S)请求进行检测,识别并阻断 SQL 注入、跨站脚本攻击、网页木马上传、命令 / 代码注入、文件包含、敏感文件访问、第三方应用漏洞攻击、CC 攻击、恶意爬虫扫描、跨站请求伪造等攻击,保护 Web 服务安全稳定。
组成
开通 Web 应用防火墙后,在 WAF 管理控制台将网站添加并接入 WAF,即可启用 Web 应用防火墙。启用之后,您网站所有的公网流量都会先经过 Web 应用防火墙,恶意攻击流量在 Web 应用防火墙上被检测过滤,而正常流量返回给源站 IP,从而确保源站 IP 安全、稳定、可用。
防护原理
申请 WAF 后,在 WAF 管理控制台将网站添加并接入 WAF。网站成功接入 WAF 后,网站所有访问请求将先流转到 WAF,WAF 检测过滤恶意攻击流量后,将正常流量返回给源站,从而确保源站安全、稳定、可用。

流量经 WAF 返回源站的过程称为回源。WAF 通过回源 IP 代替客户端发送请求到源站服务器,接入 WAF 后,在客户端看来,所有的目标 IP 都是 WAF 的 IP,从而隐藏源站 IP。
回源地址

构建
商业 WAF 产品
长河 Web应用防火墙(WAF) https://www.kkidc.com/market/7593.html
开源 WAF 软件
The Best Open Source Web Application Firewalls – zenarmor.com
The following open-source Web Application Firewall might be helpful if you are seeking a free alternative to commercial WAF to safeguard your website:

NAXSI
WebKnight
Shadow Daemon
Coraza
OctopusWAF
IronBee
ModSecurity

Bunker Web |
https://github.com/bunkerity/bunkerweb

https://www.bunkerweb.io/

bunkerity/bunkerweb: 🛡️ Open-source and next-generation Web Application Firewall (WAF[……]

READ MORE

「Nginx」- 413 Request Entity Too Large

https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size

server{

client_max_body_size 20m;

}

Context: http, server, location
参考文献
nginx 更改配置 client_max_body_size 没有生效[……]

READ MORE

「CLASH」- Daemonize Clash

构建
通过 Docker 部署,以针对某些特殊场景 https://hub.docker.com/r/dreamacro/clash
通过 Docker Compose 运行:

version: ‘3.8’

services:
dreamacro-clash:
image: registry.cn-hangzhou.aliyuncs.com/d3rm/third-party:docker.io.dreamacro.clash.v1.18.0 # dreamacro/clash:v1.18.0
container_name: dreamacro-clash
restart: unless-stopped
volumes:
– ./config:/root/.config/clash/ # 挂载配置文件目录
ports:
– “57890:7890” # HTTP 代理
– “57891:7891” # SOCKS5 代理
– “59090:9090” # 外部控制端口(REST API)
# network_mode: “host” # 推荐使用 host 模式,避免 NAT 问题
# cap_add: # 如果需要 TUN 模式,取消注释
# – NET_ADMIN

应用
WIP 配置全局代理
我们尝试修改 mode: global 参数,但是并未生效。另外,我们能找到的针对 mode: global 相关的文档较少。[……]

READ MORE

「BLOCKCHAIN」- 钱包账户 | Wallet Account

认识
在区块链钱包中,账户(Account)是用户管理资产和进行交易的基本单元,其核心围绕密钥对和链上地址展开。账户是区块链交互的入口,理解其密钥体系和类型差异对安全资产管理至关重要。
组成
账户的构成
密钥对:

私钥(Private Key):64 位 16 进制字符串(如`5Kb8kL…`),是账户所有权的唯一凭证,丢失即失去资产。
公钥(Public Key):由私钥通过椭圆曲线加密(如 SECP256k1)生成,用于推导地址。

地址(Address):公钥的哈希值(如比特币`1A1zP1…`或以太坊`0x71C7…`),公开用于接收资产。 地址派生:公钥通过哈希算法(如比特币用 SHA256+RIPEMD160,以太坊用 Keccak256)转换为地址,全程无需网络参与。
示例: 以太坊账户通过`keccak256(公钥)`生成地址,最后取 20 字节(前缀`0x`)。
不同链的独立性 – 同一套密钥可跨链使用:例如,通过 BIP44 标准派生的私钥可生成比特币、以太坊等多个链的地址(但地址格式不同)。 – 链特异性:每条链的地址编码规则不同(如比特币`1/3/bc1`开头,以太坊`0x`开头),但私钥生成逻辑相同。
创建账户是否依赖于区块链网络
DeepSeek / 创建账户是否依赖于区块链网络
创建区块链账户(地址)不依赖于区块链网络,它是一个纯粹的本地操作。创建区块链账户是“自给自足”的过程,网络仅在后续交互时必要。掌握这一原理可避免依赖第三方,真正实现去中心化资产控制。
账户创建的本质,其完全离线生成: 账户的核心是密钥对(私钥 + 公钥),通过本地数学计算(如椭圆曲线加密算法)即可生成,无需联网。
为何无需依赖区块链? – 去中心化原则:区块链账户的本质是“密钥对 + 地址”,这些信息由用户自主生成,不依赖任何中心化机构或服务器。 – 网络的作用:只有在广播交易或查询余额时,才需要连接区块链网络(如通过节点 API 或钱包服务)。
例外情况 – 托管钱包:交易所或托管服务(如 Coinbase)的账户需要联网注册,因其本质是中心化数据库中的记录,非真正区块链账户。 – 智能合约账户:合约地址由部署者 EOA 地址和 nonce 计算得出(需上链后确定),但普通用户 EOA 账户仍可离线创建。
构造
钱包与账户的关系 – 单钱包多账户: 一个钱包(如 MetaMask)可管理多个账户(密钥对),通过助记词派生(HD 钱包特性)。 路径示例:`m/44’/60’/0’/0/0`(以太坊首个账户)。
– 账户隔离: 不同账户地址独立,资产和交易记录互不干扰(隐私保护)。
创建账户的实际流程[……]

READ MORE

「HARBOR」- Migrate to Kubernetes | 从 Docker Compose 迁移到 Kubernetes 环境

Harbor Version v2.10.0-6abb4eab, with Installer
Integration with Kubernetes https://github.com/goharbor/harbor/issues/21149
在官方中,我们未找到相关方法(12/08/2024),所以我们尝试使用镜像复制的方式来迁移到 Kubernetes 中,然后手动处理其他数据。
# helm search repo harbor/harbor –versions | grep 2.10.0 harbor/harbor 1.14.0 2.10.0 An open source trusted cloud native registry th…
# helm pull harbor/harbor –version 1.14.0
# helm show values ./harbor-1.14.0.tgz > harbor-1.14.0.tgz.helm-values.yaml
# vim harbor-1.14.0.tgz.helm-values.yaml // …
# helm upgrade –install –namespace container-registry –create-namespace harbor ./harbor-1.14.0.tgz -f harbor-1.14.0.tgz.helm-values.yaml
通过 Replications 功能,来进行镜像复制

Source resource filter

Name: **
Tag: exclude none-exist
Label: exclude none-exist

Destination

Flattening: No Flattening

注意,针对 Tag Label 参数,我们尝试使用 match ** 来匹配,但是无法匹配到镜像。我们并未找到相关说明文档,所以最终决定使用 excluude 方式。[……]

READ MORE

「CERTBOT」- 通过 DNSPod DNS Plugin 完成 DNS 质询

DNSPOD和CertBot结合使用来自动生成通配符的SSl证书
with certbot-dns-dnspod | by tengattack
https://snapcraft.io/certbot-dns-dnspod

snap install certbot –classic
snap install certbot-dns-dnspod

snap set certbot trust-plugin-with-root=ok
snap connect certbot:plugin certbot-dns-dnspod

# 登录 DNSPod 控制台,在 密钥管理 中创建密钥,复制自动生成的 ID 和 Token 并保存。
# https://console.dnspod.cn/account/token
mkdir -pv /etc/letsencrypt/
cat > /etc/letsencrypt/dnspod-credentials.ini <<EOF
dns_dnspod_api_id = 12345
dns_dnspod_api_token = 1234567890abcdef1234567890abcdef
EOF

chmod 600 /etc/letsencrypt/dnspod-credentials.ini

certbot run \
–authenticator dns-dnspod \
–dns-dnspod-credentials /etc/letsencrypt/dnspod-credentials.ini

certbot certonly -a dns-dnspod \
–dns-dnspod-credentials /etc/letsencrypt/dnspod-credentials.ini \
-d “*.devops.example.com”

插件文档:https://github.com/tengattack/certbot-dns-dnspod
# 12/09/2024 注意,在 snap 中,如果 certbot 为 3.0.0 版本以上,则无法使用 certbot-dns-dnspod(0.24.2,10,latest/stable ericzhang456,当前最新版本),需要针对 snap certbot 进行降级处理;

Snap install specific/old version – Ask Ubuntu

snap download certbot –revision 3834 # certbot 2.11.0
snap ack[……]

READ MORE

「SCIENTIFIC-BROWSING」- 创建 HTTP(s) 代理

由于网络访问的原因,或者需要网络加速,又或者其他原因,我们需要搭建 HTTP 与 HTTPS 代理。我们这里主要使用 Squid 搭建 HTTP 与 HTTPS 正向代理。并且 Squid 的 HTTP 代理支持 CONNECT 方法,所以 HTTP 能够作为 HTTPS 代理。该笔记将记录:在 Linux 中,如何通过 Squid 快速创建 HTTP 与 HTTPS 代理。
with Dokcer
GitHub/yegor256/squid-proxy

#1 安装 Docker 服务
# https://docs.docker.com/install/
# 略过……

#2 启动服务
docker run –name squid-proxy -d –restart=always –publish 3128:3128 \
-e USERNAME=jeffrey -e PASSWORD=swordfish \
yegor256/squid-proxy

# 附加说明
# 1)根据作者的介绍,这是一个匿名的代理。可以访问 http://amibehindaproxy.com/ 进行验证;
# 2)该服务只启用了基础认证(Basic Authorization)

其他 Docker 镜像: 1)sameersbn/squid
with APT/YUM
本部分介绍如何使用 Squid 搭建 HTTP 与 HTTPS 代理,并使用基础认证(Digest Access Authentication)功能;
实验环境
注意,本部分所记录的搭建过程适用于以下发行版,其他发行版也是类似的: CentOS Linux release 7.5.1804 (Core) => 成功 Kali GNU/Linux Rolling => 成功
第一步、安装服务

# Debian
apt-get install -y squid apache2-utils

# CentOS
yum install -y squid httpd-tools

第二步、配置服务
(可选)配置认证信息。如果不需要认证,则跳过该步骤。

mkdir -pv /etc/squid/conf.d/

# 定义认证信息(Digest Access Authentication)
htdigest -c /etc/squid/password.digest public foo

# 定义配置文件
cat > /etc/squid/conf.d/09-forward-proxy.conf <<EOF
# 在 Debian 中,取消该行注释
auth_param[……]

READ MORE

「CONTAINER」- 容器镜像的快速分发技术

将来,针对特定业务场景及需求,我们将引入 DragonFly 或 Kraken 等等组件,以在集群中实现大镜像的快速分发;
Dragonfly
https://d7y.io/ https://github.com/dragonflyoss/Dragonfly2
提供高效、稳定、安全的基于 P2P 技术的文件分发和镜像加速系统,并且是云原生架构中镜像加速领域的标准解决方案以及最佳实践。现在为云原生计算机基金会托管作为孵化级项目。
Dragonfly 是一个与 Kubernetes 相关的项目,它是一个分布式文件传输系统,可以加速 Kubernetes 集群中的容器镜像和应用程序的部署。Dragonfly 使用 P2P 网络技术,可以在 Kubernetes 集群中的各个节点之间高效地传输文件,提高集群的可用性和稳定性。
Dragonfly 主要有以下作用: 1)加速容器镜像的部署:Dragonfly 可以在 Kubernetes 集群中部署一个本地的 P2P 网络,加速容器镜像的下载和分发,提高容器的部署速度。 2)提高集群的可用性和稳定性:Dragonfly 可以将容器镜像和应用程序分发到多个节点上,提高集群的可用性和稳定性,减少节点单点故障的风险。 3)节省带宽和存储空间:Dragonfly 可以自动缓存已经下载的容器镜像和应用程序,减少重复下载的带宽和存储空间的消耗。
Nydu

认识

https://nydus.dev
是 Dragonfly 的子项目,是个基于 FUSE 的文件系统加速器,其将远程文件系统的数据缓存到本地。

性质

加速文件系统访问:Nydus 可以将远程文件系统的数据缓存到本地,从而加快文件系统的访问速度。当用户访问文件时,Nydus 会优先从本地缓存中读取数据,如果本地没有缓存,则会从远程文件系统中读取。
减轻远程文件系统的负担:Nydus 可以减轻远程文件系统的负担,因为它可以将一部分数据缓存到本地,从而减少远程文件系统的访问量。
支持多种文件系统类型:Nydus 支持多种文件系统类型,包括 NFS、SMB、FTP 等,可以适应不同的应用场景。
提高文件传输的可靠性:Nydus 支持数据的校验和校验,可以确保文件传输的可靠性。同时,Nydus 还支持断点续传,当文件传输中断时,可以恢复之前的传输进度,从而避免数据丢失。

Kraken
https://github.com/uber/kraken
Kraken 是由 Uber 开源的一个用于大规模部署容器镜像的 P2P 分发系统。它旨在解决传统的集中式镜像仓库存在的瓶颈和性能问题。
Krak[……]

READ MORE

「jd-cli」- Command line Java Decompiler

认识
官网:https://github.com/intoolswetrust/jd-cli 文档:https://github.com/intoolswetrust/jd-cli 仓库:https://github.com/intoolswetrust/jd-cli
The jd-cli is a simple command line wrapper around JD Core Java Decompiler project. 简而言之,jd-cli 是个命令行使用的 java 反编译工具。[……]

READ MORE

「Maven」- settings.xml

settings.xml | Located in USER_HOME/.m2 the settings files is designed to contain any configuration for Maven usage across projects. Settings Reference | https://maven.apache.org/settings.html
Maven 的 `settings.xml` 文件通常位于两个位置之一:

全局设置:`${maven.home}/conf/settings.xml`
用户设置:`${user.home}/.m2/settings.xml`

创建 settings.xml 文件
DeepSeek / mvn 生成 settings.xml 文件
如何生成默认的 settings.xml 文件
Maven 本身不会自动生成 settings.xml 文件,但你可以手动创建它。
获取默认 settings.xml 设置
如果想要获取 Maven 提供的默认 settings.xml 文件,可以:

找到你的 Maven 安装目录
查看 `conf/settings.xml` 文件
将其复制到你的 `~/.m2/` 目录下:cp ${MAVEN_HOME}/conf/settings.xml ~/.m2/settings.xml

注意事项

大多数情况下,你不需要完整的 settings.xml 文件,Maven 有内置的默认值
在需要自定义仓库、代理设置、认证信息时,才需要创建此文件
针对企业环境,通常会有专门的 settings.xml 文件配置,需要从团队获取

添加仓库
# 在 Maven 的 settings.xml 中添加仓库
在 Maven 的 `settings.xml` 文件中,你可以通过 `<repositories>` 和 `<pluginRepositories>` 元素来添加仓库。以下是详细方法:
## 1. 基本仓库配置
在 `<profiles>` 部分添加仓库配置:

<profiles>
<profile>
<id>custom-repositories</id>
<repositories>
<repository>
<id>my-repo</id>
<name>My Custom Re[……]

READ MORE

「Shadowsocks」- 在 Linux 中,配置系统(全局)代理

Shadowsocks 使用 SOCKS5 协议中的客户端。
在 Windows 中,启动 Shadowsocks 客户端(shadowsocks-windows)后,应用程序(浏览器等)不需要进行特殊配置,只需要在 Shadowsocks 客户端中「启动系统代理」,选择「系统代理模式」,就可以实现全局的代理(或 PAC 模式),即每个应用程序都可以通过代理上网。当然它也可以监听本地端口。
在 Linux 中,就会麻烦一点。Linux 中 Shadowsocks 客户端(shadwosocks-qt5)并没有系统代理的功能。虽然 Linux 中由很多 Shadowsocks 客户端的实现,但是它们都不支持系统代理功能。这就导致了浏览器中需要进行单独的配置,比如需要使用 SwitchyOmega 插件,或者在浏览器的设置中进行配置 PAC 或 SOCKS;某些应用程序(比如 Wget,cURL 等等)中需要配置环境变量(HTTP_PROXY,HTTPS_PROXY)来使用代理;还有一些应用程序有自己的配置方式,比如 Git,git config –global http.proxy ‘socks5://127.0.0.1:7070’
本文主要内容就是围绕 Linux,介绍其中 Shadowsocks 系统代理的配置方式。但是其实根本不敢说是“系统代理”,因为有些方法也算不上系统代理,各种方法都有其局限性。本文也尝试找出一种 Once For All 的解决方案。本文参考了互联网上的其他博客,并且标注了出处,侵删。
解决方案
顺便说一句,在 Linux 中,如果需要“全局模式”,则需要自己进行配置,配置方法参考「Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动翻墙」一文,思路是类似的。
方法一、依赖于应用程序的支持
该方法需要被代理的应用程序本身支持 SOCKS5 代理。比如,Git、cUrl。
在Git中,如果你要使用 SOCKS 代理,需要执行:

# git config –global http.proxy ‘socks5://127.0.0.1:7070’

其中,127.0.0.1:7070 是 SOCKS5 客户端的套解字。
在cURL中,其实 cURL 本身就支持 SOCKS5 协议:

# curl -m 30 –retry 3 –socks4 101.255.17.145:1080 http://www.google.com

当然,cURL 也支持 SOCKS4 协议。
但是,Wget 就比较惨了,Wget 不支持 SOCKS5 协议。官方的手册里连个“socks”关[……]

READ MORE

「HTTP」- 代理 | HTTP PROXY

认识
HTTP 代理是一种位于客户端和目标服务器之间的中间服务器,它充当两者之间的中介,转发客户端的 HTTP 请求并返回服务器的响应。HTTP代理是网络架构中重要的组成部分,在安全、隐私和性能优化方面发挥着关键作用。
组成
Client ⇒ Proxy Server ⇒ Destination Server
报文格式
在 IP 和 TCP 中,DST IP Address 为 Proxy Server 地址,DST Port Number 为 Proxy Server 端口。
在 HTTP 中,报文也存在差异:

REQUEST URI 为完整地址;
存在多个与 Proxy 相关的头部,例如 Proxy-Connection、X-Forwarded-For、……

GET http://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

交互原理

客户端配置代理服务器地址和端口
客户端发送请求到代理服务器
代理服务器解析请求并转发到目标服务器
目标服务器响应代理服务器
代理服务器将响应返回给客户端

在 HTTP Proxy 中,DNS 解析发生在代理服务器。
构建
– Squid – Nginx (可作为反向代理) – Apache (mod_proxy) – TinyProxy – CCProxy (Windows平台)
性质

请求转发:接收客户端请求并转发给目标服务器
响应返回:接收服务器响应并返回给客户端
缓存功能:可缓存常用资源以减少带宽使用和提高响应速度
内容过滤:可过滤特定内容或网站
访问控制:可限制或允许特定用户/设备的访问
日志记录:记录用户访问信息

## 类型分类
### 按匿名程度[……]

READ MORE

「Maven」- 功能 | 特性

Repository Cache
https://stackoverflow.com/questions/4856307/when-maven-says-resolution-will-not-be-reattempted-until-the-update-interval-of
-U,–update-snapshots | Forces a check for missing releases and updated snapshots on remote repositories
mvn -U clean install

<profiles>
<profile>

<repositories>
<repository>
<id>myRepo</id>
<name>My Repository</name>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
</repository>
</repositories>

</profile>
</profiles>

推送构建制品
DeepSeek / maven 推送构建结果
# 使用 Maven 推送构建结果到仓库
Maven 提供了将构建结果(如 JAR、WAR、POM 等)推送到远程仓库的功能。以下是完整的推送构建结果的指南:
## 1. 基本推送配置
### 1.1 在 pom.xml 中配置分发仓库
“`xml <project>


<distributionManagement>

<!– 发布版本仓库 –>
<repository>

<id>company-releases</id>
<name>Company Release Repository&[……]

READ MORE

「Jenkins Pipeline」- 开发工具 | 开发环境 | IDE

问题
背景 | 原因 | 诱因
在 Jenkinsfile 中,如果需要添加复杂的功能,则简单地编辑代码并不能满足需求。针对该问题,需要引入相关的工具,来帮助我们完成 Jenkinsfile 编写。
该笔记将记录:与 Jenkinsfile 开发相关的内容、相关工具,以及常见问题的解决方案。
分析
官方 Jenkins/Pipeline Development Tools 文档,提供与 Jenkins Pipeline 相关的工具,以协助我们开发工作。
Blue Ocean Editor
Blue Ocean Pipeline Editor
在 Jenkins 中,Blue Ocean Pipeline Editor,内置的 Pipeline 的编辑器,图形化操作,所见即所得。
其能够创建 Pipeline 脚本,并能提交到 SCM 仓库中。
Command-line Pipeline Linter
命令行的 Jenkinfile 的 lint 工具,用于检查 Pipeline 是否合法有效;
使用 SSH 命令:

# 现在 Jenkins 中执行如下操作:
#(1)用户中配置 SSH PUBLIC KEY;
#(2)Manage Jenkins > Configure Global Security > SSH Server > SSHD Port > Random

curl -Lv https://JENKINS_URL/login 2>&1 | grep -i ‘x-ssh-endpoint’
# X-SSH-Endpoint: localhost:53801
ssh -p $JENKINS_SSHD_PORT $JENKINS_HOSTNAME declarative-linter < Jenkinsfile
# Jenkinsfile successfully validated.

也可以使用 cURL 命令:

# curl (REST API)
# Assuming “anonymous read access” has been enabled on your Jenkins instance.
# JENKINS_URL=[root URL of Jenkins master]
# JENKINS_CRUMB is needed if your Jenkins master has CRSF protection enabled as it should
JENKINS_CRUMB=`curl “$JENKINS_URL/crumbIssuer/api/xml?xpath=c[……]

READ MORE

「systemd-journald」- 日志服务

认识
该笔记将学习在 CenOS 7 中如何使用 Journald 服务以及 journalctl 命令进行日志管理。
文档

systemd-journald(1)
manpath.be/journald.conf
Using journalctl – The Ultimate Guide To Logging

组成
配置文件:/etc/systemd/journald.conf
应用
存储方式
日志数据保存在带有索引的结构化二进制文件中,还包含与日志事件相关的额外信息(原始设备、优先级等等);
默认日志存储机制
在默认情况下,日志文件保持在 /run/log/journal/ 目录,在系统重启后会丢失,因为 RHEL 7 认为自上次启动以来的日志足够了,无需持久化存储日志;
需要修改 /etc/systemd/journald.conf 配置文件中 [Journal] 部分的 Storage 属性。
在 CentOS Linux release 7.4.1708 (Core)中,默认 Storage=auto 配置。还可以配置为:

“volatile”,将日志存储在内存中,即 /run/log/journal 目录,如果有必要会自动创建。

“persistent”,日志将保存在磁盘中,即 /var/log/journal 目录,如果有必要会自动创建。但是,如果在启动期间磁盘不可写,比如无法成功创建 /var/log/journal 目录,那依旧会写入 /run/log/journal 目录,如果有必要会自动创建。

“auto”,类似于”persistent”属性,但是不会自动创建 /var/log/journal 目录,因此目录 /var/log/journal 的存在与否,决定了日志的写入位置。

“none”,关闭所有的存储,接收到的所有日志数据将被丢弃。将被转发到其他的目标,比如控制台、内核日志缓冲,syslog 服务等等。

持久存储日志的方法
既然”auto”是默认值。所以,想要持久化日志,执行如下命令即可:

# 创建目录
mkdir /var/log/journal

# 使用 systemd 中定义的指令进行初始化
systemd-tmpfiles –create –prefix /var/log/journal

# 重启以生效
systemctl restart systemd-journald

但是,如果 /var/log/journal/ 存在,则日志将写入其中[……]

READ MORE

「Project V」

该本部分整理与Project V有关的内容。
认识
Project V is a set of tools to help you build your own privacy network over internet.
文档:https://www.v2ray.com/en/
组成
V2Ray
The core of Project V, named V2Ray, is responsible for network protocols and communications. It can work alone, as well as combine with other tools.
在 V2Ray 升级到 3.0 的同时,V2Ray 正式扩展为Project V。除了 V2Ray 本身之外,Project V 包含所有 V2Ray 的周边产品,包括客户端、配置工具等。
参考
Project V GitHub/v2ray/v2ray-core V2Ray 项目升级为 Project V[……]

READ MORE

「DApps」- 去中心化应用 | Decentralized Applications

认识
DApps(Decentralized Applications,去中心化应用)是基于区块链技术开发的应用程序,其核心特点是开源、去中心化、由智能合约驱动,且数据存储在公开的区块链网络上。与传统的App(如微信、支付宝)不同,DApps不依赖中心化服务器,而是通过节点网络运行,确保透明性和抗审查性。
DApps 代表了Web3的核心愿景——将控制权从巨头公司交还给用户。尽管目前存在性能、门槛等问题,但随着Layer2扩容、钱包体验优化和监管框架完善,未来可能重塑社交、金融、游戏等行业的底层逻辑。对于普通用户,建议从主流DeFi或链游开始尝试,逐步理解去中心化世界的规则。
构造
## 如何体验 DApps?

安装钱包:
– 推荐MetaMask(浏览器插件)或Trust Wallet(手机端)。

获取代币:
– 通过交易所购买ETH、SOL等公链代币用于支付Gas费。

访问DApp:
– 直接在浏览器输入DApp网址(如
https://app.uniswap.org 等等,通过钱包连接交互。

⚠️ 安全提示: – 仅使用官方链接,警惕钓鱼网站。 – 小额测试后再进行大额操作。
## DApps 的主要类型
### 1. DeFi 应用(去中心化金融) – 提供借贷、交易、理财等金融服务,无需银行介入。 – 代表项目:

– Uniswap(DEX去中心化交易所)
– Aave(借贷协议)
– Compound(算法利率借贷)

### 2. GameFi(链游) – 玩家通过游戏赚取加密货币或NFT,资产真正归用户所有。 – 代表项目:

– Axie Infinity(宠物战斗+经济系统)
– StepN(运动赚取代币)
– The Sandbox(虚拟土地NFT游戏)

### 3. NFT 平台 – 发行、交易数字艺术品或收藏品,所有权链上确权。 – 代表项目:

– OpenSea(最大的NFT市场)
– Blur(专业交易者平台)
– Rarible(社区驱动的NFT交易所)

### 4. 社交与内容平台 – 用户掌控数据,通过代币激励创作和互动。 – 代表项目:

– Lens Protocol(去中心化社交图谱)
– Mirror.xyz(Web3博客平台,内容上链)

### 5. 去中心化存储与计算 – 替代AWS、Google Cloud等中心化云服务。 – 代表项目:

– Fileco[……]

READ MORE

「Mnemonic Phrase」* 助记词 | 区块链 | 钱包

认识
在区块链钱包中,助记词(Mnemonic Phrase)是用于生成和管理加密货币钱包私钥的一组易于记忆的单词(通常为 12、18、24 个单词),它是用户恢复和控制资产的核心凭证。
助记词是区块链钱包的“终极控制权凭证”,其设计平衡了安全性与易用性。用户必须像保护现金一样保护助记词,理解“Not your keys, not your crypto”(非掌控私钥,即非真正拥有资产)这一核心理念。
组成
助记词的本质

私钥的“人类友好”形式:私钥是一长串难以记忆的随机字符,而助记词通过特定算法(如 BIP-39 标准)将私钥转换为一系列按固定顺序排列的单词,方便用户备份。
标准化生成:遵循行业标准(如 BIP-32/BIP-39/BIP-44),确保不同钱包之间的兼容性。例如,MetaMask 和 Ledger 生成的助记词可以互相导入。

构建

典型助记词:`army forest chaos plastic cup remember alert mix gas frown vibrant orbit`
恢复流程:在新钱包选择“导入助记词”,输入上述单词即可访问原地址和资产。

Q:不同钱包提供的助记词是否可以相互导入? A:是的,不同钱包提供的助记词通常可以相互导入,但需要满足以下关键条件:

遵循同一标准:多数主流钱包(如 MetaMask、Ledger、Trust Wallet、Trezor 等)均支持 BIP-39(助记词生成标准)和 BIP-44/BIP-32(层级确定性钱包标准),因此助记词可跨钱包通用。
单词列表一致:BIP-39 定义的 2048 个英文单词库是通用的,只要助记词来自该列表,即可被其他钱包识别。
R:DeepSeek / 不同钱包提供的助记词是否可以相互导入

助记词的安全性

不可逆性:通过密码学哈希函数生成,无法从助记词反向推导出私钥(除非暴力破解)。
唯一性:助记词的组合空间极大(12 个单词的组合数约为 2^128),几乎不可能被暴力猜解。
单点故障:一旦泄露或丢失,资产将永久丢失或被盗,因此必须离线存储(如手写纸上,禁用截屏)。

使用注意事项

离线备份:切勿通过网络传输(如邮件、云存储),建议手写并存放在防火防水的安全位置。
防钓鱼:任何索要助记词的网站或客服均为诈骗,正规钱包不会要求提供助记词。
验证顺序:导入助记词时需确保单词顺序完全正确(包括拼写和空格)。

性质
助记词的核心作用

钱包恢复:助记词可以推导出所有关联的私钥和地址。即使设备丢失或损坏,只需输入助记词即可恢复[……]

READ MORE

「REGISTRY-MIRROR」- 模块交互原理

提高镜像拉取速度
在 Docker 中,通过配置 Docker Daemon 的镜像源地址,可以使用 Registry Mirror 来代替 Docker Hub 进行镜像的拉取操作。
问题描述
我们的应用场景如下所述: 1)User 需要将 Kubernetes 使用的镜像拉取并同步到 Harbor (Private) 中; 2)我们的 CI 也会将构建的镜像保存到 Harbor (Private) 中,以供集群使用; 3)然后,Kubernetes 从 Harbor (Private) 拉取其使用的镜像(极少直接从公开仓库中拉取镜像);
问题在于 Cloud ⇒ LAN 的带宽,其为直接的制约因素,带宽制约我们镜像的拉取速度;
解决方案
所以,在 LAN 中,我们部署 Registry Mirror 服务,来提高镜像拉取速度。

我们的使用方式如下:
1)Registry Mirror 没有直接配置在 containerd 中,所以集群拉取镜像并不会通过 Registry Mirror 来缓存;
2)针对业务镜像(指应用程序使用的镜像),Kubernetes 直接访问 Harbor (Private) 进行拉取。原因在于:

很多镜像是私有的,需要帐号信息才能拉取。如果通过 Registry Mirror 拉取并缓存,则需要在 Registry Mirror 中配置相关凭着。以此带来的另个问题是,Kubernetes 拉取镜像时就不需要配置密码,这会导致不一致的使用体验。

另外,业务镜像是经常变动(更新)的,所以使用 Registry Mirror 镜像缓存的意义不大。

3)针对基础镜像(指集群组件使用的镜像),显式使用 Registry Mirror 来拉取;
国外镜像缓存策略
方案一、路径压缩
我们使用个人版来存储镜像:

新建命名空间,新建镜像仓库,所有镜像以 Tag 的方式保存到仓库中。
针对未查询到的镜像,我们不妨一试,例如 registry.cn-hangzhou.aliyuncs.com/rancher/shell:v0.3.1

限制:

部分镜像仓库存在最大 Tag 数量限制;

方案二、路径扁平
registry.k8s.io/external-dns/external-dns:v0.16.1 ⇒ ccr.ccs.tencentyun.com/d3rm-3rd/registry.k8s.io_external-dns_external-dns:v0.16.1
限制:

镜像仓库默认私有,需要针对多[……]

READ MORE

「Smart Contract」- 智能合约

认识
智能合约(Smart Contract)是一种运行在区块链上的自动化程序,能够在满足预设条件时自动执行特定操作(如转账、交易、数据更新等)。它由代码编写,无需人工干预,且一旦部署到区块链上便不可篡改,确保执行的透明性和可信度。
智能合约是区块链技术的革命性创新,通过代码替代传统合同和中介,广泛应用于金融、游戏、供应链等领域。尽管存在安全性和法律挑战,但随着开发工具的完善和跨链技术的发展,未来可能成为数字经济的基础设施。对于普通用户,理解智能合约的逻辑有助于安全参与 DeFi 或 NFT;对于开发者,掌握智能合约编程将是 Web3 时代的核心技能之一。
构建
## 智能合约的运作原理

编写代码
– 开发者用编程语言(如 Solidity、Rust)编写合约逻辑(例如:“如果用户 A 支付 1 ETH,则转让 NFT 给 A”)。

部署到区块链
– 合约通过交易上传至区块链(如以太坊),并生成一个合约地址。

用户交互
– 用户调用合约功能(如转账、借贷),支付 Gas 费后由矿工 / 验证者执行。

自动执行
– 区块链节点验证条件是否满足,若满足则自动完成操作(如发放贷款、结算交易)。

示例: – 去中心化交易所(DEX):用户发起交易请求→智能合约自动匹配买卖双方并完成资产交换。 – 借贷协议:用户抵押 ETH→合约按抵押率发放 DAI→若抵押不足则自动清算。
## 如何学习开发智能合约?

学习编程语言:
– Solidity(以太坊首选)、Rust(Solana、Polkadot)。

开发工具:
– Remix(在线 IDE)、Hardhat(本地测试框架)。

测试与部署:
– 使用测试网(如 Goerli)练习,再部署至主网。

推荐资源: – 官方文档:[Solidity](https://docs.soliditylang.org/) – 免费课程:[CryptoZombies](https://cryptozombies.io/)(互动式学习)
性质
核心特点: – 去中心化执行:不依赖银行、法院等第三方机构。 – 不可篡改:部署后代码无法被修改(除非协议本身支持升级)。 – 透明可验证:所有合约代码和交易记录公开在区块链上。 – 自动触发:满足条件时立即执行(如“到期付款”或“价格达标时交易”)。
优势 – 去信任化:无需依赖中介,减少欺诈风险。 – 效率高:自动执行,避免人工流程延迟(如银行转账需 1-3 天)。 – 低成本:省去中间商费用(如房产交易中的律师费)。
风险与挑战 – 代码漏洞:一旦部署[……]

READ MORE

「Node.js」- puppeteer

下载 puppeteer 特别慢
puppeteer 下载慢 – 张永峰 z – 博客园 Yarn add hangs building fresh packages for Puppeteer · Issue #6663 · yarnpkg/yarn
下面的答案,可能是有效的,但是没有解决我们的问题:

npm config set \
PUPPETEER_DOWNLOAD_HOST=https://npm.taobao.org/mirrors
npm install –save puppeteer

我们的问题仍然是由于网络原因导致,需要配置网络加速才可以正常使用(参考 Yarn 笔记);[……]

READ MORE

「strongSwan」- Open-source, modular and portable IPsec-based VPN solution

认识
官网:https://www.strongswan.org/ 文档:https://www.strongswan.org/documentation.html ⇒ https://docs.strongswan.org/docs/latest/index.html 仓库:https://github.com/strongswan
strongSwan is a comprehensive implementation of the Internet Key Exchange (IKE) protocols that allows securing IP traffic in policy- and route-based IPsec scenarios from simple to very complex. The strongSwan source code is licensed under the GPLv2 with commercial licensing options available. 简而言之,我们能够 strongSwan 来提供 IPSec VPN 服务。
组成
VPN 使用 Linux Kernel 的原生 IPsecStack 实现。
配置文件
WIP
性质
支持 IKEv1、IKEv2 协议。
应用
L2TP over IPSec
通过 strongSwan + xl2tpd 搭建
环境描述:CentOS 7.3;strongSwan x86_64 5.7.1;xl2tpd x86_64 1.3.8; WIP 通过 strongSwan + xl2tpd 搭建 L2TP over IPSec 服务;
IPsec/L2TP VPN Strongswan Site-Site on Debian 8 站点到站点直接的 VPN 连接
L2TP/IPSec 配置教程 使用脚本配置 VPN
ipsec.conf – IPsec 的配置和连接
配置文件描述
可选的 ipsec.conf 文件指定了 strongSwan IPsec 子系统的大多数配置和控制信息。主要的例外是身份验证的机密;见 ipsec.secrets(5)。其内容不是安全敏感的。
该文件是一个文本文件,由一个或多个部分组成。空格后跟“#”后跟任何到行末尾是注释,而被忽略,空行不包含在部分内。
包含 include 和文件名的行(由空格分隔)将替换为该文件的内容。如果文件名不是完整路径名,则认为它与包含包含文件的目录相关。这种包含可以嵌套。可能只提供一个文件名,它可能不包含空格,但它可能包含 shell 通配符(参见 sh(1));例如:[……]

READ MORE

「Nexus」- 常见问题处理

应用
场景方案 | Solutions to Scenarios nexus 搭建 maven 私服 | https://www.cnblogs.com/exmyth/p/5693153.html As a Helm Repositories | https://help.sonatype.com/en/helm-repositories.html
上传制品到仓库
How to manually deploy artifacts in Nexus Repository Manager OSS 3 Guide to deploying 3rd party JARs to remote repository Maven Deploy to Nexus How can I programmatically upload files into Nexus 3?
Node.js,Unable to authenticate, need: BASIC realm=”Sonatype Nexus Repository Manager”
nexus部署之后,npm包publish 报401问题。 nexus – Unable to publish to an NPM Registry (local) – Stack Overflow

Maven | Hosted, Group, Proxy
DeepSeek / nexus 仓库中 Type group hosted 的区别
# Nexus 仓库类型详解:group、hosted 和 proxy
在 Nexus 仓库管理器中,有三种主要的仓库类型:group(组)、hosted(托管)和 proxy(代理)。理解它们的区别对于合理配置 Maven 仓库至关重要。
## 1. 仓库类型对比

类型
用途
是否存储构件
是否访问远程
典型示例

hosted
存储内部发布的构件


公司内部发布的jar包

proxy
代理远程仓库
可缓存

代理Maven中央仓库

group
聚合多个仓库为一个统一访问入口


组合公司内部和公共仓库的组

## 2. 详细解释
### 2.1 Hosted 仓库(托管仓库)
特点: – 用于存储自己团队或公司内部开发的构件 – Nexus 服务器物理存储这些构件 – 不可配[……]

READ MORE

「Jenkins Pipeline」- 常见错误 | 改进 | 问题

场景 | 我们的自动化构建流程 | 实践经验
开发提交代码到代码服务器(GitHub Gitlab BitBucket) 代码服务器通过 WebHook 触发 CI/CD(Codeship、Shippable、CircleCI、Jenkins) CI 服务拉去最新的代码,构建 Docker 镜像,进行测试 自动集成测试完成后,将镜像推送到私有的 Registry 运维使用最新的 Docker 镜像进行部署
流水线模型
相关链接: https://www.56dagong.com/info-6945.html
第一版

调试信息()、代码检查()、环境搭建()、创建应用()、应用发布()、执行测试()

现存问题:该阶段的主要问题是Pipeline脚本结构混乱、命名不规范、硬编码

第二版

调试信息()、代码检查()、环境搭建()、创建应用()、应用发布()、执行测试()

工作任务:优化Pipeline脚本

#2 在共享库里中,函数调用 println 无效(即在 Console Ouput 中没有输出)
println in “call” method of “vars/foo.groovy” works, but not in method in class printlns in shared library vars classes are ignored
#1 NotSerializableException GitChangeSetList
Error with changeSet in jenkins pipeline (Error:java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList)
(Error:java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList)
Jenkins 可以保存中间执行,但是要求能够序列化。但是原始构建无法被序列化。
所以需要在函数上添加 @NonCPS 注解,形如:

@NonCPS
def showChangeLogs() {
def changeLogSets = currentBuild.rawBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for[……]

READ MORE

「IAM」- 认证协议

现存在许多网络认证协议,适用于不同场景(如局域网、无线网络、远程访问等)。
## 一、基于密码的认证协议
### 1. PAP(Password Authentication Protocol) – 特点:明文传输密码,安全性低。 – 用途:旧式 PPP 拨号认证(现基本被淘汰)。 – 安全性:❌ 无加密,易被窃听。
### 2. CHAP(Challenge-Handshake Authentication Protocol) – 特点:使用挑战-响应机制,避免明文传输密码。 – 用途:PPP、PPPoE(如宽带拨号)。 – 安全性:✅ 比 PAP 安全,但仍可能被暴力破解。
### 3. MS-CHAP / MS-CHAPv2(Microsoft CHAP) – 特点:微软改进版 CHAP,支持双向认证。 – 用途:Windows VPN(如 PPTP)、企业网络。 – 安全性:⚠️ MS-CHAPv1 已不安全,v2 仍可用但推荐替换。

## 二、基于证书 / 公钥的认证协议
### 4. EAP-TLS(Extensible Authentication Protocol – Transport Layer Security) – 特点:双向证书认证,安全性极高。 – 用途:企业 Wi-Fi(WPA2/3-Enterprise)、VPN。 – 安全性:✅ 最安全的 EAP 方法之一,但需 PKI 支持。
### 5. IEEE 802.1X – 特点:不是独立协议,而是基于 EAP 的端口访问控制框架。 – 用途:企业有线 / 无线网络准入控制(如 Cisco ISE)。 – 依赖协议:通常结合 EAP(如 PEAP、TLS)使用。

## 三、基于令牌 /OTP 的认证协议
### 6. RADIUS(Remote Authentication Dial-In User Service) – 特点:集中式认证服务器,支持多种认证方式(PAP/CHAP/EAP 等)。 – 用途:企业网络、Wi-Fi、VPN 认证。 – 扩展:常用 FreeRADIUS 或 Microsoft NPS 实现。
### 7. TACACS+(Terminal Access Controller Access Control System Plus) – 特点:Cisco 开发,比 RADIUS 更精细的权限控制。 – 用途:网络设备(路由器、交换机)管理认证。 – 对比 RADIUS:

– RADIUS 使用 UDP,TACACS+ 使用 TCP。
– TACACS+ 支持命令级授权,适合管理员访问控制。

### 8. OAuth 2[……]

READ MORE

「Kubernetes」- kube-proxy,常用维护操作

查看 kube-proxy 的当前模式
Enable IPVS in Kubernetes kubeadm – Enable IPVS Mode in Kube Proxy on a ready Kubernetes Local Cluster – Stack Overflow

// 查看模式:通过 configmap 文件

# kubectl get configmaps kube-proxy -n kube-system -o yaml | grep mode
mode: “ipvs” # 如果为空,则为 iptables 模式

// 查看模式:通过配置文件

# kubectl exec -n kube-system -it “<dsname>” — cat /var/lib/kube-proxy/config.conf

# kubectl exec -n kube-system -it kube-proxy-952qm — cat /var/lib/kube-proxy/config.conf

mode: mode: “ipvs”

// 查看模式:通过 kube-proxy 日志


W0322 08:09:44.312816 1 server_others.go:578] Unknown proxy mode “”, assuming iptables proxy
I0322 08:09:44.313052 1 server_others.go:185] Using iptables Proxier.

修改 kube-proxy 的运行模式
How to set kube-proxy settings using kubectl on AKS
如果要修改配置文件,使用命令:

# kubectl edit configmap kube-proxy -n kube-system

mode: ipvs

# kubectl delete po -n kube-system <pod-name>
# kubectl delete -n kube-system pods -l k8s-app=kube-proxy

# kubectl logs <kube-proxy pod> | grep “Using ipvs Proxier”[……]

READ MORE

「KUBERNETES/COREDNS」- 常见问题处理

CoreDNS 是一个可扩展的开源 DNS 服务器,旨在用于 Kubernetes 集群中的服务发现和服务通信。它可以作为 Kubernetes 中的默认 DNS 服务器,用于解析集群中的服务和 Pod 的 IP 地址。CoreDNS 支持插件式架构,可以通过插件实现自定义功能,例如缓存、负载均衡、DNSSEC、远程查询等;
与传统的 DNS 服务器不同,CoreDNS 将 DNS 视为一个通用的服务发现和命名系统,可以与各种后端数据源集成,例如 etcd、Consul、Kubernetes API、文件系统等。这使得 CoreDNS 可以作为通用的服务发现和命名系统,不仅仅是 Kubernetes 中的 DNS 服务器;
CoreDNS 还支持 DNS-over-TLS 和 DNS-over-HTTPS,这使得它可以提供更安全和私密的 DNS 查询服务。除此之外,CoreDNS 还支持 DNS64、EDNS0、DNS 长包、DNS 策略等高级功能,使得它可以满足各种复杂的 DNS 需求;
常见问题处理
日志等级:log

. {
log example.org {
class denial
}
}[……]

READ MORE