一. selinux、established#
示例1:永久修改selinux
--------------------------------------------------------------------------------------------
[root@cPen_A ~]# vim /etc/selinux/config
SELINUX=disabled
============================================================================================
示例:排查连接不上 4.00 - 9.00没写完
ps -ef igrep sshd
lsof -i:2233
cat /etc/services
[root@cPen_B ~]# netstat -anplut igrep ssh
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2233 0.0.0.0:* LISTEN 911/sshd
tcp 0 36 192.168.0.31:2233 192.168.0.42:54290 ESTABLISHED 1402/sshd: root [pr
tcp6 0 0 :::2233 :::* LISTEN 911/sshd
udp 0 0 192.168.0.31:68 192.168.0.250:67 ESTABLISHED 893/NetworkManager
[root@cPen_B ~]# netstat -aplut igrep ssh
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:infocrypt 0.0.0.0:* LISTEN 911/sshd
tcp 0 36 cPen_B:infocrypt 192.168.0.42:54290 ESTABLISHED 1402/sshd: root [pr
tcp6 0 0 [::]:infocrypt [::]:* LISTEN 911/sshd
udp 0 0 cPen_B:bootpc 192.168.0.250:bootps ESTABLISHED 893/NetworkManager
##############################################################################################################
示例2:看当前系统有多少连接 (establish)
--------------------------------------------------------------------------------------------
[root@cPen_B ~]# netstat -anplut|grep -E "ESTABLISHED|LISTEN|TIME_WAIT"|awk -F" " {'print $6'}|sort|uniq -c
2 ESTABLISHED
2 LISTEN
#-------------------------------------------------------------------------------
[root@cPen_B ~]# netstat -anplut
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2233 0.0.0.0:* LISTEN 911/sshd
tcp 0 232 192.168.0.31:2233 192.168.0.42:54290 ESTABLISHED 1402/sshd: root [pr
#-------------------------------------------------------------------------------------------------------------
# pstree 查看进程之间的关系
# netstat 查看当前网络连接
二. SSH 访问控制#
SSH 使用 TCP Wrappers 实现访问控制 # 注:做访问控制
主要配置文件
- /etc/hosts.allow
- /etc/hosts.deny
TCP Wrappers 可以控制哪些服务
- 受 super daemon(xinetd)管理的服务 # 注:守护进程的服务
- 支持 libwrap.so 模块的服务
TCP Wrappers 的访问控制原则
首先检查 hosts.allow 文件,若找到相匹配的策略,则允许访问
否则继续检查 hosts.deny 文件,若找到相匹配的策略,则拒绝访问
如果两个文件中都没有相匹配的策略,则允许访问
#注:守护进程层面的控制
示例:/etc/hosts.deny
---------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A ~]# vim /etc/hosts.deny
sshd:192.168.0.31
# 注:访问控制,拒绝192.168.0.31 不需要重启服务,有守护进程帮它控制
#注:主机公钥在 /etc/ssh/ 下面 默认使用 ecdsa 模式
#注:known_hosts 文件里有什么 前面是 ip 地址,后面是公钥
#注:authorized_keys 放受信任的公钥
三. ssh 隧道#
#注:本地端口转发
CSDN https://www.cnblogs.com/keerya/p/7612715.html
端口转发:A、C、B 主机。主机 B 起了个 nginx 服务 端口号 80;主机 A 不能直接访问主机 B,但主机 A 可以访问主机 C,主机 C 可以访问主机 B (A-->C-->B);A 可以 ssh 到 C,A 跳到 C,然后访问 B 的 80 端口 (nginx)。现在 在主机 C 上面建立一个隧道,隧道开启 15577 端口连接 B 的 80 端口,A 去访问 15577 端口相当于去访问 B 的 80 映射
#注:ssh 隧道 第一个用于不能直接访问的情况;第二个考虑密文传输
[root@cPen_C ~]# lsof -i:15577 # 注:在C主机上操作,15577端口未被占用
[root@cPen_C ~]# ssh -g -L 15577:192.168.0.39:80 sanchuang@192.168.0.39 -p 2233
#注:192.168.0.39 右边B主机ip地址 # 注:在C主机上开通一个隧道 端口为15577
[root@cPen_A ~]# curl 192.168.0.48:15577 # 注:模仿网络访问 (80端口nginx网页使用curl访问)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> # 注:返回的内容
#注:192.168.0.48 中间C主机ip地址 # 注:注意防火墙 iptables -F
#注:访问中间C主机的15577端口 转接成右边B主机的80端口
#注:注意 不能绑定到本地的回环地址 127.0.0.1 只能访问自己 (所以 -g) -g作用 本地所有ip都是访问
#注:- L是本地端口转发
#注:一般可以开启65535个端口
#总结:ssh 隧道
端口转发
1、关闭防火墙
2、关闭 selinux
#本地端口转发
# ssh -g -L 15577:192.168.0.39:80 192.168.0.39 -p 2233 # 注:C 主机上执行 把 B 主机 80 端口映射本地 15577 端口*
B 主机 80 端口 B 主机
实验环境:
A 主机:192.168.0.132
C 主机:192.168.0.48
B 主机:192.168.0.39
在 C 主机上执行:[root@cPen_C ~]# ssh -g -L 15577:192.168.0.39:80 192.168.0.39 -p 2233
把 B 主机的 80 端口映射到本地的 15577 端口
访问 C 主机的 15577 端口就是访问 B 主机的 80 端口
#远程端口转发
# ssh -R 15566:192.168.0.39:80 -fN 192.168.0.132 -p 2233 # 注:C 主机上 把 B 主机 80 端口 映射到 A 主机 15566 端口
B 主机 80 端口 A 主机
远程端口转发:在 C 主机上执行:[root@C .ssh]# ssh -R 15566:192.168.0.39:80 -fN 192.168.0.132 -p 2233
把 B 主机的 80 端口映射到 A 主机的 15566 端口
访问 A 主机的 15566 就是访问 B 主机的 80
#注:A 主机 192.168.0.132
#注:B 主机 192.168.0.39
#注:在 C 主机上建立远程通道,在 C 主机上为 A 主机启动 15566 端口,映射到 B 主机
[root@cPen_A ~]# lsof -i:15566 # 注:A主机开启15566端口 sshd 2067 root 8u IPv6 38604 0t0 TCP localhost:15566 (LISTEN) # 注:监听的是本地回环地址 sshd 2067 root 9u IPv4 38605 0t0 TCP localhost:15566 (LISTEN) [root@cPen_A ~]# curl 127.0.0.1:15566 # 注:访问本地15566端口映射到B主机的80端口 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> # 返回的内容
四. ansible 服务#
ansible 是一个自动化运维工具的名称
基于 Python 开发,集合了众多运维工具的优点(puppet,fabric,slatstack),实现批量系统配置,程序的部署,批量运行命令等
.--------------------------------------------------------------------------------------------------------------------------------------------
Linux 运维:自动化(脚本),智能化,平台化
Linux 运维人员,人肉运维不可取
诞生了一系列的运维工具,ansible 就是其中之一
.--------------------------------------------------------------------------------------------------------------------------------------------
日常运维:
1、软件安装
2、服务的配置
3、运行脚本
4、升级
5、备份
.--------------------------------------------------------------------------------------------------------------------------------------------
ansible 基于 Python 开发,依赖于:paramiko,PyYaml 和 jinja 三个关键组件
基于 ssh 协议,只要…… 没写完
#其他服务需要部署 agent,而 ansible 只需要部署到 server,只要十万台的 key 都上传到其他机器上
#注:glibc 内核底层的库
.--------------------------------------------------------------------------------------------------------------------------------------------
#实验环境
a: 192.168.0.132(ansible)
c: 192.168.0.48
b: 192.168.0.39
实验前提,做好免密码认证,详见 ssh 服务
a --> b , a --> c a 可以免密码登录到 b 和 c
1、在 a 上安装 ansible
[root@cPen_A .ssh]# yum install epel-release # 注:安装 epel 源
[root@cPen_A .ssh]# yum install ansible # 注:安装 ansible
2、配置
配置目录:
/etc/ansible/ansible.cfg
ansible 的主配置文件,这个文件主要定义了 roles_path 路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改
/etc/ansible/hosts
这个配置文件就是默认的主机清单配置文件,可以通过 ansible.cfg 重新定义
备份 /etc/ansible/hosts 文件
编辑 /etc/ansible/hosts 文件
#将需要管理的主机添加到 webser 组
#如果通过 ssh 登录的端口不是 22 号端口,就需要在配置文件中指明端口号
[root@cPen_A ansible]# cp hosts{,.bak} # 注:备份 [root@cPen_A ansible]# ls ansible.cfg hosts hosts.bak roles [root@cPen_A ansible]# >hosts # 注:老的清空 [root@cPen_A ansible]# vim hosts [webser] 192.168.0.31:2233 192.168.0.55
ansible 组成:
1、host inventory --# 定义客户机,可以对客户机进行分类:db 类,web 类... 等等
2、playbook --# 剧本 让主机按照我给定的剧本去完成一些事情
3、module --# 模块 实现一个个功能的程序
4、pluging --# 插件 实现一些额外的小功能
.--------------------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A /]# cd /etc
[root@cPen_A etc]# ls |grep ansible
ansible
[root@cPen_A etc]# cd ansible
[root@cPen_A ansible]# ls
ansible.cfg hosts roles # 注:host定义主机清单
[root@cPen_A ansible]# less ansible.cfg
#inventory = /etc/ansible/hosts # 注:主机清单
#library = /usr/share/my_modules/
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp
……
[root@cPen_A ansible]# less hosts
## [webservers] # 注:[中括号]里webservers 组名 对这个组进行访问控制
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110
3、ansible使用
-m 指定模块名
HOST-PATTERN #匹配主机模式,如all表示所有主机
-m MOD_NAME #模块名 如:ping
-a MOD_ARGS #模块执行的参数
-f FORKS #生成几个子进行程执行
-C #(不执行,模拟跑)
-u Username #某主机的用户名
-c CONNection #连接方式(default smart)
.--------------------------------------------------------------------------------------------------------------------------------------------
ansible 主执行程序,一般用于命令行下执行
ansible-playbook 执行 playbook 中的任务
ansible-doc 获取各模块的帮助信息
.--------------------------------------------------------------------------------------------------------------------------------------------
[root@cPen_A ~]# ansible -h # 注:ansible -h帮助文档
#-------------------------------------------------------------------------
[root@cPen_A ~]# ansible
………………
ansible: error: too few arguments
[root@cPen_A ~]# which ansible
/usr/bin/ansible
[root@cPen_A ~]# ls -al /bin/ansible
lrwxrwxrwx 1 root root 20 11月 24 16:41 /bin/ansible -> /usr/bin/ansible-2.7
Ansible
[root@cPen_A ~]# ansible all -m shell -a "ip a" # 注:匹配所有主机 使用shell模块 执行ip a
#注:指定ansible……没写完都执行命令
[root@cPen_A ~]# ansible all -m shell -a "mkdir /tmp/sc"
……
192.168.0.55 | CHANGED | rc=0 >> # 注:返回0 执行执行成功
……
[root@cPen_A ~]# ansible webser -m shell -a "mkdir /tmp/sc" # 注:匹配webser组
192.168.0.55 | FAILED | rc=1 >> # 注:返回1 表示执行失败