「Apache Groovy」- 常用 YAML 操作

该笔记将记录:在 Apache Groovy 中,常用 YAML 操作,以及相关问题处理方法;
SnakeYAML for Groovy 2.4.21
Parsing YAML with SnakeYAML | Baeldung

@Grab(group=’org.yaml’, module=’snakeyaml’, version=’1.33′)
import org.yaml.snakeyaml.Yaml

def yaml = new Yaml()
def inputStream = new FileInputStream(“example.yaml”)
def data = yaml.load(inputStream)

println(data.person.name)
println(data.person.age)

Loading Multiple Documents

public void whenLoadMultipleYAMLDocuments_thenLoadCorrectJavaObjects() {
Yaml yaml = new Yaml(new Constructor(Customer.class, new LoaderOptions()));
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream(“yaml/customers.yaml”);

int count = 0;
for (Object object : yaml.loadAll(inputStream)) {
count++;
assertTrue(object instanceof Customer);
}
assertEquals(2,count);
}

YamlSlurper for Groovy 3.0

import groovy.yaml.YamlSlurper

def ys = new YamlSlurper()
def yaml = ys.parseText(yamlString)

assert ‘groovy’ == yaml.language
assert ‘required’ == yaml.sudo
assert ‘trusty’ == yaml.dist
assert [‘openjdk10’, ‘oraclejdk9’, ‘oraclejdk8’] == yaml.matrix.include.jdk
assert [‘unset _JAVA_OPTIONS’] == yaml.be[……]

READ MORE

「APACHE-GROOVY」- 相关工具 | 常用工具 | Toolchain

groovy-eclipse | Eclipse Groovy Development Tools
文档:https://github.com/groovy/groovy-eclipse/wiki
项目:https://github.com/groovy/groovy-eclipse
This project provides Eclipse and Maven tooling support for the Apache Groovy programming language.
通过该项目,其能够让 Eclipse 及 Maven 支持 Apache Groovy 语言。
for Eclipse
https://github.com/groovy/groovy-eclipse/wiki#how-to-install
for Maven
通过该项目,其使我们能够在 Maven 中同时编译 Groovy 与 Java 代码。
Groovy-Eclipse provides a compiler adapter plugin for Maven, making it is possible to co-locate and compile your Groovy and Java sources using the Groovy-Eclipse batch compiler.

The Compiler | groovy-eclipse-batch
https://groovy.jfrog.io/ui/native/plugins-release-local/org/codehaus/groovy/groovy-eclipse-batch

The Adapter | groovy-eclipse-compiler
https://groovy.jfrog.io/ui/native/plugins-release-local/org/codehaus/groovy/groovy-eclipse-compiler

The maven-compiler-plugin does not actually compile, but rather delegates the compilation to a different artifact (in our case, the groovy-eclipse-batch artifact).
The groovy-eclipse-compiler recognizes most <configuration> elements supported by the maven-compiler-plugin. The groovy-ecli[……]

READ MORE

「Apache Groovy」- 运行 Shell 命令

问题描述
在 Groovy 中,我们需要运行 Shell 命令,尤其将其当作脚本使用并配合 Git 命令时(我们知道有 JGit 类库,但是远不及命令方便,或许是我们的需求比较简单,或许是我们不愿意去研究新的事物)。
总之,我们需要在 Groovy 中调用 Shell 命令。
该笔记将记录:在 Groovy 中,如何执行 Shell 命令,以及常见操作、注意事项。
解决方案
执行命令,并获取输出:

String result = “ls -lt “.execute().text
println result.toUpperCase()

执行命令,并设置超时时间:

def resultado = new StringBuilder()
def error = new StringBuilder()

def comando = “ls -lt”.execute() //(2)
comando.consumeProcessOutput(resultado, error) //(3)
comando.waitForOrKill(1000) //(4)

if (!error.toString().equals(“”)) //(5)
println “error: ${error.toString()}”
}

常见问题汇总
如果命令参数中包含空格(空白字符)

def cmdOutput = [‘ls’, ‘/tmp/folder with spaces’].execute().text

参考文献
Execute commandsgroovy execute with parameters containing spaces – Stack Overflow[……]

READ MORE

「CONTAINERIZATION-TECHNOLOGY」- Kubernetes | 容器编排 | KUBERNETES

认识
Kubernetes,容器编排平台,用于容器集群的自动化部署、扩容、运维的开源平台;
解决大规模容器编排的问题。在微服务场景下,容器数量会非常多,怎么管理和关联相关的容器就是巨大的问题。从而引出多种运维、持续集成、编排等需求;
针对业务问题的解决方案。它是在软件开发过程中,针对容器管理、调度、监控的平台,是软件开发的一部分;
Kubernetes 是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它提供了一个强大的容器编排系统,可以帮助开发人员和运维团队更好地管理容器化应用程序;
Kubernetes 可以在多个主机上运行和管理容器,它可以自动化容器的部署、伸缩和故障恢复,并提供了一些高级功能,如负载均衡、服务发现和存储编排等。Kubernetes 采用了声明式的配置方式,通过使用标准化的 API 进行管理,使得应用程序的部署和管理变得简单和可靠;
Kubernetes 具有高度可扩展性和灵活性,可以运行在各种云平台、物理服务器和虚拟机上。它还提供了丰富的插件和工具生态系统,可以与其他开源项目和服务进行集成,如 Prometheus、Elasticsearch 等;
总之,Kubernetes 是一个功能强大的容器编排平台,可以帮助开发人员和运维团队更好地管理容器化应用程序,提高应用程序的可靠性和可扩展性。
官网:https://kubernetes.io/
文档:https://kubernetes.io/docs/home/
仓库:https://github.com/kubernetes/kubernetes
组成
在 Kubernetes 中,的各个组件及其作用;
下图源自官方文档:
Kubernetes Control Plane
etcd
分布式高可用键值存储,集群持久化组件。存储每个节点会用到的配置信息,包含敏感信息;
该组件只能被 API Server 访问;
Q:为什么 Kubernetes 选择 etcd 作为存储:?
A:Kubernetes Book/How Does Kubernetes Use etcd?;TechTarget/How does Kubernetes use etcd?
API Server(kube-apiserver)
使用 API 提供集群中所有操作,即集群所有操作通过 API 接口实现,所有组件均与 API Server 交互;
Scheduler(kube-scheduler)
在主节点中关键组件,负责分发工作负载。换句话说,它负责将 POD 分配到可用节点;
Static Pods
所谓静态 Pod,是指由 kubelet 直接管理的 Pod 实例;
Kubernetes Worker Node
kubelet
主要[……]

