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 00001/256
单播00120-3F1/8公网IP
未分配010-1111 1110 040-FE7F
链路本地单播1111 1110 10FE80::/101/1024169.254.0.0/16
站点本地单播1111 1110 11FEC0::/101/1024私网192.168.0.0/16
组播1111 1111FF00::/81/256224.0.0.0/4
IPv6地址段划分:240e开头是电信,2408开头是联通,2409开头是移动,2001教育,FE80开头是内网地址

访问内网的实现

这里按我的理解,使用了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

Nginx的location匹配规则解析

情况1:

proxy_pass  http://IPaddr/    #删除匹配段,一般配置接口使用

访问 http://域名/abc/test.map 分下面两种情况
1)location /abc/
会转发到 http://IPaddr/test.map
2) location /abc
会转发成 http://IPaddr//test.map —————-linux //路径=/路径
所以也等价于 http://IPaddr/test.map 的访问

情况2:

proxy_pass  http://IPaddr    #匹配段和此地址段拼接

这个也分两种情况
1) location /abc
这种可以匹配 /abc 和 /abc/
2)location /abc/
这种只能匹配 /abc/ 匹配目录