一. selinux、established

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
示例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 文件,若找到相匹配的策略,则拒绝访问
  • 如果两个文件中都没有相匹配的策略,则允许访问

#注:守护进程层面的控制

1
2
3
4
5
示例:/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隧道 第一个用于不能直接访问的情况;第二个考虑密文传输

1
2
3
4
5
6
7
8
9
10
[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主机

1
2
3
4
5
[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号端口,就需要在配置文件中指明端口号

1
2
3
4
5
6
7
8
[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 --#插件 实现一些额外的小功能

.--------------------------------------------------------------------------------------------------------------------------------------------

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
[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 获取各模块的帮助信息

.--------------------------------------------------------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[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 表示执行失败