READ MORE

「OPERATING-SYSTEM」- 操作系统 | Operating System

该部分笔记:侧重于操作系统原理,涉及较少操作,操作偏向于验证原理;
虽然我们的工作以维护应用服务为主(例如 DB、Webserver、MQ、Java Web 等等环境),但是操作系统的使用却是基本功。例如,我们必须了解如何在系统中如何配置网络,每个发行版的配置方法都有所出入;我们也必须了解如何配置磁盘,以对数据盘进行扩容;我们还必须了解进程管理的方法,以处理服务的极端情况。这些都是使用操作系统的基本知识,只有掌握这些知识,才能在此之上流畅的进行服务管理;
鉴于此,该部分笔记更加偏向于操作系统的日常维护,比如网络配置、日志管理、存储管理、数据备份(操作系统层面)、进程管理等等。且偏向于操作系统在终端环境(multi-user.target)下的使用与维护(是在操作系统启动之后需要进行的工作);
该笔记将记录:与操作系统维护相关的内容(比如,网络配置、日志管理、数据备份(操作系统层面)、进程管理等等),以及常用配置场景、相关问题的处理方法;
认识
WIP
组成
《操作系统原理》
核心组成
内核核心功能(进程、内存、设备管理,系统调用)。
进程管理进程调度、同步、通信。
内存管理内存分配、虚拟内存、地址转换。
文件系统文件存储、目录管理、权限控制。
设备管理驱动管理、I/O 调度、即插即用。
安全模块认证、权限控制、加密。
网络模块协议支持、资源共享、网络安全。
系统调用接口
系统调用接口是应用程序访问操作系统服务的入口,提供 API(应用程序接口)和 ABI(应用二进制接口)规范。应用程序通过系统调用请求操作系统服务,如文件操作、进程管理和网络通信。
系统工具和软件库
这些组件为操作系统提供基本功能,包括:

‌工具软件‌:如任务管理器、磁盘清理程序等,用于系统维护和优化。
‌软件库‌:如编译器和程序库,支持应用程序开发和运行。

用户交互接口
用户接口是用户与操作系统交互的桥梁,主要包括:

‌图形用户界面 (GUI)‌:通过可视化方式与用户交互,如 Windows 的桌面环境。
‌命令行界面 (CLI)‌:通过文本命令与系统交互,如 Linux 的 Shell。

附加服务
现代操作系统通常还包括一些附加软件,如:

‌常用应用程序‌:如日历、计算器、浏览器等。
‌实用程序‌:如杀毒软件、防火墙等,用于系统安全和维护。

应用服务
针对特定场景,现代操作系统通常附带特定应用:

路由器操作系统,其附带网络相关的服务;
防火墙操作系统,其附带网络安全相关的服务;
存储操作系统,其附带很多存储相关的软件及服务;

构建
WIP
性质
—— 该部分将介绍:我们拥有操作系统之后,能够使用操作系统完成的工作或解决的问[……]

READ MORE

「procps」-

软件包名
procps,https://gitlab.com/procps-ng/procps
功能描述
包含系列用于监控系统进程的程序。
命令列表
free | 报告当前系统中的内存剩余及使用情况(既有物理内存也有交换内存)。
kill
pidof | 找到某个正在运行的程序的PID。
pkill、pgrep | 基于进程名称和进程的其他属性来查找进程(pgrep),或者来向进程发送信号(pkill)。命令pkill为指向pgrep的软链接。
pmap | 报告指定进程的内存映射。
ps
列出当前正在运行的进程。
pwdx
打印某个进程当前的工作目录。
skill
slabtop
实时显示内核的slap缓存的详细信息。
snice
sysctl
在运行时,修改Kernel参数。
tload
以图形的方式打印当前系统负载的平均值。
top
实时显示进程信息及系统资源使用情况。
uptime
报告系统运行的时长、登录的用户数、系统负载平均值。
vmstat
报告虚拟内存的统计信息,给出进程、内存、页、块IO、traps、CPU活动的信息。
w
显示系统中当前登录的用户,以及这些用户正在执行的命令。
watch
重复执行某个命令,全屏显示其输出。可用来实时监控变化。
参考文献

LFS/Procps-ng[……]

READ MORE

「Groovy」- Metaprogramming

问题描述
该笔记将记录:在 Apache Groovy 中,与元编程相关内容,以及常见问题的处理方法。
解决方案
Metaprogramming
为对象添加新属性及方法

class Foo {}

f = new Foo()

f.metaClass.unVariable = “something”
assert f.hasProperty(“unVariable”) == true
assert f.unVariable == “something”

f.metaClass.unMethod = { println “Hello World.” }
assert f.unMethod() == “Hello World.”

invokeMethod
在方法调用前,如果实现 invokeMethod() 方法,将调用该方法:

class MyClass implements GroovyInterceptable {

def invokeMethod(String name, args) {
System.out.println(“This method is called method $name”)
def metaMethod = metaClass.getMetaMethod(name, args)
metaMethod.invoke(this, args)
}

def myMethod() {
“Hi!”
}
}

def instance = new MyClass()
instance.myMethod()

或者,通过 metaClass 实现:

Integer.metaClass.invokeMethod = { String name, args ->
println(“This method is called method $name”)
def metaMethod = delegate.metaClass.getMetaMethod(name, args)
metaMethod.invoke(delegate, args)
}

1.toString()

参考文献
How to verify if an object has certain property?Dynamically add a property or method to an object in groovyThe Apache Groovy programming language – Runtime and compile-time metaprogrammingrefle[……]

READ MORE

「KUBERNETES-INGRESS-CONTROLLER」- Traefik Ingress Controller

