L B T

记 录 过 去 的 经 验

环境信息

  • Centos7 3.10.0-1160

firewalldiptables 的一个封装,可以让你更容易地管理 iptables 规则, 它并不是 iptables 的替代品。虽然 iptables 命令仍可用于 firewalld ,但建议使用 firewalld 时仅使用 firewalld 命令。 [1]

firewalldiptables 的前端控制器,用于实现持久的网络流量规则。它提供命令行和图形界面,在大多数 Linux 发行版的仓库中都有。与直接控制 iptables 相比,使用 firewalld 有两个主要区别:

  • firewalld 使用区域和服务而不是链式规则。
  • 它动态管理规则集,允许更新规则而不破坏现有会话和连接。

firewalld 配置说明

配置文件目录

配置文件位于两个目录中:

  • /usr/lib/firewalld/ 下保存默认配置,如默认区域和公用服务。避免修改它们,因为每次 firewall 软件包更新时都会覆盖这些文件。
  • /etc/firewalld 下保存系统配置文件。 这些文件将覆盖默认配置。

配置集说明

firewalld 使用两个配置集: 运行时持久

在系统重新启动或重新启动 firewalld 服务时,不会保留 运行时 的配置更改,而对 持久 配置集的更改不会应用于正在运行的系统。

默认情况下,firewall-cmd 命令适用于 运行时 配置,但使用 --permanent 选项将保存配置到 持久 配置中。

要添加和激活持久性规则,你可以使用以下两种方法之一:

  1. 将规则同时添加到持久规则集和运行时规则集中
    sudo firewall-cmd --zone=public --add-service=http --permanent
    sudo firewall-cmd --zone=public --add-service=http
  2. 将规则添加到持久规则集中并重新加载 firewalld
    sudo firewall-cmd --zone=public --add-service=http --permanent
    sudo firewall-cmd --reload
    --reload 选项会删除所有 运行时 配置并应用 持久 配置。因为 firewalld 动态管理规则集,所以它不会破坏现有的连接和会话。
    阅读全文 »

环境信息

  • Centos 7 5.4.221
  • openvpn 2.4.12
  • easy-rsa-3.0.8
  • iptables

OpenVPN 服务端安装配置步骤

安装 openvpn 服务端程序

epel 仓库源中包含了 OpenVPN 的安装包

$ yum info openvpn

* epel: mirror.sfo12.us.leaseweb.net
* extras: download.cf.centos.org
* updates: download.cf.centos.org
Available Packages
Name : openvpn
Arch : x86_64
Version : 2.4.12
Release : 1.el7
Size : 529 k
Repo : epel/x86_64
Summary : A full-featured SSL VPN solution
URL : https://community.openvpn.net/
License : GPLv2

$ yum install -y openvpn

安装 easy-rsa

easy-rsa 主要用来生成证书

yum install easy-rsa
阅读全文 »

环境信息

  • Centos 7
  • vsftpd 3.0.2

