OpenSSL

OpenSSL 简要说明

OpenSSL的功能

  • 生成 private keys
  • 创建 CSRs (certificate signing request)
  • 安装证书
  • 标识证书信息, 转换证书格式

基本命令

  • openssl version -a (版本查看)
  • openssl genrsa -out yourdomain.key 2048 (生成私钥的三要素)
    1. 算法(推荐 RSA)
    2. 键长(RSA 推荐2048)
    3. Passphrase
  • openssl rsa -text -in yourdomain.key -noout (查看私钥信息)
  • openssl rsa -in yourdomain.key -pubout -out yourdomain_public.key (输出公钥)
  • openssl x509 -text -in yourdomain.crt -noout (查看证书信息)

REDIS

REDIS 是什么,能干什么

  • redis的特性是快, 简化开发 .
  • 不能替代数据库, 是以数据库为核心应用的强力补充.
  • redis用内存存储数据.(disk only for persistence)内存大小,决定了redis处理数据大小.
  • 数据模型是独特的
    • sting ( strings ,int ,float )
    • list
    • hash
    • set
    • zset
  • 事务 ( watch ,unwatch ,mult ,exec )
    • watch 是乐观锁 ,不使用数据库中的悲观锁.( 例如: 更新前锁定 )
  • 数据持久模式 : snapshotting , aof

IPV6-ADDRESS

IPV6 地址结构

  • 地址长128位.(Routing Prefix(48) + Subnet ID (16) + Interface ID(64))
  • 主机地址(Interface ID)建议永远保留64位.
  • IPV6不再使用子网掩码的说法,现在叫前缀长度.

IPV6 地址类型(单播,组播,任播)

单播

  • 可聚合全球地址(Global Unicast) 2000::/3
    • 电信(240e::/18),联通(2408:8000::/20),移动(2409:8000::/20)
  • 本地链路(Link-Local) fe80::/10 相当于IPv4的169.254.0.0/16,不可路由.
  • 回环(Loopback) ::1/128
  • 本地唯一(Unique-Local) FC::/7 (FC00::/8暂未定义,当前 FD00::/8已定义),相当于IPv4的私有地址(10.0.0.0/8,172.16.0.0/20,192.168.0.0/24),不可在Internet路由.
  • 未指定地址(Unspecified) ::/128

组播(icmpv6 ndp 核心)

  • 部分特定地址(FFxx::/8)
    • FF02::1 all nodes 在本地链路范围的所有节点
    • FF02::2 all routers 在本地链路范围的所有路由器
    • FF02::5 all ospf routers
    • FF02::9 all rip routers 所有运行RIP的路由器
    • FF02::A all eigrp routers 所有运行eigrp的路由器
    • FF05::2 在一个站点范围内的所有路由器
    • FF02::1:FFxx:xxxx/104 被请求节点组播地址(solicited-node multicast address)
      • 只在本地链路上有效,只包含一个用户,可从接口IPV6地址推算出.
      • 推算方式:被请求节点组播地址的前104位固定,将接口IP地址的后24位移下来填充到后面就可以了.
      • 组播地址映射MAC组播地址: 33-33-取IPv6组播地址的最后32bit

ICMPv6

NDP(Neighbor Discovery Protocol 邻居发现协议)

  • 地址解析步骤(获得对方mac ,netsh ipv6 show neighbors)
    1. 发送ICMPv6的邻居请求信息,目的IP为对方的被请求节点组播地址,目的MAC为对应的组播MAC.源IP/MAC均为本机接口对应地址.注意非广播报文,二层交换机是否广播由交换机能力决定.
    2. 接受方(本地网卡有对应的组播MAC)回送ICMPV6邻居通告消息,该消息包含本机接口MAC.
  • 邻居状态跟踪(间隔发送邻居请求信息,根据回应做出判断)
  • DAD(Duplicate Address Detection重复地址检测,保证单播地址不存在冲突,所有单播地址都需要通过DAD检测,才能启用),DAD 使用邻居请求和邻居通告来完成其机制.
  • 无状态自动配置(自动配置IPV6地址)
    1. 自动生成本地链路地址(fe80::/10),并通过DAD
    2. 发送邻居请求消息尝试在链路上发现IPV6路由器.
    3. 路由器返回邻居通告消息(携带准备分配给主机的IPv6前缀信息。路由器在没有收到邻居请求消息时也能够主动发出邻居通告消息)
    4. 主机根据路由器回应的邻居请求消息,获得本链路IPv6地址前缀信息, 由前缀 + 接口ID 生成主机的IPv6单播。通过DAD,启用该地址.
  • 路由器通告