认识
该笔记将记录:在 Kubernetes 中,与 Traefik Ingress Controller 相关的安装、使用、配置、管理,及常见问题解决方案。
构建
参考 Traefik/Kubernetes Ingress Controller 文档,足以完成 Traefik Ingress Controller 的部署
系统环境
CentOS Linux release 7.5.1804 (Core)
Kubernetes v1.14.0, Docker version 19.03.2, build 6a30dfc, Helm v3.0.0-beta.3
在云环境中,部署 Traefik Ingress Controller 组件
这里的云环境是指阿里云,其他的云环境也是类似的。
# kubectl apply -f ./01-traefik-rbac-v1.7.yaml
# kubectl apply -f ./02-traefik-deployment-v1.7.yaml
使用云环境的优势是:当 Service 为 LoadBalancer 时,会自动创建负载均衡,并在公网监听 80 443 端口。而使用自建集群,则需要进行特殊处理。
在自建集群中,部署 Traefik Ingress Controller 组件
在集群中,如果未部署 LB 组件(MetaLB、OpenELB),则需要进行特殊处理:
1)修改 hostNetwork: true,使 Pod 监听节点的 80 443 端口;
2)通过使用 nodeSelector 选择节点,使 Pod 固定调度在某个节点上;
3)此时,不再需要部署 Service 来映射端口;
如果有其他类型的负载均衡,则能够通过 Service NodePort 来监听端口,然后再通过负载均衡转发到该端口上。
在集群中,如果部署 MetaLB、OpenLB 等组件,则能够向云环境那样,定义 Service 为 LoadBalacher 类型;
访问验证
定义 Deploymnent、Service、Ingress 资源:

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: web
namespace: default
labels:
run: web
spec:
replicas: 1
selector:
matchLabels:
run: web
template:
metadata:
creationTimestamp: null
labels:
run: web[……]

READ MORE

「MMSEG」- A Word Identification System for Mandarin Chinese Text

这篇文章的内容并不完善,只是临时做一个笔记。对于我个人而言,最重要的两部分是「创建词典文件并测试」与「关于 unigram.txt 文件的格式」;
MMSEG 是什么?
参考 MMSEG 主页:http://technology.chtsai.org/mmseg
MMSEG 安装
Sphinx 中文分词 Coreseek+Mmseg 安装配置和示例:https://blog.csdn.net/l1028386804/article/details/48897589
创建词典文件并测试
执行下面文件创建二进制的词典文件(关于 unigram.txt 文件的格式参考后面的部分):

# mmseg -u unigram.txt

该命令会生成 unigram.txt.uni 文件。将该文件重命名为 uni.lib 文件;
执行下面命令检查词典:

# echo “金交所” > whatever.txt
# mmseg -d /usr/local/mmseg3/etc whatever.txt

如果字典文件里包含了”金交所“,那会产生类似如下的输出:

金交所 /x

Word Splite took: 0 ms.

如果字典中没有”金交所“这个词,则会产生如下的输出:

金 /x 交 /x 所 /x

Word Splite took: 0 ms.

输出中显示整个词语被拆分成单字;
关于 unigram.txt 文件的格式
以下的内容摘自 unigram.txt 文件:

阿宝 1
x:1
阿西吧 1
x:1
阿华 1
x:1

注意,中文与后面的数字 1 之间是一个制表符(ASCII TAB),一定不能为空格。使用下面的 PHP 脚本 words2mmseg.php 可以生成 unigram.txt 文件:

<?php
$sourcefile = null;
$targetfile = null;
$options = getopt(“s:o:”);

if (!isset($options[‘s’])) {
$sourcefile = “words.txt”;
} else {
$sourcefile = $options[‘s’];
}

if (!isset($options[‘o’])) {
$targetfile = “mmseg-dict.txt”;
} else {
$targetfile = $options[‘o’];
}

convert_file($sourcefile, $targetfile);

functio[……]

READ MORE

「HOMELAB/DC-OFFICE」- 接入 DC-OFFICE 网络

# 10/17/2023 我们已实现 DC-OFFICE 接入 DC-HIVE 网络,但是我们遇到部分问题;
多个终端网络无法同时建立 OSPF 邻居,具体情况如下:
1)现有 2 个终端网络,使用 L2TP 协议,通过不同的公网链路连入 DC-HIVE 路由器(Huawei AR 1220E-S),并能够获取到地址(同个 L2TP 隧道);
2)然后,我们在 2 个终端网络中运行 FRR 套件,但是:仅有 1 个 FRR OSPF 能够正常建立(Ubuntu FRR),另外 1 个(pfSense)能收到 OSPF 报文,但是无法建立邻居关系;
3)然后,我们发现 2 个终端网络不能同时在线:如果我们断开 Ubuntu FRR 的 L2TP 连接,则 pfSense 能够成功建立邻居关系;如果我们断开 pfSense 的 L2TP 连接,则 Ubuntu FRR 能够成功建立邻居关系;

依据该现象,我们推测是 DC-HIVE 路由器(Huawei AR 1220E-S)的问题,获取与其内部实现有关系。进而,导致两个 L2TP Client 拨如通个隧道后,Huawei AR1220E-S 无法产生正确的 OSPF 报文;[……]

READ MORE

「KUBERNETES」- 节点管理 | 添加节点 | 删除节点

节点的管理,我们主要是指增加节点、删除节点操作,并不包含其他操作;
该笔记将记录:在 Kubernetes Cluster 中,与节点(Node)有关的操作,如何管理集群节点,以及常见问题处理。
添加节点(增)
第一步、节点准备工作
确保已经对节点进行初始化,比如安装 Docker 环境、配置内核参数、网络预设置等等。
第二步、添加新的节点
添加 Worker 节点:

# 获取 TOKEN 参数
kubeadm token list # 查看已有 TOKEN
kubeadm token create # 创建新的 TOKEN
kubeadm token create –print-join-command # 直接打印 Join 命令

添加 Control Plane 节点:

# 获取 certificate key 参数
kubeadm init phase upload-certs –upload-certs

# 获取加入集群的命令
kubeadm token create –print-join-command –certificate-key “<certificate key>”

# 执行输出的 kubeadm join 命令
kubeadm join …

// —————————————————————————- 如下为废弃的老办法,不建议使用,可能失败

# 在新的主机上执行,该主机会成为主节点加入
kubeadm join 10.10.50.91:6443 –experimental-control-plane \
–token 608cyb.7polfq8iea971x9i \
–discovery-token-ca-cert-hash sha256:8ff3e8899e47a10ee186319a737de85374ea7c4f4cf5276ef3d5b95f66b6ebbe

# 获取 discovery-token-ca-cert-hash 参数
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/nu[……]

READ MORE

「HOMELAB-Z」- 家庭 IT 实验室 | 家庭实验室 | 家庭数据中心 | 家庭网络环境

