一. selinux、established#
示例1:永久修改selinux
--------------------------------------------------------------------------------------------
[root@cPen_A ~]# vim /etc/selinux/config
SELINUX=disabled
============================================================================================
示例:排查連接不上 4.00 - 9.00沒寫完
ps -ef | grep sshd
lsof -i:2233
cat /etc/services
[root@cPen_B ~]# netstat -anplut | grep 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 | grep 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 表示執行失敗