SSH代理(Agent)

问题 已知本地local可以ssh到server A和B, 问如何从server A ssh到server B,以及如何在server A 和B之间使用scp互传文件 ? 解决方案 配置ssh_config然后使用 ssh-add命令指定使用ssh agent可以很安全和高效的解决上面的两个问题。 配置ssh_config 注意看注释,下面脚本所有的操作和配置都是在 本地local上执行的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 vi .ssh/config ## 修改配置 添加forward agent HOST server-A HostName 1.2.3.4 User root IdentityFile ~/.ssh/serverA ForwardAgent yes # 现在 serverA可以和local本机的agent通信啦 HOST server-B HostName 6.7.8.9 User root IdentityFile ~/.ssh/serverB ForwardAgent yes # 现在 serverB可以和local本机的ssh agent 通信啦 rg Forward /etc/ssh/ssh_config ## 检查全局的forwordagent配置有没有被覆盖 echo "$SSH_AUTH_SOCK" ## 查看本地ssh agent是否在运行 ssh-add -L ## 查看/操作/删除 ssh agent hold的keys ssh-add -K li ssh-add -K ~/.ssh/serverA ## 给agent serverA 密钥,使得serverB 可以“使用” 这个密钥 ssh-add -K ~/.ssh/serverB ## 给agent serverB密钥,使得serverA可以“使用”这个密钥 ssh-add -K ~/.ssh/github ## 给阿根廷 github密钥,使得serverA, serverB都可以ssh github,方便测试 ssh-add -L 验证github 也是在本机local操作,以github作为测试目标: ...

April 12, 2020 · datewu

Expect自动化工具简介

公司服务器使用了两层跳板机,外面的一台我们管它叫 server A, 另外一台 叫它 server B。 虽然我不知道这种双保险给公司带来了多少安全感,但是我知道我的运维效率降低了差不多90%吧 :>。 server A被直接暴露在公网上, 我们不能使用 ssh key 只能使用 password认证ssh。 这还不算完,server A每3小时改一次自己的root密码。 后面的server B跳板机器的自我安全感就强多了,server B可以直接免密使用ssh key登陆所有的内网服务器,而且允许server A免密登陆到自己。 我决得这样两次登录很浪费时间,于是写了个脚本从外网一次性登陆到server B服务器上。 expect 脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #!/usr/bin/expect -f # for anyone not familar with expect # should read this awesome post # https://www.pantz.org/software/expect/expect_examples_and_tips.html set timeout 15 ### CHANGE pwd every 3h set pwd "mySuperSecretpwd123" set nested_ssh "ssh server_B" ## for debug # log_user 0 # exp_internal 1 send_user "going to connected to server A\n" spawn ssh -q -o StrictHostKeyChecking=no server_A expect { timeout { send_user "\ntimeout Failed to get password prompt, is VPN on?\n"; exit 1 } eof { send_user "\nSSH failure for server A\n"; exit 1 } "*assword:" } send "$pwd\r" expect { timeout {send_user "\nSSH failure for server B\n"; exit 1 } "Last login:*" } send "$nested_ssh\r" interact 基本语法 简单说下基本流程如下: ...

March 19, 2020 · datewu

容器PID

架构部的同事问了我两个问题: 宿主机上有个进程很耗 cpu,怎么判断它是不是某个容器的进程; 如果它是跑在容器里,怎么查到是哪个容器(container id); 解决方案 有两种方法来解决上面两个问题: cgroup 通过查看pid的cgroup是否含有 slice信息来判断是否是容器进程: 主机进程 cgroup 直接运行在宿主机主的进程的cgroup是没有slice信息的: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@deoops ~]# cat /proc/1/cgroup 11:perf_event:/ 10:memory:/ 9:devices:/ 8:cpuacct,cpu:/ 7:cpuset:/ 6:hugetlb:/ 5:blkio:/ 4:net_prio,net_cls:/ 3:freezer:/ 2:pids:/ 1:name=systemd:/ [root@deoops ~]# cat /proc/19/cgroup 11:perf_event:/ 10:memory:/ 9:devices:/ 8:cpuacct,cpu:/ 7:cpuset:/ 6:hugetlb:/ 5:blkio:/ 4:net_prio,net_cls:/ 3:freezer:/ 2:pids:/ 1:name=systemd:/ k8s pod进程 cgroup 在宿主机上看跑在容器进程的cgroup是可以看到slice信息的: ...

March 13, 2020 · datewu

安装wireguard server