认识
Homelab(家庭实验室)是种个人或家庭级别的 IT 实验室。其通常由服务器、存储设备、网络设备等组成,这些设备通常在家庭环境中进行部署和管理。它可以扮演一个虚拟化平台、网络存储、邮件服务器、Web 服务器、数据库服务器等各种角色。其被用来学习、测试、实验各种技术和应用。
通过 Homelab 环境,我们能够:

构建自己的解决方案,例如网络、服务器、存储、虚拟化平台等等;
学习和测试技术、软件、硬件,提高个人技能水平,还可为个人职业生涯提供价值(例如,让用户熟悉和掌握企业级技术),这对于找到更好的工作机会也会有帮助;
提供一个安全的环境,供用户测试和学习各种 IT 应用和技术;让用户在自己的电脑上模拟真实的 IT 环境,以便探索和学习新的技术和工具;
避免在真实环境中进行实验和测试所带来的风险和成本,
同时也可以为 IT 专业人士提供一个实践和提高技术的机会;

针对 Homelab 成本:

其成本可以很高,但与通过实际工作环境获得的技术经验相比,它的成本是可以接受的;
其成本通常取决于所选设备的类型和数量,它可以是个简单的基于虚拟机的系统,也可以是个包含多个服务器和存储设备的复杂系统;

无论哪种情况,建立一个 Homelab 需要一定的知识和技能,需要考虑安全、性能、可靠性等方面的问题;
组成
WIP
构建
数据中心:家庭实验室的拓扑结构

性质
应用
我们需要存储多媒体数据数据存储,例如 Video Audio Picture Downloads 等等,所以我们在 Homelab 中增加 NAS 服务,并且通过客户端实现数据同步和数据备份。
我们需要执行很多自动化任务,所以我们在 Homelab 中部署 Jeknins 服务,来实现任务自动化。
参考
什么是家庭实验室 Homelab? —— ChatGTP 4.0[……]

READ MORE

「Groovy」- java.sql.SQLException: Incorrect string value: ‘xxx”,”…’ for column ‘xxx’ at row 1

问题描述
执行 SQL 语句(在语句中包含中文值)时,产生如下错误:

java.sql.SQLException: Incorrect string value: ‘\xE6\x98\xAF”,”…’ for column ‘previous_request’ at row 1

问题原因
字段的编码格式错误,需要我们检查数据库编码,并且要检查数据表字段的编码
解决办法
数据库已经设置为 utf8mb4 编码,并修改字段为 utf8mb4 编码
如果数据是“简单”的 Unicode 字符,可以直接使用 uft8 编码。但是依旧建议使用 utf8mb4 编码,以避免日后出现不必要的麻烦(比如再次调整为 utf8mb4 编码,以存储 emoji 表情,毕竟需求是在增长的)
参考文献
mysql – java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x91\xBD\xF0\x9F…’ – Stack Overflow[……]

READ MORE

「HOMELAB/ARCHITECTURE」- 家庭实验室架构(version 2.1):移除中心路由,充分利用网络资源

问题描述
Transit Router 的带宽限制
当前 Homelab Networking 需要外部的 ECS 来提供 L2TP 服务,ECS 作为中心节点,所有的其他 DC 通过 L2TP 接入该 ECS 实现互联互通;
但是 ECS 作为中心点,其 带宽 成为整个网络环境的限制。并且 ECS 带宽成本较高,所以我们无法随意的调整带宽来提升整个环境的吞吐;
解决方案

L2TP, LNS, LAC
现有环境,我们取消 ECS 云服务器,使用 Huawei Router 作为中心点;
我们通过 L2TP 实现网络互联,DC HIVE 的 Route 作为 L2TP LNS (Server),其他数据中心接入该服务,实现二层互联(还需要 OSPF 配合);
DDNS
我们使用 PPPoE 宽带,所以 IP Address 是变化的。为了方便访问,我们借助 Huawei AR Router 的 DDNS 功能,将 IP Address 映射到 Domain Name,通过固定的 Domain Name 来访问 Homelab 网关;
我们使用 Oray 提供的 DDNS 服务(花生壳,免费版),但是免费的域名并不容易记忆,所以我们创建容易记忆的域名,并通过 CNAME 解析到该域名。[……]

READ MORE

「OpenSSH」- 创建密钥、免密登录(复制公钥到服务器、ssh-agent)

问题描述
通常(在刚接触 Linux 系统时),我们能够通过输入帐号密码来登录服务器(基础操作),后来我们又学会通过密钥实现无密码登录服务器的方法,再后来我们又学会分发公钥的正确方法,再再后来我们有学会使用 ssh-agent 来管理密钥,再再再后来……
掌握的知识越多,问题也越多……我们慢慢开始记录这些相关的问题,这也是该笔记的主要内容。
该笔记将记录:在 Linux 中,创建 SSH 密钥并分发公钥到服务器的方法,以及常见问题处理。
解决方案
第一步、创建密钥
执行 ssh-keygen 命令,然后一路

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:WryBnMpzdq2ISReQ4ZD94a3oJSpy8sDP3RrZqrDSbtw root@macmini
The key’s randomart image is:
+—[RSA 3072]—-+
| .o. |
| .o.o. |
| +o o |
| oo+. |
| .=.S |
|. .o.=+ + |
|.= +===.o . |
|=.@.EB+o . |
|oOo+++o.. |
+—-[SHA256]—–+

密钥文件将保存在 ~/.ssh/ 目录中,id_ras 为公钥,id_rsa.pub 为私钥;
第二步、分发公钥
方法一、手动分发(不推荐)
将 id_ras.pub 文件追加到远程服务器 ~/.ssh/authorized_keys 文件中(或者,写入 authorized_keys2 文件):

cat >> ~/.ssh/authorized_keys2 <<EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDni/qEpL3Q5fPYGSmrr0Oeaq5VgJvDdEtg76wiE1gnhYUAW0CSBM[……]

READ MORE

「OpenSSH」- 通过密码登录

问题
针对安全性要求极低的场景,为了简化操作及管理,我们需要开启 SSH 密码登录;
该笔记将记录:OpenSSH 通过密码登录的方法,以及相关问题的解决办法;
方案
Server,允许 ROOT 登录
How to enable or disable password authentication in SSH

# ——————————————————— # 针对 Ubuntu 发行版

cat > /etc/ssh/sshd_config.d/root-with-pwd.conf <<EOF
PermitRootLogin yes
PasswordAuthentication yes
EOF

systemctl restart sshd.service

# ——————————————————— # 针对 CentOS 发行版

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
cat >> /etc/ssh/sshd_config <<EOF

