# 启动,停止
systemctl start rabbitmq-server
systemctl stop rabbitmq-server
#建用户
rabbitmqctl add users daq Daq@123456
#查看用户
rabbitmqctl list_users
#配置管理权限
rabbitmqctl set_user_tags daq administrator
#查看用户数据权限
rabbitmqctl list_users_permissions daq
#配置用户数据权限
rabbitmqctl set_permissions -p / ".*" ".*" ".*"
#开启web管理
rabbitmq-plugins enable rabbitmq_management
#目录 /var/lib/rabbitmq/mnesia/ 数据库目录文件,以服务器名称命名的子文件夹
#如服务器名称 api01 则对应子文件夹为 rabbit@api01
ubuntu24 配置静态IP
ubuntu 24采用了netplan 管理IP, vim /etc/netplan/50-cloud-init.yaml
network:
ethernets:
enp6s18:
dhcp4: false
dhcp6: false
addresses: [192.168.1.110/24]
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [192.168.1.1]
search: []
version: 2
最后运行 netplan apply 使之生效
其实可以在 /etc/netplan/ 下新建任意名字的yaml文件配置上面信息也可以。
需要把默认的cloud-init’s 关闭。方法:
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
network: {config: disabled}
负载均衡后端无法获取终端用户真实IP的解决方案
场景描述
移动云平台,使用了云上的负载均衡,默认配置的4层负载均衡 ,后端服务器为ubuntu 20 ,部署了nginx服务器
问题
nginx 日志查看只能看到100.125.64.104 100.125.64.103 之类的云内地址。
解决
编译加载TOA内核
源码 https://github.com/Huawei/TCP_option_address.git
1、预安装 gcc make linux-headers-`uname -r`
我的ubuntu是 uname -r 是 5.4.0-171-generic ,我选择最近的下载版本 5.4.0-128.144
2、下载源码TCP_option_address后, 解压,cd src 进入 ,make 编译如果未提示错误则编译成功,检查当前目录下是否已经生成toa.ko文件。
3、加载内核
insmod toa.ko
dmesg |grep TOA
4、自启动加载
Ubuntu 在 /etc/modules-load.d/toa.conf 下建立 ,文件直接写 模块名字 toa
拷贝toa.ko 文件到 /lib/modules/$(uname -r)/ ,运行depmod -a 更新内核模块依赖关系
参考连接https://ecloud.10086.cn/op-help-center/doc/article/29108
IPV6网络
今天无意间调通了家里的玩客云armbian系统内docker 运行的几个服务,也包含了armbian系统本身的公网访问,特别记录以下。
这里的意义在于,我使用的是移动的网络,路由器拨号后运营商给的地址非公网IPv4,而是内网地址,无法通过传统的IPv4内网穿透形式配置。
还好运营商内部、运营商之间的核心、接入层面都已经支持IPv6地址,所以我也是首次尝试使用IPv6地址绑定域名,结合lucky软路由实现了内网服务的域名+端口的访问内部多个服务。
IPv6地址分类
为了进一步了解IPv6 ,我又去翻了下中级的“网络工程师第五版”教程,记录下IPv6地址的分类
名称 | 前缀(二级制) | 前缀(16进制) | ip占比 | 类比IPv4 |
保留 | 0000 0000 | 1/256 | ||
单播 | 001 | 20-3F | 1/8 | 公网IP |
未分配 | 010-1111 1110 0 | 40-FE7F | ||
链路本地单播 | 1111 1110 10 | FE80::/10 | 1/1024 | 169.254.0.0/16 |
站点本地单播 | 1111 1110 11 | FEC0::/10 | 1/1024 | 私网192.168.0.0/16 |
组播 | 1111 1111 | FF00::/8 | 1/256 | 224.0.0.0/4 |
访问内网的实现
这里按我的理解,使用了IPv6后,是不需要任何的软路由、nat 、内网穿透,端口映射之类的技术。相当于我们设备有了IPv6单播地址后,接入运营商网络,就构成了一个大的没有围栏的互联网,他们之间都可以直接互访。
当然这里最重要的是保证拨号的光猫开启了IPv6,而且你的终端设备直连光猫。如果有无线路由器串在中间,那也要保证路由器开启了IPv6功能。比如我的小米3c路由器好像不支持。
当然直接使用IPv6地址是很不方便的,甚至浏览器直接输IPv6地址我测试也是不支持的。所以我们就要加一个域名,域名解析指向设备IPv6 。然后就可以通过域名访问设备的各个服务器了。
内网服务器设备参考
如果使用个人 PC来运行各种服务,7*24*365的运行,电费还是一个很大的制约。这几年小盒子的pc也越来越流行,但是动则1000+的rmb ,成本也是一个考量。
我是购买了2个小盒子硬件,玩客云WS1608,某鱼30入的,还有一个是某讯的N1 ,某鱼80.他们的优点是便宜、低功耗(2w),社区文档丰富、硬件刷机固件成熟,功能也基本满足家用服务的需求。
玩客云 晶晨S805 ,armv7架构,1G+8G的配置,会有些应用不支持armv7架构,但是刷个armbian(系统) +casaOS(web界面的应用商店+资源监控) ,
N1 晶晨S905, armv8架构, 2G+8G配置,比玩客云配置高些,可玩性更强
其实我觉得基本用用,玩客云也够了。一般应用推进 alist–网盘神器 ,lucky –内网服务的转发,其他看情况 openwrt .
应用还在进一步探索中。。。
不足
现在IPv6核心网络,各个运营商,云服务商技术上我觉的都已经支持了,但是在终端接入方面,可能有些没有开启。比如说企业的网络内,他们的防火墙、路由交换。
所以我现在只能是手机的4G 或5G网络直接访问我的域名才能连接到我内部服务器。公司网络全部都不行。
openldap
综述
使用openldap的目录功能实现一套账号关联登录多个应用,避免每个系统单独管理各自账号。测试已可实现的应用有grafana(10.2.3有bug,不要用20140116) .openvpn
基本概念
dc 域, uid 用户ID , cn 通用名称(通常 cn或uid可作为第三方系统的登录账号), sn 姓(一般可设置与cn相同) , ou 组织单元(可配置为部门),dn (全路径名称,如 cn=wjy,ou=users,dc=example,dc.org)
对象属性: 最终用户可以是 objectclass: inetOrgPerson , objectclass: posixAccount objectclass: top ,然后加上 cn ,sn , uid(非必须) ,uidnumber, gidnumber, userpassword , homedirectory ,homephone,mail
组用户 :objectclass: posixGroup , objectclass: top , 加上必须的cn , gidnumber , 组成员 memberuid:
搭建
用docker-compose 最简单,少了编译、配置,可以快速部署用于测试使用。当然生产还是要详细了解相关配置项
https://github.com/osixia/docker-openldap/blob/master/example/docker-compose.yml
此模板使用了openldap + phpadmin .可以快速建立web管理界面的ldap