今天在hacker news上看到 wireguard macos client 发布了,决定试用一下。 和所有的vpn安装一样,wireguard的安装也是分两步,一是安装vpn server,二是安装 vpn的client。 安装不分先后,配置先配置vpn server,然后再配置client。 服务端 安装wireguard server 服务器为 RHEL 7.6 (Maipo), 服务端的安装流程: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash sudo -i [root@deoops ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.6 (Maipo) [root@deoops ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf [root@deoops ~]# sysctl -p ### install packages [root@deoops ~]# curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo [root@deoops ~]# yum install -y epel-release wireguard-dkms wireguard-tools [root@deoops ~]# yum install -y epel-release [root@deoops ~]# rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm [root@deoops ~]# yum update -y [root@deoops ~]# yum install -y epel-release wireguard-dkms wireguard-tools [root@deoops ~]# init 6 配置wireguard server 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ### wireguard server conf [root@deoops ~]# cat wg.conf [Interface] ListenPort = 58855 PrivateKey = private_key [Peer] PublicKey = public_key_one #AllowedIPs = 0.0.0.0/0 AllowedIPs = 10.0.0.7/32 [Peer] PublicKey = public_key_two #AllowedIPs = 0.0.0.0/0 AllowedIPs = 10.0.0.9/32 启动服务端wg0 设备 记得加上iptables设置: ...

January 6, 2020 · datewu

挂载硬盘

update: more user friendly 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 #bin/bash mustBeRoot() { if [ "$(id -u)" != "0" ]; then echo "只有root用户才能运行" 1>&2 echo "当前登录用户`whoami`" exit 1 fi } # 数据盘挂载 checkAndMountDataDisk() { echo "选择数据盘/分区 :" fdisk -l | grep /dev | grep G | cut -f 1 -d , echo " " read -p "请输入硬盘/分区 名:/dev/" -r disk_name disk_id=`blkid | grep $disk_name` if [ $? -ne 0 ];then echo "获取硬盘/分区 $disk_name uuid失败,请检查名称是否准确" exit 1 fi disk_path=`echo $disk_id | cut -f 1 -d ':' ` echo "已选择 $disk_path" disk_uuid=`blkid $disk_path | cut -f 2 -d '"' ` disk_info=`lsblk -f $disk_path | grep $disk_uuid ` if [ $? -ne 0 ];then echo "获取硬盘/分区 $disk_path 详细信息失败,请检查名称是否正确" exit 1 fi fs_type=`echo $disk_info | cut -f 2 -d ' '` if [ $fs_type != 'ext4' ];then echo "硬盘文件系统格式不是ext4。" read -p "是否格式化为 ext4? 输入 y 同意格式化" -r format_ext4 if [ $format_ext4 != 'y' ];then echo "未格式化 $disk_path 文件系统格式,退出安装脚本。" exit 1 fi echo "即将格式化 $disk_path 文件系统格式...." mkfs.ext4 $disk_path fi if [ -d "$1" ];then echo "数据盘挂载点/data目录已存在" else echo "创建数据盘挂载点/data目录" mkdir $1 fi mount UUID=$disk_uuid $1 echo "UUID=$disk_uuid $1 ext4 defaults 0 0" >> /etc/fstab echo "硬盘挂载成功" } checkDataMountpoint() { echo '挂载数据盘' grep "$1" /etc/fstab | grep ext4 if [ $? -ne 0 ];then checkAndMountDataDisk else echo '数据盘已挂载' mount -a fi cpAndUntar } mustBeRoot checkDataMountpoint ${1-/data} lsblk 首先使用lsblk查看当前系统硬盘挂载的情况 ...

October 18, 2019 · datewu

证书问题

docker run调试某个container报如下所示x509证书错误,一开始怀疑是容器网络(--network host) 的问题 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [deoops@dev-3 ~]# docker run --network host datewu/controller:v0.0.2 {"level":"panic","error":"Get https://google.com: x509: certificate signed by unknown authority","time":1555498448,"message":"get max item failed"} panic: get max item failed goroutine 26 [running]: github.com/rs/zerolog.(*Logger).Panic.func1(0x7773e9, 0x13) /Users/deoops/go/pkg/mod/github.com/rs/[email protected]/log.go:307 +0x4f github.com/rs/zerolog.(*Event).msg(0xc00012e8a0, 0x7773e9, 0x13) /Users/deoops/go/pkg/mod/github.com/rs/[email protected]/event.go:141 +0x1c1 github.com/rs/zerolog.(*Event).Msg(...) /Users/deoops/go/pkg/mod/github.com/rs/[email protected]/event.go:105 main.catchUp() /Users/deoops/github/controller/work.go:69 +0x326 main.populate(0xc000114000) /Users/deoops/github/controller/worker.go:10 +0x26 created by main.initWork /Users/deoops/github/controller/work.go:84 +0x7f 错误信息大概是说 client 不能识别google的https 证书, 可能是base image alpine的问题。 ...

September 12, 2019 · datewu

细说kubeconfig

今天准备管理某一个kubernetes 集群时发现master主机22端口因为管理的需要被禁用了,无法登陆服务器。 问了一下运维人员,原来是基于安全原因,公司决定禁用所有服务器的root ssh登陆权限, 平时我都是ssh 登陆到master node,在服务器上直接使用kubectl命令 查看/部署/debug deployment/service等资源, 现在只好修改下本地 kubeconfig 文件,用自己本地的 kubectl 管理/操作kubernetes集群。 操作了一段时间后,发现用本地kubectl操作kubernetes体验蛮好的,特别是服务器缺少本地editor(vim) kubectl edit ... 的语法高亮支持。 配置kubeconfig过程分享如下,大体上说过就两步: 添加 context; use context。 1 2 vim .kube/config kubectl config use-context dev-8-admin@kubernetes 除了使用vim 编辑 .kube/config 文件,对于一些简单的配置也可以使用kubectl config command 快速配置kubeconfig: 1 2 3 4 5 6 7 8 9 10 11 12 13 ## create new cluster kubectl config set-cluster NAME [--server=server] [--certificate-authority=path/to/certificate/authority] [--insecure-skip-tls-verify=true] ## create new user kubectl config set-credentials NAME [--client-certificate=path/to/certfile] [--client-key=path/to/keyfile] [--token=bearer_token] [--username=basic_user] [--password=basic_password] [--auth-provider=provider_name] [--auth-provider-arg=key=value] [options] ## create new context kubectl config set-context [NAME | --current] [--cluster=cluster_nickname] [--user=user_nickname] [--namespace=namespace] [options] ## use context kubectl config use-context CONTEXT_NAME [options] 另外,kubectl config set 不支持对 certificate-authority-data字段的设置,只支持指定data文件的路径, 所以推荐用vim 编辑kubeconfig文件。 ...

August 11, 2019 · datewu

Systemd配置问题

问题 用 kubeadm 部署 kubernetes 集群,启动kubelet服务后,kubelet daemon 会认为 /etc/sysconfig/kubelet内容的优先级更高, 覆盖KUBELET_EXTRA_ARGS环境变量--pod-infra-container-image的配置内容。 分析 kubelet.service文件 首先查看/etc/systemd/system/kubelet.service文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 # cat /etc/systemd/system/kubelet.service [Unit] Description=kubelet: The Kubernetes Node Agent Documentation=https://kubernetes.io/docs/ [Service] ExecStart=/usr/bin/kubelet Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.target 注意第5行的ExecStart指令为/usr/bin/kubelet kubelet.service.d 目录 然后查看kubelet服务的配置目录/etc/systemd/system/kubelet.service.d/,注意 kubeadm会在这里创建一个10-kubeadm.conf文件来配置kubelet启动方式(参数)。 1 2 3 4 5 6 7 8 9 10 11 12 13 # cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # Note: This dropin only works with kubeadm and kubelet v1.11+ [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. EnvironmentFile=-/etc/sysconfig/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS 配置文件的load的顺序是以字母顺序排列的, 如果我们也在这里创建了kubelet的配置文件,比如20-my-kubelet.conf,10-*会先被读取,20-*其次。 ...

May 11, 2019 · datewu

Neutron小记

前段时间的花了很多功夫对接k8s和openstack的kuryr-kubernetes网路组件。 学到了很多openstack的知识,今天抽出时间来整理下。 client 首先是 install openstack-cli neutron client: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash [root@deoops ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.5 (Maipo) #### add openstack yum repo source [root@deoops ~]# vi /etc/yum.repos.d/openstack.repo [root@deoops ~]# yum install -y python2-openstackclient openstack-neutron [root@deoops shells]# cat source export OS_PROJECT_DOMAIN_NAME=default export OS_USER_DOMAIN_NAME=default export OS_PROJECT_NAME=your_project_name export OS_USERNAME=your_use_name export OS_PASSWORD=your_pwd export OS_AUTH_URL=http://10.8.1.3:35357/v3 export OS_IDENTITY_API_VERSION=3 export OS_IMAGE_API_VERSION=2 vip 我们来创建一个virtual IP验证上一步配置的openstack source对不对 : ...

April 21, 2019 · datewu

Mysql Autocommit问题

客户反馈我们的产品有个很奇怪的问题。 添加完商品后,可以看到商品,但是一刷新页面,刚才添加的商品就消失啦。 以前没碰到过,一直都用的好好的为什么今天就不行了呢? 分析问题 既然一刷新即消失了,就证明没有写入到数据库。 没写入到数据库是什么原因呢? API 也没有报错呀? 更加奇怪的是,有的页面有这个问题,有的没有这个问题。 后端的API 有的是golang写的,有的是Java写的。 golang orm对mysql 数据库的写操作存在上面说的刷新就丢失的问题,Java的orm对mysql的写操作没有问题。 这是为什么呢? DBA 排查了很久发现原来是客户那边的DBA把 mysql的 session autocommit的配置关闭啦。 autocommit 翻了下文档,确定 Java的orm框架会忽略mysql server的配置默认自己commit,golang的orm则没有这个优化(也许是有但我们没有启用?)。 所以会出现 java的后端是正常的,golang的后端写不了mysql。 解决方案 客户DBA开启autocommit配置项后,产品业务恢复正常。

April 12, 2019 · datewu