PermitRootLogin yes
PasswordAuthentication yes
EOF

systemctl restart sshd.service

Client,强制使用密码登录
How to force ssh client to use only password auth? – Unix & Linux Stack Exchange

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no root@example.com

补充
在命令行中,使用 SSH 密码
Send the password through stdin in `ssh-copy-id`

sshpass -p “$TMP_PASS” ssh-copy-id[……]

READ MORE

「OpenSSH」- 命令 ssh 支持的转义序列」

在ssh中,输入[Enter][~][.]这三个键会直接退出当前连接。
由一次断网了,当前终端中的ssh连接不管输入什么都没有响应。由于情况特殊,所以不能直接关闭终端。你可以直接使用kill命令结束ssh连接。也可以使用ssh的转义字符。
当终端里的ssh连接没有响应时,可以依次输入[Enter][~][.],ssh会主动退出。即使终端里的ssh连接由响应,使用该按键序列也可以退出ssh,但是我们通常使用Ctrl + D组合键来退出。
所有的转义字符序列
下面是由ssh支持的转义序列,详细的内容可以查看man手册或者官方文档:

ESCAPE CHARACTERS

When a pseudo-terminal has been requested, ssh supports a number of

functions through the use of an escape character.

A single tilde character can be sent as ~~ or by following the tilde by

a character other than those described below. The escape character

must always follow a newline to be interpreted as special. The escape

character can be changed in configuration files using the EscapeChar

configuration directive or on the command line by the -e option.

The supported escapes (assuming the default ‘~’) are:

~. Disconnect.

~^Z Background ssh.

~# List forwarded connections.

~& Background ssh at logout when waiting for forwarded connection

/ X11 sessions to terminate.

~? Display a list of escape characters.