我这里的搭建架构示例如上图。根目录是公司层,cn=java-dev 是组(也是部门),下面uid是用户,readonly是第三方应用接入的只读查询账号,这样可以最小化权限给到第三方
grafana 接入
首先在 grafana.ini 配置文件的
[auth.ldap]
enabled = true
再在ldap.toml中配置
[[servers]]
host = "192.168.0.14"
port = 389
bind_dn = "cn=readonly,dc=ywsco,dc=cn"
bind_password = '***'
search_filter = "(uid=%s)" #这里也可以用cn
search_base_dns = ["dc=ywsco,dc=cn"]
group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"
group_search_base_dns = ["dc=ywsco,dc=cn"]
group_search_filter_user_attribute = "uid"
[servers.attributes]
name = "givenName"
surname = "sn"
username = "uid"
member_of = "memberOf"
email = "mail"
[[servers.group_mappings]]
group_dn = "cn=tech-support,dc=ywsco,dc=cn"
org_role = "Admin"
grafana_admin = true
org_id = 1
[[servers.group_mappings]]
group_dn = "cn=java-dev,dc=ywsco,dc=cn"
org_role = "Editor"
[[servers.group_mappings]]
group_dn = "*"
org_role = "Viewer"
zabbix监控
zabbix大版本6.4 ,agent直接装agent2,功能更强大。
1、redis监控
用官方template “Redis by Zabbix agent 2″即可监控
无密码redis无需其他配置,主机链接官方模板即可
redis 带密码的情况,需要在被监控redis的agent2配置文件增加如下两行,然后主机添加macros : {$REDIS.CONN.URI} Redis1即可监控
Plugins.Redis.Sessions.Redis1.Uri=tcp://127.0.0.1:6379
Plugins.Redis.Sessions.Redis1.Password=123456