FTP(File transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20、21 号端口,
其中端口 20(数据端口)用于进行数据传输,端口 21(命令端口)用于接受客户端发出的相关 FTP 命令与参数。

FTP 有两种工作模式:

  • 主动模式(PORT) - 服务器主动向客户端发起连接请求.
  • 被动模式(PAVS) - FTP 服务器打开协商好的端口,等待客户端发起连接请求(默认工作模式).

FTP 协议需要用到两个 TCP 连接:

  • 命令连接 - 用来在 FTP 客户端与服务器之间传递命令。
  • 数据连接 - 用来在服务器和客户端进行文件传输。

无论是主动模式还是被动模式,其要进行文件传输都必须依次建立两个连接,分别为命令连接与数据连接。而主动模式与被动模式的差异主要体现在数据连接通道上。[1]

服务配置文件

通用配置

vsftpd.conf
# 匿名用户和本地用户是否能登录,匿名用户使用的登陆名为ftp或anonymous,口令为空,匿名用户不能离开匿名 用户家目录/var/ftp,且只能下载不能上传。
# 本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自己家目录中进行读写操作;本地用户可以离开自家目录切换至有权限访问的其他目录,并在权限允许的情况下进行上传/下载。
# 默认写在文件/etc/vsftpd.ftpusers中的本地用户禁止登陆。
anonymous_enable=YES
local_enable=YES

# 否允许登录用户有写权限。属于全局设置,默认值为YES。
write_enable=YES

# 如果设置为NO,所有的文件都不能下载到本地,文件夹不受影响。默认值为YES。
download_enable=YES/NO

匿名用户(anonymous)设置

vsftpd.conf
# 若是启动这项功能,则使用匿名登入时,不会询问密码。默认值为NO。
no_anon_password=YES/NO

# 定义匿名登入的使用者名称。默认值为ftp。
ftp_username=ftp

# 使用匿名登入时,所登入的目录。默认值为/var/ftp。注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限。
anon_root=/var/ftp

# 如果设为YES,则允许匿名登入者有上传文件(非目录)的权限,只有在write_enable=YES时,此项才有效。
# 当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
anon_upload_enable=YES/NO

# 如果设为YES,则允许匿名登入者下载可阅读的档案(可以下载到本机阅读,不能直接在FTP服务器中打开阅读)。默认值为YES。
anon_world_readable_only=YES/NO

# 如果设为YES,则允许匿名登入者有新增目录的权限,只有在write_enable=YES时,此项才有效。
# 当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
anon_mkdir_write_enable=YES/NO

# 如果设为YES,则允许匿名登入者更多于上传或者建立目录之外的权限,譬如删除或者重命名。
# 如果anon_upload_enable=NO,则匿名用户 不能上传文件,但可以删除或者重命名已经存在的文件;
# 如果anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但 可以删除或者重命名已经存在的文件夹。)默认值为NO。
anon_other_write_enable=YES/NO

# 设置是否改变匿名用户上传文件(非目录)的属主。默认值为NO。
chown_uploads=YES/NO

# 设置匿名用户上传文件(非目录)的属主名。建议不要设置为root。
chown_username=username

# 设置匿名登入者新增或上传档案时的umask 值。默认值为077,则新建档案的对应权限为700。
anon_umask=077

# 若是启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address。
# 若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。默认值为NO。
deny_email_enable=YES/NO

# 此文件用来输入email address,只有在deny_email_enable=YES时,才会使用到此档案。
# 若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。
banned_email_file=/etc/vsftpd/banner_emails
阅读全文 »

NFS(Network File System 的缩写),它的主要功能是:通过网络、让不同的机器、不同的 OS 可以共享彼此的文件

NFS 服务器可以允许 NFS 客户端将远端 NFS 服务器的共享目录挂载到自己的系统上,当作本地磁盘一样使用

环境信息

  • Centos 7

服务安装

服务端安装

安装需要的软件包

yum -y install nfs-utils rpcbind

创建数据目录

mkdir /data/NFSDataHome
chmod 666 /data/NFSDataHome

修改配置文件 /etc/exports:

/etc/exports
/data/NFSDataHome 192.168.1.0/24(rw,sync,insecure,no_subtree_check,no_root_squash) 
/data/NFSDataHome *(ro)

相关选项说明:

参数 说明
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async nfs 在写入数据前可以响应请求
secure nfs 通过 1024 以下的安全 TCP/IP 端口发送
insecure nfs 通过 1024 以上的端口发送
wdelay 如果多个用户要写入 nfs 目录,则归组写入(默认)
no_wdelay 如果多个用户要写入 nfs 目录,则立即写入,当使用 async 时,无需此设置
hide 在 nfs 共享目录中不共享其子目录
no_hide 共享 nfs 目录的子目录
subtree_check 如果共享 /usr/bin 之类的子目录时,强制 nfs 检查父目录的权限(默认)
no_subtree_check 不检查父目录权限
all_squash 无论 NFS 客户端以哪种用户身份访问,均映射为 NFS 服务器的 nfsnobody 用户
no_all_squash 保留共享文件的 UID 和 GID(默认)
root_squash 当 NFS 客户端以 root 用户身份访问时,映射为 NFS 服务器的 nfsnobody 用户
no_root_squash 当 NFS 客户端以 root 身份访问时,映射为 NFS 服务器的 root 用户,也就是要为超级用户保留权限。这个选项会留下严重的安全隐患,一般不建议采用。
anonuid=xxx 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 UID
anongid=xxx 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 GID
阅读全文 »

Centos 7 上面安装 Fiddler,需要先安装 mono,并且需要图形桌面系统支持。

Mono(https://github.com/mono/mono) is an open source implementation of Microsoft’s .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
The Mono project is part of the .NET Foundation(https://github.com/dotnet)

环境信息

  • Centos 7 3.10.0-1160
  • mono-complete-6.8.0
  • Fiddler
  • Gnome

安装步骤

安装 mono

首先安装 mono-completeyumepel 中包含了此安装包

$ yum info  mono-complete
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Packages
Name : mono-complete
Arch : x86_64
Version : 6.8.0
Release : 2.el7
Size : 0.0
Repo : installed
From repo : epel
Summary : Install everything built from the mono source tree
URL : http://www.mono-project.com
License : MIT

$ yum install mono-complete

安装 Fiddler

下载 Fiddler 安装包

wget http://www.telerik.com/docs/default-source/fiddler/fiddler-linux.zip

其他参考下载链接

解压运行 Fiddler

unzip fiddler-linux.zip -d fiddler-linux
cd fiddler-linux
mono ./Fiddler.exe

常见错误

[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: The type initializer for ‘System.Windows.Forms.XplatUI’ threw an exception. —> System.ArgumentNullException: Could not open display (X-Server required. Check your DISPLAY environment variable)

启动过程中报错,原因为需要桌面系统支持。可以在图形桌面系统中开启 shell,执行启动命令 mono ./Fiddler.exe

SoftEther VPN 官网手册

环境信息

  • Centos7 5.4.221
  • SoftEther VPN Server 4.41
  • iptables

SoftEther VPN Server 有两种模式,Service ModeUser Mode,本文档安装使用 Service Mode [1]

  • Service Mode - 安装之后以系统服务的形式存在(被管理)
  • User Mode - 安装之后不存在对应的服务,(管理员)用户直接通过进程管理,程序启动停止需要(管理员)用户手动停止相应进程

安装配置过程

安装

安装依赖包

yum -y install gcc zlib-devel openssl-devel readline-devel ncurses-devel

参考链接 下载最新的安装包,本文档使用版本 4.41 版本 [2]

wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.41-9782-beta/softether-vpnserver-v4.41-9782-beta-2022.11.17-linux-x64-64bit.tar.gz

tar -xf softether-vpnserver-v4.41-9782-beta-2022.11.17-linux-x64-64bit.tar.gz

cd vpnserver/

使用以下命令编译生成可执行文件

make

将编译后的目录移动到 /usr/local/ 下,并修改权限

cd ..
mv vpnserver /usr/local/

cd /usr/local/vpnserver/

chmod 600 *

chmod 700 vpncmd
chmod 700 vpnserver
阅读全文 »

本文档示例使用 Python3 调用 CDN77 API 的常用方法,CDN77 目前未提供 SDK,只有 REST API。 [1]

常见用法

创建调用 API 时需要的 API Token

参考文档创建 API Token

读取 CDN resources 列表

python
>>> api_token = 'sliJJYTUikbdg9798384Kbbj0kj'
>>> r = requests.get('https://api.cdn77.com/v3/cdn', headers={'Authorization': f'Bearer {api_token}'})

根据 cdn resource id 获取流量统计数据

python
>>> url = 'https://api.cdn77.com/v3/stats/cdns/traffic'
>>> headers = {'Authorization': f'Bearer {api_token}'}

>>> data = json.dumps({"cdn_ids": [1991249093], "aggregation": "1-month", "from": 1669824000, "to": 1672502400})

>>> r = requests.post(url, headers=headers, data=data)
>>> r.json()
{'1991249093': {'1667260800': {'sizeCached': 83745364388, 'sizeNonCached': 899336049}, '1669852800': {'sizeCached': 76503199334, 'sizeNonCached': 758547845}}}

脚注

环境信息

  • python3.10

常见用法

基础用法可以查看系统帮助信息

>>> help(requests)

requests 发送请求时,会自动创建 requests.Request,因此发送请求时如果需要发送更多数据,可以查看 Request 类的帮助信息,或者查看 requests.models 获取更多帮助信息,如 headersfiles

>>> help(requests.Request)

例如发送请求时需要添加头部信息

>>> headers = {'Authorization': token, 'User-Agent': 'Python'}
>>> r = requests.get('https://api.cdn77.com/v3/cdn', headers=headers)

>>> r.text

Request 请求的响应是 ‘requests.models.Response’ 对象的实例。获取 Response 帮助,可以查看以下内容

>>> help(requests.models.Response)

>>> help(requests.Response)

脚注

环境信息

  • Python 3.10

常见用法

获取前一天所属月份

arrow 模块获取

以下示例使用 arrow 模块获取前一天所属月份 [1]

pip install arrow

>>> a = arrow.now() # 当前本地时间

>>> a.shift(months=-1).format("YYYYMM")
'202212'

指定参数 months = -1 就可以计算前一个月的时间。往后一个月就是 month=+1format 指定时间格式。

获取前一个月的天数

通过模块 calendar 获取

>>> import calendar

# 获取 2022-1 月份的天数,输出 tuple ,由此月的第一天是星期几和此月的天数构成。
>>> calendar.monthrange(2022,1)
(5, 31)
阅读全文 »

环境信息

  • python 3.10

pyinstrument 使用

pyinstrument 可以快速找到代码运行最慢的部分,帮助提高代码的性能。支持 Python 3.7+ 且能够分析异步代码,仅需一条命令即可显示具体代码的耗时 [1]

安装

pip install pyinstrument

命令行使用

在无需更改代码的情况下,直接通过命令行使用 pyinstrument 分析目标代码

$ pyinstrument main.py

脚注

环境信息

  • Python3.10

Python 中操作 json 相关格式,主要使用模块 json

Python 数据类型转换为 json 格式

python 数据类型转换为 json ,主要使用方法 dumps()

>>> adict = {'a': 1, 'b': 'st'}
>>> json.dumps(adict)
'{"a": 1, "b": "st"}'

>>> alist = [1,2,3,4]
>>> json.dumps(alist)
'[1, 2, 3, 4]'

json 格式转换为 Python 数据类型

>>> ajson = '[1, 2, 3, 4]'
>>> type(ajson)
<class 'str'>

>>> json.load(ajson)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.10/json/__init__.py", line 293, in load
return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'

>>> json.loads(ajson)
[1, 2, 3, 4]


>>> bjson = '{"a": 1, "b": "st"}'
>>> type(bjson)
<class 'str'>
>>> json.loads(bjson)
{'a': 1, 'b': 'st'}

阅读全文 »

环境信息

  • Python3.10

Python 执行 shell 命令

subprocess 模块

subprocess.check_output() 执行一个外部命令并以Python字符串的形式获取执行结果 [1]

import subprocess
out_bytes = subprocess.check_output(['netstat','-a'])

如果你需要文本形式返回,加一个解码步骤即可

out_text = out_bytes.decode('utf-8')

如果被执行的命令以非零码返回,就会抛出异常。 下面的例子捕获到错误并获取返回码:

try:
out_bytes = subprocess.check_output(['cmd','arg1','arg2'])
except subprocess.CalledProcessError as e:
out_bytes = e.output # Output generated before error
code = e.returncode # Return code

默认情况下,check_output() 仅仅返回输入到标准输出的值。 如果你需要同时收集标准输出和错误输出,使用 stderr 参数:

out_bytes = subprocess.check_output(['cmd','arg1','arg2'],
stderr=subprocess.STDOUT)
阅读全文 »

环境信息

  • Docker 19.03.15
  • Mysql 5.7

配置步骤

下载镜像

docker pull mysql:5.7.31

启动容器

启动容器前先在本地创建 Mysql 数据目录以用来持久化 Mysql 数据,如果需要配置文件,可以在本地创建好配置文件挂载到容器的 /etc/mysql/my.cnf,无需配置文件的话,则只需要将持久化的本地数据目录挂载到容器默认的数据目录 /var/lib/mysql,本示例中 Mysql 本地持久化数据目录为 /opt/docker_mysql_home/data/。使用以下命令启动容器

docker run -d --name mysql -v /opt/docker_mysql_home/data/:/var/lib/mysql/ -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31

-e MYSQL_ROOT_PASSWORD=123456 通过环境变量配置 Mysql 初始化后的密码

容器启动后,通过以下命令连接数据库

mysql -h 127.0.0.1 -uroot -p

环境信息

  • PyCharm 2022.1 (Professional Edition)

常见配置

快速插入时间

通过配置 Live Template 实现快速插入时间

  1. 打开 File > Setting > Editor: Live Templates

  2. 选中常用的语言,比如 Python,点击右上角的 +,添加 Live Template
    Abbreviation 输入快捷输入的名称,比如 currentTime
    Description 输入描述信息
    Template Text 输入 $time$

  3. 点击 Edit Variables 配置命令及格式

  4. Define 选择 EverywhereApply让配置生效

  5. 编辑时输入 currentTime,可以直接插入当前时间

配置 git 仓库

  1. 打开 File -> Settings -> Version Control -> Git,在 Path to Git executable 处选择 git 的安装位置。配置完成之后,点击【Test】按钮,如果成功,则会显示 Git 版本信息

  2. 点击 VCS -> Get from Version Control,输入 Git 仓库的地址和本地目录。

环境信息

  • Centos-7 3.10.0-1160
  • Docker Engine 19.03.15
  • Kubernetes 1.21.2

本文档中涉及服务器的操作,都是在 Kubernetes 集群的 Master 节点上进行。如果在其他服务器启动 Halyard 容器,需要确保容器中可以访问到 Kubernetes 集群的 API Server

安装部署步骤

Install Halyard on Docker and Choose Cloud Providers - Kubernetes

宿主机准备容器数据目录

宿主机创建 local Halyard config directory [1]

mkdir /root/spinnaker_data
mkdir /root/spinnaker_data/.kube
mkdir /root/spinnaker_data/.hal

Spinnaker 的部署配置会写入容器目录 /home/spinnaker/.hal,将此配置映射到宿主机,可保证配置持久化。

拷贝 Kubernetes 集群管理配置文件到 /root/spinnaker_data/.kube/config [2]

cp /etc/kubernetes/admin.conf /root/spinnaker_data/.kube/config
chmod 777 /root/spinnaker_data/.kube/config
阅读全文 »

环境信息

  • Kubernetes 1.24
  • cert-manager v1.7.1

随着 HTTPS 不断普及,越来越多的网站都在从 HTTP 升级到 HTTPS,使用 HTTPS 就需要向权威机构申请证书,需要付出一定的成本,如果需求数量多,也是一笔不小的开支。cert-manager 是 Kubernetes 上的全能证书管理工具,如果对安全级别和证书功能要求不高,可以利用 cert-manager 基于 ACME 协议与 Let’s Encrypt 来签发免费证书并自动续期,实现永久免费使用证书。

cert-manager 工作原理

cert-manager 部署到 Kubernetes 集群后,它会 watch 它所支持的 CRD 资源,我们通过创建 CRD 资源来指示 cert-manager 为我们签发证书并自动续期: [1]

解释下几个关键的资源:

  • Issuer/ClusterIssuer: 用于指示 cert-manager 用什么方式签发证书,本文主要讲解签发免费证书的 ACME 方式。ClusterIssuerIssuer 的唯一区别就是 Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。
  • Certificate: 用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对 Issuer/ClusterIssuer 的引用。
阅读全文 »

环境信息

  • Kubernetes 1.24

ConfigMap 是 Kubernetes 用来向应用 Pod 中注入配置数据的方法。[1]

使用 ConfigMap 数据定义容器环境变量

使用单个 ConfigMap 中的数据定义容器环境变量

  1. ConfigMap 中将环境变量定义为键值对:
    kubectl create configmap special-config --from-literal=special.how=very
  2. 将 ConfigMap 中定义的 special.how 赋值给 Pod 规约中的 SPECIAL_LEVEL_KEY 环境变量。
    apiVersion: v1

    kind: Pod

    metadata:

    name: dapi-test-pod

    spec:

    containers:

    - name: test-container

    image: registry.k8s.io/busybox

    command: [ "/bin/sh", "-c", "env" ]

    env:

    # 定义环境变量

    - name: SPECIAL_LEVEL_KEY

    valueFrom:

    configMapKeyRef:

    # ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值

    name: special-config

    # 指定与取值相关的键名

    key: special.how

    restartPolicy: Never
    现在,Pod 的输出包含环境变量 SPECIAL_LEVEL_KEY=very
阅读全文 »