~B Send a BREAK to the remote system (only useful if the p[……]

READ MORE

「SSH」- SSH Agent

认识
SSH Agent 是一个用于管理 SSH 密钥的程序,它可以帮助用户更安全、更方便地使用 SSH 协议进行认证。
SSH Agent 属于客户端程序,它是 SSH 客户端工具链的一部分,主要用于管理用户的私钥并提供身份认证服务。
SSH Agent 的设计初衷是为本地用户提供便捷的密钥管理,所有操作均在客户端完成,因此属于客户端程序。服务端仅负责验证客户端提供的认证信息,不直接与 Agent 交互。
SSH Agent 是 SSH 工具链中提高安全性和便利性的重要组件,合理使用可以显著改善 SSH 认证体验。
组成
WIP
构造
—— 构造的目的是获得该事物。要么借助现有实现,要么从零开始构建。针对我们的场景,我们选择前者。

大多数完整版 SSH 实现(如 OpenSSH)会提供原生 Agent。
精简版或嵌入式实现(如 Dropbear)通常不包含此功能。
Windows/ 图形工具可能需要额外配置或使用替代方案。

常见实现
不是所有的 SSH 实现都默认提供 SSH Agent 程序,这取决于具体的实现和平台。以下是不同 SSH 实现对 SSH Agent 的支持情况:

OpenSSH (Linux/macOS) | 默认包含 ssh-agent,是使用最广泛的实现
LibreSSH | OpenSSH 的分支,兼容其功能
Dropbear SSH | 轻量级实现,不包含 Agent 功能(但可通过第三方工具如 dropbearkey 补充)
Bitvise SSH (Windows) | 商业实现,提供图形化的 Agent 管理
PuTTY (Windows) | 部分支持 | 提供 Pageant 作为替代 Agent(功能类似但不完全兼容 OpenSSH Agent)

特殊情况

嵌入式系统:

许多嵌入式设备的精简 SSH 实现(如 Dropbear)通常会移除 Agent 功能以节省资源。

Windows 原生支持:

Windows 10/11 的官方 OpenSSH 客户端(可选功能)包含 ssh-agent,但需要手动启用。

图形化工具:

一些 GUI SSH 工具(如 SecureCRT、MobaXterm)会内置自己的 Agent 实现,而非使用系统原生 Agent。

替代方案
如果某个 SSH 实现不提供原生 Agent,可通过以下方式弥补:

第三方 Agent:

Windows: Pageant(PuTTY 配套工具)

跨平台: gpg-agent(GnuPG 提供,可模拟 SSH Agent[……]

READ MORE

「OpenSSH」- 无法通过公钥登录

问题描述
可以通过密码登录 SSH 服务器,但是无法通过公钥登录远程主机。目前,服务配置文件正常(对比过配置文件);也正确分发公钥;相同的操作,对于其他主机也能正常公钥登录。
注意,这个问题的成因由很多,我们这里描述的只是我们遇到的问题。
# 12/04/2019 这是我们第一次遇到这个问题。
# 12/05/2019 不到一天,我们又遇到了这个问题。
解决方案
排查方法
当处理与 OpenSSH 相关问题时,在多数情况下,可以通过增加日志输出来排查问题。
但是,不建议直接调整原服务。因为错误配置导致服务连接主机,除非你有补救方案。
应该,使用其他端口来启动 SSHD 服务(/usr/sbin/sshd -d -p 2222),然后使用 SSH 客户端连接该端口,并在服务端查看日志。
第一种、目录权限错误
问题原因
既然服务配置文件正常,也正确分发公钥,凭借多年的“职业感觉”也能够猜到是目录权限导致无法登录(毕竟常见问题原因就那几个)。但是还是要验证一下,不然怎么知道修改哪个目录呢?
在连接服务器时,使用ssh -vvvv选项,以进入调试模式。在输出中出现ssh receive packet: type 51消息,而连接正常主机返回ssh receive packet: type 60消息。
接下来调试服务端,启动服务时,使用sshd -ddd选项,进入调试模式。在输出中显示Authentication refused: bad ownership or modes for directory /root消息。
问题已经非常清晰,由于目录权限错误而导致无法登录(有时也会提示bad ownership or modes for file /root/.ssh/authorized_keys错误)。因此修改对应目录权限即可。
解决办法

# 修改 root 目录权限:
chmod g-w $HOME

# 修改.ssh 目录权限:
chmod 700 $HOME/.ssh

# 修改 authorized_keys 文件权限:
chmod 600 $HOME/.ssh/authorized_keys

第二种、服务配置错误
问题原因
按照排查方法的描述,使用/usr/sbin/sshd -d -p 2222命令启动服务,然后使用 SSH 客户端连接该端口,并在服务端查看日志。
然后我们看到如下错误:

debug1: trying public key file /etc/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
debug3: secure_filename: checking ‘/etc/.ssh’
debug3: secure_file[……]

READ MORE

「WORDPRESS」- 场景 | 方案 | 解决办法

文章 | 数据
导出所有文章的链接
Export All URLs | https://wordpress.org/plugins/export-all-urls/
Post ⇒ Page
UPDATE `wp_posts` SET `post_type`=’page’ WHERE `post_type`=’post’
显示最近更新的 Page 类型页面:

function include_pages_in_main_query($query) {
if (!is_admin() && $query->is_main_query()) {
// 在首页或博客列表页显示 Posts 和 Pages
if (is_home() || is_archive()) {
$query->set(‘post_type’, array(‘page’)); // 同时查询两种类型
$query->set(‘posts_per_page’, 5); // 控制显示数量
}
}
}
add_action(‘pre_get_posts’, ‘include_pages_in_main_query’);

接口 | API | REST
限制由 REST API 返回的字段数
Specify which fields to return in JSON #446
在 WordPress REST API 中,默认会返回许多字段。某些字段并不是我们需要的,返回这些字段只会消耗网络带宽,降低处理速度。
我们希望能够应藏某些字段,只返回我们需要的字段。
解决办法:进入管理后台,Appearance => Theme Editor => function.php,在文件开始添加如下代码:

add_filter( ‘rest_prepare_post’, ‘m_specify_json_fields’, 12, 3 );
function m_specify_json_fields( $data, $post, $context ) {
return [
‘id’ => $data->data[‘id’],
‘title’ => $data->data[‘title’][‘rendered’],
];
}

收录 | SEO
创建 Sitemap 文件
NT:Se|LO:Other-ASIA-t1&gad_source=1&gclid=Cj0KCQiAlbW-BhCMARIsADnwa[……]

READ MORE

「Telegram」-

https://flathub.org/apps/org.telegram.desktop
flatpak install flathub org.telegram.desktop
flatpak run org.telegram.desktop
应用
下载 Telegram 上的所有视频
DeepSeek / 帮我写一段代码,该代码能够下载 Telegram 上的所有视频
安装 Telethon 库:pip install telethon
获取 API ID 和 API Hash 信息:登录 my.telegram.org 站点,创建一个新的应用程序,获取 API ID 和 API Hash 参数。
编写代码:

from telethon import TelegramClient, events
from telethon.tl.types import InputMessagesFilterVideo
import os

# 替换为你的 API ID 和 API Hash
api_id = ‘YOUR_API_ID’
api_hash = ‘YOUR_API_HASH’

# 替换为你的电话号码
phone_number = ‘YOUR_PHONE_NUMBER’

# 创建一个目录来保存下载的视频
if not os.path.exists(‘downloaded_videos’):
os.makedirs(‘downloaded_videos’)

# 创建 Telegram 客户端
client = TelegramClient(‘session_name’, api_id, api_hash)

async def download_videos():
# 连接到 Telegram
await client.start(phone_number)

# 获取目标聊天(可以是群组、频道或私聊)
target_chat = ‘target_chat_username_or_id’ # 替换为目标聊天的用户名或ID

# 获取聊天实体
entity = await client.get_entity(target_chat)

# 获取所有视频消息
videos = await client.get_messages(entity, filter=InputMessagesFilterVideo)

# 下载视频
for video in videos:
if video.video:
print(f”Downloading video: {video.id}”)[……]

READ MORE

「HUAWEI-ENSP」- 实验学习:MPLS | Static | 静态 MPLS

实验拓扑

需要保证 PC3 与 PC4 网络可达,否则 MPLS 无法生效。我们使用 OSPF 路由协议,来实现网络互通(如下配置将重点关注 MPLS 配置,未体现 OSPF 配置);
实验需求

部署 Static LSP 技术,实现 PC3 与 PC4 互通;

实验过程
配置 MPLS 服务(静态)
AR4:

mpls lsr-id 10.0.45.4
mpls

interface GigabitEthernet0/0/0
ip address 1.1.1.4 255.255.255.0

interface GigabitEthernet0/0/1
ip address 10.0.45.4 255.255.255.0
mpls

static-lsp ingress 4to6 destination 3.3.3.0 24 nexthop 10.0.45.5 out-label 200

AR5:

mpls lsr-id 5.5.5.5
mpls

interface GigabitEthernet0/0/0
ip address 10.0.45.5 255.255.255.0
mpls

interface GigabitEthernet0/0/1
ip address 10.0.56.5 255.255.255.0
mpls

static-lsp transit 4to6 incoming-interface GigabitEthernet0/0/0 in-label 200 nexthop 10.0.56.6 out-label 200

AR6:

mpls lsr-id 6.6.6.6
mpls

interface GigabitEthernet0/0/0
ip address 10.0.56.6 255.255.255.0
mpls

interface GigabitEthernet0/0/1
ip address 3.3.3.6 255.255.255.0

static-lsp egress 4to6 incoming-interface GigabitEthernet0/0/0 in-label 200

测试方法:

[PC3] ping PC4,并进行抓包,理论上仅有能看到 ICMP Request 包含 MPLS Label 信息,而 ICMP Reply 未包含 MPLS Lable 信息;

查看 LSP 信息:

<AR4>display mpls lsp
———————————————————————-[……]

READ MORE

「COMPUSTER-STORAGE」-

存储的操作系统 | Storage Operating Systems
Best Open Source Storage Software for 2022 | ESF77 Open Source Storage Applications – InfostorFreeNAS vs Rockstor – FreeNAS – Open Source Storage Operating System4 Great NAS Solutions for Linux – Make Tech EasierOpen Source Solutions for Building Your Own Storage Area Network and Network Attached StorageOpen Source Storage May Change How Enterprises Code8 Best Free and Open source NAS or SAN software -H2S MediaThe Top 13 Free and Open Source Storage Solutions16 Open Source Cloud Storage Software for Linux in 202010 free storage utilities | Network World
存储操作系统是一种专门用于管理存储设备和存储资源的操作系统。它运行在存储设备(如存储阵列、网络附属存储 – NAS、存储服务器等)之上,提供了对存储资源的高效组织、分配、访问和保护功能。就像是存储设备的 “大脑”,指挥着数据的存储、读取以及存储设备的各种操作。
操作系统
Linux,BSD,Windows,……
存储软件
NFS,iSCSI,MinIO,……
Open Media Vault(based on Debian)
openmediavault – The open network attached storage solutionInstallation — openmediavault 5.x.y documentation
Open Meida Vault,作为存储管理系统。我们能够方便的创建 NFS、SMB、FTP 等等共享。
# 04/06/2021 我们首次安装,下面是我们在初次体验后的直观感受:WIP
XigmaNAS (based on FreeBSD)
XigmaNAS – WikipediaXigmaNAS – XigmaNAS
XigmaNAS is a continuation of the original FreeNAS code, which was developed between 2005 and late 2011[……]

READ MORE

「SYNOLOGY-DSM」- 群辉 NAS 主机

认识
群辉(Synology DiskStation Manager,简称 DSM)是一款由 Synology 开发的 NAS 操作系统。它旨在为个人用户、家庭用户和小型企业提供可靠的数据存储和共享解决方案。简而言之,DSM 是个操作系统,其功能主要与存储相关。
总而言之,群辉是一款功能强大、易于使用的网络附加存储操作系统,为用户提供了可靠的数据存储和共享解决方案。无论是个人用户、家庭用户还是小型企业,都可以从中受益。
组成
WIP
构建
WIP
性质
群辉提供了丰富的功能,包括文件共享、数据备份、远程访问、多媒体服务、虚拟化、云同步和安全性管理等。用户可以通过简单易用的界面进行设置和管理,无需过多的技术知识。
DiskStation Manager (DSM)是网页界面的直觉式操作系统,可帮助用户管理存于 Synology DiskStation 和 RackStation 里的文件、照片、音乐、视频以及其他重要内容。DiskStation Manager 可实现的不仅是存储资料,用户还可以自行设置应用程序与选择所需要的服务,更加地丰富生活并提高工作效率;
群辉的硬件设备具有高性能和可扩展性,可以满足不同用户的需求。用户可以根据自己的存储需求选择不同型号的群辉设备,并根据需要扩展存储容量;
Synology Drive:用于轻松文件管理和安全协作的统一解决方案。能够备份、同步个人电脑上的文件。
Text Editro:文本编辑 | https://www.synology.com/en-us/dsm/packages/TextEditor
应用
WIP
参考
Synology_百度百科[……]

READ MORE

「TMV」- 场景 | 应用 | Scenarios | Applications | 方案

实践经验
管理方法

个人文件

保存在 Home/ 中
通过扁平化管理,以系列为单位(其类似我们组织笔记的方式);

共享文件

创建相关的共享目录来保存能够与别人共享的文件;

存储服务
使用 S3 对象存储服务
在群晖 NAS 上,其本身并不提供给 S3 存储服务,部署 S3 对象存储服务可以通过 Docker 安装 MinIO 来实现。[……]

READ MORE

「Network/L2」- 数据链路层,交换,交换网络基础,交换机

问题描述
在网络中传输数据时需要遵循一些标准,以太网协议定义了数据帧在以太网上的传输标准,了解以太网协议是充分理解数据链路层通信的基其础。以太网交换机是实现数据链路层通信的主要设备,了解以太网交换机的工作原理也是十分必要的。
该笔记将记录:以太网协议的相关概念、MAC 地止的类型、二层交换机的工作流程、二层交换机的工作原理。
解决方案
数据链路层:控制网络层与物理层之间通信。物理层不同,则数据链路层采用的封装方法也不同。
数据单元:数据帧,Frame;
以太网协议
以太网是当今现有局域网(Local Area Network,LAN)采用的最通用的通信协议标准,该标准定义了在局域网中采用的电缆类型和信号处理方法。
以太网是建立在 CSMA/CD(Carrier Sense Multiple Acce ss/Collision Detection,载波监听多路访问 / 冲突检测)机制上的广播型网络。
以太网卡,NIC
网络接口卡(Network Interface Card, NIC)也称为“网卡”,是计算机、交换机、路由器等网络设备与外部网络世界相连的关键部件。
二层环路
常见根因:
1)在网络中部署二层冗余环境;
2)人为的误接线缆导致;
防环:
1)需借助特定的协议或机制实现二层防环;
2)在二层帧头中,并无任何信息用于防止数据帧被无止尽地转发
交换网络拓扑
小型交换网络