odps表格创建操作
一个语句,创建和源表格式相同并且带字段注释的表格方法:create table [if not exists] <table_name> like <existing_table_name> [lifecycle <days>]
;
而这个语句create table [if not exists] <table_name>
as <select_statement>; 会创建一个新表,但是不会将源表的元数据复制到新表中.元数据包括列名、列类型、列注释、分区等信息。因此,使用这种方式创建的新表只会继承源表的列名和列类型,而不会继承源表的列注释。但是他会把源表所有数据插入新的表格。
示例:
CREATE TABLE IF NOT EXISTS table_name LIKE a.table_name;
create table if not exists table_name as select * from a.table_name;
K8S部署文件的模板化
提前编写通用模板,和初始化python脚本,不同的部署包只需定义相应的变量文件就可以生成部署yaml文件,示例如下:
# 模板文件,保存为deployment.yml.j2
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ name }}
namespace: {{ namespace }}
spec:
replicas: {{ replicas }}
selector:
matchLabels:
app: {{ name }}
template:
metadata:
labels:
app: {{ name }}
spec:
containers:
- name: {{ name }}
image: {{ image }}
ports:
- containerPort: {{ port }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ name }}-svc
namespace: {{ namespace }}
spec:
selector:
app: {{ name }}
type: NodePort
ports:
- protocol: TCP
port: {{ port }}
# 配置文件,保存为variables.yml
name: myapp
namespace: default
replicas: 1
image: myapp:latest
port: 8080
# python 脚本createDep.py,最终生成部署文件 deployment_{appname}.yaml
# python2.7 安装yaml包 pip install pyyaml
from jinja2 import Environment, FileSystemLoader
import yaml
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('deployment.yml.j2')
variables = yaml.safe_load(open('variables.yml'))
output = template.render(variables)
output_file = "deployment_" + variables["name"] + ".yaml"
with open(output_file, 'w') as f:
f.write(output)
K8S踩坑集锦
1 节点arp缓存满
现象:通过coreDns解析域名,时而解析成功,时而解析超时;系统日志报错如下
arp_cache: neighbor table overflow!
解决办法:
调整内核参数,将阈值调高
$ sysctl -a | grep net.ipv4.neigh.default.gc_thresh
net.ipv4.neigh.default.gc_thresh1 = 80000
net.ipv4.neigh.default.gc_thresh2 = 90000
net.ipv4.neigh.default.gc_thresh3 = 100000
注意:如果coreDns没有通过nodeSelector指定coreDns的pod调度到指定标签的节点上,就需要全部节点都要修改上文的内核参数;由于coreDns是非常重要的组件,还是建议通过nodeSelector将coreDns的pod调度到特定机器,并修改特定机器的内核参数,防止其他服务影响。
linux的iptables nat利用
场景说明:
A: 172.45.255.14:3389 要访问的目标windows主机
B: 172.45.255.11 linux代理
C: 172.45.211.22 客户机
B对C的访问没有限制,A和B在同一个网段可以互访,C无法直接访问A的远程桌面
解决方案:
##在B上面操作
iptables -t nat -A PREROUTING -p tcp --dport 53388 -j DNAT --to 172.45.255.14:3389
iptables -t nat -A POSTROUTING -p tcp -d 172.45.255.14 --dport 3389 -j SNAT --to 172.45.255.11
sysctl -w net.ipv4.ip_forward=1
结果:
C可以通过B的53388端口访问A的远程桌面
其他扩展:
命令加错删除:
iptables -t nat -L PREROUTING num #查看nat表中PREROUTING第几条num
iptables -t nat -D PREROUTING num #删除第几条num
iptables -t nat -L POSTROUTING num #查看nat表中POSTROUTING第几条num
iptables -t nat -D POSTROUTING num #删除第几条num
Snat配置:
## X服务器有内外和公网两张网卡,两个IP,以下配置在X机器上面操作
iptables -t nat -I POSTROUTING -s 192.68.10.1/24 -j SNAT --to-source 211.136.11.11
#其中 192.168.10.0/24为内外IP段,211.136.11.11为X的公网IP,
#内网段的服务器需要配置默认路由指向X服务器的内外IP