二层组播技术(IGMP snooping)

问题: 二层Switch由于组播报文的目的地址为组播组地址,在二层设备上是学习不到这一类MAC表项的(组播MAC不会出现在源地址上),因此组播报文就会在Switch所有接口进行广播.
解决方法: 当主机和上游三层设备之间传递的IGMP协议报文通过二层组播设备时,拥有IGMP Snooping技术的交换机可以分析报文携带的信息,根据这些信息建立和维护二层组播转发表,从而指导组播数据在数据链路层按需转发.

VLAN-PVID-TRUNK

VLAN 端口转发规则

PVID

  • PVID即 Port Vlan id,代表端口的缺省VLAN。默认PVID为1.
  • 交换机从对端设备收到的帧有可能是不带VLAN标签的数据帧,但所有以太网帧在交换机中都是以带VLAN标签的形式来被处理和转发的,因此交换机必须给端口收到的不带VLAN标签的数据帧添加上VLAN标签。

ACCESS 端口规则

发送
  • 数据包Tag与PVID相同,剥离Tag发送.
  • 数据包Tag与PVID不同,丢弃.
接受
  • 数据包无Tag,接受并打上PVID,进行交换转发.
  • 数据包有Tag,丢弃.

TRUNK/HYBRID 端口规则

发送
  • 数据包Tag与PVID相同,剥离Tag发送.
  • 数据包Tag与PVID不同,且在允许Tag列表中,带Tag直接发送(Hybrid 可控制是否携带Tag),默认转发所有Tag.
接受
  • 数据包无Tag,接受并打上PVID,进行交换转发.
  • 数据包有Tag,且在允许Tag列表中,进行交换转发,否则丢弃.

备注: 上述发送和接受指的是交换机对外的数据流.

Linux NETSTAT SS

netstat ss

NETSTAT

  • -l, –listening display listening server sockets
  • -a, –all display all sockets (default: connected)
  • -r, –route display routing table
  • –i, –interfaces display interface table
  • -g, –groups display multicast group memberships
  • -s, –statistics display networking statistics (like SNMP)
  • -M, –masquerade display masqueraded connections
  • -v, –verbose be verbose
  • -W, –wide don’t truncate IP addresses
  • -n, –numeric don’t resolve names
  • -e, –extend display other/more information
  • -p, –programs display PID/Program name for sockets
  • -o, –timers display timers
  • -F, –fib display Forwarding Information Base (default)
  • -C, –cache display routing cache instead of FIB
1
sudo netstat -pln | grep 22 | awk '{print $NF}'

监听22端口的进程

1
2
netstat -at
netstat -lu
  1. 列出所有TCP端口
  2. 列出所有监听的UDP端口

SS

  • –n, –numeric don’t resolve service names
  • -r, –resolve : resolve host hostnames.
  • -l, –listening display listening sockets
  • -o, –options show timer information
  • -e, –extended show detailed socket information
  • -m, –memory show socket memory usage
  • -p, –processes show process using socket
  • –s, –summary show socket usage summary
  • -N, –net switch to the specified network namespace name
  • -4, –ipv4 display only IP version 4 sockets
  • -6, –ipv6 display only IP version 6 sockets
  • –0, –packet display PACKET sockets
  • -t, –tcp display only TCP sockets
  • -S, –sctp display only SCTP sockets
  • -u, –udp display only UDP sockets
  • -w, –raw display only RAW sockets
  • -x, –unix display only Unix domain sockets
  • -f, –family=FAMILY display sockets of type FAMILY