常用技术
VLAN、VLAN Routing、链路聚合、生成树
桥接 | Bridging
DeepSeek / 在网络中,桥接与交换的区别
在网络通信中,桥接(Bridging)和交换(Switching)都是用于数据帧转发的技术,但它们在实现方式、性能、应用场景上存在关键区别。以下是两者的详细对比:

### 1. 工作层次与基础原理
– 桥接(Bridge):
– 数据链路层(Layer 2)设备,基于 MAC 地址转发帧。
– 传统网桥是软件驱动的,通过 CPU 处理转发决策,性能较低。
– 通常只有两个端口(早期网桥连接两个冲突域)。
– 支持生成树协议(STP)防止环路。
– 交换(Switch):
– 本质是多端口网桥,但采用硬件加速(ASIC 芯片)实现高速转发。
– 支持多个端口(如 24/48 口交换机),每个端口是一个独立的冲突域。
– 支持全双工通信,允许同时收发数据,彻底消除冲突(不同于 Hub 或早期网桥)。

### 2. 性能与效率
– 桥接:
– 转发速度较慢(依赖软件处理),延迟较高。
– 早期网桥可能需存储整个帧后再转发(存储转发模式)。
– 交换:
– 线速转发(Wire-speed)[……]

READ MORE

「BGP」- Keepalive

BGP Router 收到 Peer 发送的 Keepalive 报文,将对等体状态置为已建立,同时后续定期发送 Keepalive 报文用于保持连接。
报文格式

Keepalive 报文格式中只包含报文头,没有附加其他任何字段。
报文示例

Frame 25: 73 bytes on wire (584 bits), 73 bytes captured (584 bits) on interface -, id 0
Ethernet II, Src: HuaweiTe_0b:50:b5 (00:e0:fc:0b:50:b5), Dst: HuaweiTe_2e:4a:35 (00:e0:fc:2e:4a:35)
Internet Protocol Version 4, Src: 10.1.12.2, Dst: 10.1.12.1
Transmission Control Protocol, Src Port: 179, Dst Port: 50115, Seq: 46, Ack: 46, Len: 19
Border Gateway Protocol – KEEPALIVE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 19
Type: KEEPALIVE Message (4)[……]

READ MORE

「BGP」- Notification Packet

当 BGP 检测到错误状态时(对等体关系建立时、建立后都可能发生)或者人工触发重新连接,就会向 BGP Peer 发送 Notification,告知对端错误原因。之后 BGP 连接将会立即中断。
报文格式

Error Code、Error subcode:差错码、差错子码,用于告知对端具体的错误类型。
Data:用于辅助描述详细的错误内容,长度并不固定。
报文示例
当管理员手动重置 BGP 连接时触发:

Frame 5: 75 bytes on wire (600 bits), 75 bytes captured (600 bits) on interface -, id 0
Ethernet II, Src: HuaweiTe_2e:4a:35 (00:e0:fc:2e:4a:35), Dst: HuaweiTe_0b:50:b5 (00:e0:fc:0b:50:b5)
Internet Protocol Version 4, Src: 10.1.12.1, Dst: 10.1.12.2
Transmission Control Protocol, Src Port: 179, Dst Port: 50972, Seq: 20, Ack: 20, Len: 21
Border Gateway Protocol – NOTIFICATION Message
Marker: ffffffffffffffffffffffffffffffff
Length: 21
Type: NOTIFICATION Message (3)
Major error Code: Cease (6)
Minor error Code (Cease): Administratively Reset (4)

在 L2VPN Family 中,添加 BGP Peer 配置:

Frame 122: 75 bytes on wire (600 bits), 75 bytes captured (600 bits) on interface -, id 0
Ethernet II, Src: HuaweiTechno_a3:61:d7 (00:e0:fc:a3:61:d7), Dst: 38:3b:75:01:01:00 (38:3b:75:01:01:00)
Internet Protocol Version 4, Src: 3.3.3.3, Dst: 1.1.1.1
Transmission Control Protocol, Src Port: 57007, Dst Port: 179, Seq: 134, Ack: 153, Len: 21
Border Gateway Protocol – NOTIFI[……]

READ MORE

「BGP」- 路径属性(Path Attribute)

问题描述
当路由器通告 BGP Route 给它的 Peer 时,该路由将会携带多个 Path Attribute(路径属性),这些属性用于描述 BGP Route 的各项特征,同时在某些场景下也会影响 BGP 路由优选的决策。
相比 IGP 协议,IGP 协议只有单一的 Cost(开销)来控制选路,而 BGP 则是通过这些 Path Attribute 来控制灵活选路。
该笔记将记录:与 BGP Path Attribute 相关知识,以及常见问题的解决方案。
解决方案
任何 BGP Route 都拥有多个 Path Attribute 信息,无一例外;
示例如下,在 BGP Update 中的 Path Attribute 信息:


Border Gateway Protocol – UPDATE Message
Marker: ffffffffffffffffffffffffffffffff
Length: 55
Type: UPDATE Message (2)
Withdrawn Routes Length: 0
Total Path Attribute Length: 27
Path attributes # 该 BGP Update 报文包含 5 个路径属性
Path Attribute – ORIGIN: IGP
Path Attribute – AS_PATH: 200
Path Attribute – NEXT_HOP: 10.1.12.1
Path Attribute – MULTI_EXIT_DISC: 0
Network Layer Reachability Information (NLRI)
10.1.1.1/32

在路径选择上,BGP 具有丰富的可操作性,能够在不同场景下选择最合适的路径控制方式,因为:
1)每条 BGP Route 定会携带多种路径属性(Path attribute),
2)BGP 能够通过这些 Path Attribute 控制路径选择(不像 IS-IS、OSPF 只能通过 Cost 控制路径选择)。
3)当 Router 将 BGP Route 通告给它的 Peer 时,一并被通告的还有路由所携带的各个路径属性;

路径属性分类
公认属性
解释:所有路由器厂商必须支持的属性,遇到这些属性,BGP Router 必须能够进行处理。
公认强制属性(公认必遵,Well-known Mandator[……]

READ MORE

「BGP」- 路径属性:MED

属性概述
类型:MED(Multi-Exit Discriminator,多出口鉴别器)是可选非过渡属性,是种度量值。
作用:在 Inter-AS 中,用于影响 BGP 的选路,向 EBGP Peer 指出进入本 AS 的首选路径。即当进入本 AS 的入口有多个时,AS 通过 MED 动态地影响其他 AS 选择进入本 AS 的路径。
变更规则
MED 越小,则 BGP Route 越优(类似于 IGP 的开销值)。
比较规则
在缺省情况下,路由器只比较来自同个 AS 的 BGP.Route.MED 值,即:如果去往同个目的地的两条路由来自不同的 AS,鉴于两个 AS 的度量方式不同,所以不进行 MED 的比较。
根据需求,亦能够强制比较([bgp] compare-different-as-med );
传递规则
当 BGP Router 通告路由时,是否携带 MED 属性,需要根据以下条件进行判断(不对 BGP Peer 使用策略的情况下):
1)在 IBGP Peer ⇒ IBGP Peer 时,保留 MED 并传递,且在传递过程中不改变、不丢失(除非部署策略进行强制修改);
2)在 EBGP Peer ⇒ EBGP Peer 时,
—- 如果该路由是本地始发(即本地通过 network 或 import-route 命令引入),则缺省携带 MED 属性;
—- 如果从 BGP Peer 学习该路由,那么该路由传递给 EBGP Peer 时,则缺省不会携带 MED 属性;
取值规则
继承路由开销:
1)如果 Router 通过 IGP 学习到路由,并通过 network 或 import-route 将路由引入 BGP,则 BGP.Route.MED == IGP.Route.metric;
2)如果 Router 将本地直连、静态路由通过 network 或 import-route 引入 BGP,那么这条 BGP.Route.MED = 0,因为直连、静态路由 cost=0;

例如上图:
1)如果 R2 通过 OSPF 学习到 10.0.1.0/24 路由,并该路由在 R2 的全局路由表中 OSPF.Cost==100,那么当 R2 将路由 network 进 BGP 后,产生的 BGP.Route.MED==100;当然,如果换成 R1 引入路由,那么 R2 就会传递 MED 属性,因为此时的 R2 不再是“始发地”。
修改默认取值:
1)MED 不会跨 AS 传递:如果路由器通过 BGP 学习到其他 Peer 传递过来的路由,那么将路由更新给自己的 EBGP Peer 时,默认是不携带 MED;
2)通过命令 [bgp] default med 修改缺省的[……]

READ MORE