1
2
3
ss -tlp
ss -t dst 192.168.1.10:443
ss -t state established '( dport = :ssh or sport = :ssh )'
  1. 列出监听的TCP协议并包括对应的进程
  2. 列出连接到192.168.1.10:443的栈
  3. 列出所有ssh相关的连接

Linux 进程查看

ps,pidof,pgrep,fuser,lsof

PS

1
ps -aux

x :所有类型进程.
a :所有用户.
u :格式选项.

1
ps -U root

U :指定用户.

PIDOF
1
pidf nvim

获得正在运行的程序nvim的进程ID.

1
sudo kill -9 $(pidof firefox)

脚本中用法.

1
pidof -x script.py

包含脚本名的进程ID.

PGREP
1
pgrep -l ssh

pgrep 相当于 ps -eo pid,cmd | awk ‘{print $1,$2}’ grep KeyWord

FUSER

文件或网络端口使用的进程号.

1
2
fuser --namespace tcp port
fuser --verbose path/to/file_or_directory

LSOF

打开的文件及对应的进程

1
2
3
4
5
6
lsof path/to/file
lsof -i :port
lsof -u username
lsof -c process_or_command_name
lsof -p PID
lsof -iTCP:port -sTCP:LISTEN
  1. 发现打开文件的进程
  2. 发现打开指定端口的进程
  3. 指定用户打开的文件
  4. 指定命令打开的文件
  5. 指定进程打开的文件
  6. 发现Listen指定端口的进程

组策略启动脚本

组策略启动脚本不执行

问题

  • 组策略启动脚本(Computer Policy -> Windows -> start script),不执行(10次中有一次可以).
  • 检查状态(gpupdate ,gpresult),策略已应用至本机, 本地执行脚本无问题.也排除权限问题(system账号,computer$域内机器账号)
  • 反复启动,检查开机日志发现1130错误(脚本无法启动,找不到对应文件), 发现其他错误NetLogon 无法找到域控(用户登录后域控正常) ,因脚本文件放在文件服务器上, 大致判定启动脚本运行时,计算机未完成网络连接.
  • 组策略已设置了网络就绪后应用脚本.最终在微软网站上查到的原因是 机器的千兆网卡(驱动问题)开机/重启连接网络时有延迟,但NetLogon会认为网卡已连接,投入运行, 造成错误.

解决方法

因为是公司域 ,使用组策略(Computer Policy -> Adm -> System -> Group Policy) , 设置启动策略处理等待时间(startup policy processing wait time ).

kubenetes 安装

我基本上是按照这篇文章的指导安装的.

Linux网桥的概念请参考这篇文章

  1. kubelet,kubeadm,kubectl的安装,使用阿里源
  2. docker-ce 安装,使用阿里源
  3. 关闭swap
    1
    2
    sudo swapoff -a
    sudo sed -i '/swap/s/^/#/' /etc/fstab
  4. 获取镜像(非MASTER NODE上,需要kube-proxy,pause),从阿里源pull,然后改名.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    kubeadm config images list
    images=(
    kube-apiserver:v1.13.4
    kube-controller-manager:v1.13.4
    kube-scheduler:v1.13.4
    kube-proxy:v1.13.4
    pause:3.1
    etcd:3.2.24
    coredns:1.2.6
    )
    for imageName in ${images[@]} ; do
    docker pull registry.aliyuncs.com/google_containers/$imageName
    docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.aliyuncs.com/google_containers/$imageName
    done
  5. 安装master(使用flannel网络,需指定pod-network-cidr)
    1
    kubeadm init --pod-network-cidr=10.244.0.0/16
  6. 应用flannel插件(非MASTER NODE上需要flannel镜像,具体的镜像名,可在下面的yml文件中找到.例如: query.io/coreos/flannel:v0.11.0-amd64)
    1
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml