跳板机:在一个拥有很多服务器的架构中,能够快速有效管理众多主机(批量分发文件、批量执行指令等)的一天管理主机。
重点功能:无需输入密码,就直接对其他主机进行远程操控
连接跳板机
由于跳板机设置在内网(接在vmnet2虚拟交换机),无法直接在win10使用xshell连接管理,需要利用网关做一个DNAT转换,实现使用xshell直接连接跳板机。
在server2主机的防火墙规则中添加以下规则:1
2
3
4##$WAN为ens33网卡,$admin_ip为跳板机IP
iptables -t nat -A PREROUTING -i $WAN -d 192.168.1.4 -p TCP --dport 1000 -j DNAT --to $admin_ip:22
##坚持forward检查点的规则,若是有阻拦现象,应该加入以下规则
iptables -t filter -A FORWARD -d $admin_ip -p TCP --drop 22 -j ACCEPT
ssh 远程主机IP
首先使用 [ssh 远程主机IP] 命令连接一下需要实现远程管理的主机。
原因一:测试跳板机是否能够远程连接主机。
原因二:让跳板机收录远程主机的指纹信息,第二次登陆时无需在进程指纹验证
公钥与私钥认证
私钥放在跳板机,公钥复制到需要被管理的远程主机
在跳板机生成公钥与私钥:1
2
3
4
5[root@admin ~/.ssh]# cd /root/.ssh/
[root@admin ~/.ssh]# ssh-keygen -t rsa (执行这条命令时,会有很多个过程,无需输入,直接按下回车键即可)
##三个文件分别是:私钥,公钥,被连接过的主机的指纹信息存放文件
[root@admin ~/.ssh]# ls
id_rsa id_rsa.pub known_hosts
把公钥拷贝到远程主机的/root/.ssh目录下(两种方法):
一.在跳板机执行拷贝命令(远程主机无/root/.ssh目录时,会自动创建)1
[root@admin ~/.ssh]# ssh-copy-id -i 192.168.60.5 #远程主机IP

验证:到目标远程主机的/root/.ssh下查看是否存在一个authorized_keys文件
二.使用scp命令远程1
2
3
4##远程拷贝公钥(可能不存在/root/.ssh目录,需要自己创建)
[root@admin ~/.ssh]# scp /root/.ssh/id_rsa.pub 192.168.60.5:/root/.ssh/
##进入远程主机的/root/.ssh目录下将id_rsa.pub文件重命名为authorized_keys文件
[root@server3 ~/.ssh]#mv id_rsa.pub authorized_keys
测试:[ssh 远程主机IP]—-执行此命令无需在重新输入密码就可以直接登录
实现远程主机批量管理
将远程主机的IP收录到跳板机中,做出一个IP列表1
2
3
4
5
6
7
8
9
10[root@admin ~/.ssh]# cat /root/ip.list
[getway]
1 192.168.1.4 #getway
[extranet]
2 192.168.1.5 #Extranet
[dns]
3 192.168.10.6 #dns-1
4 192.168.10.7 #dns-2
[http]
5 192.168.10.5 #http-1
编写实现批量执行命令的脚本: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
65
66
67
68
69
70
71
72
73
74
75
76
77[root@admin ~/.ssh]# cat /shell/admin-cmd.sh
#!/bin/bash
if [ $# -eq 0 ]
then
echo "ERROR:请输入要执行的命令"
exit 1
fi
file="/root/ip.list"
echo "=======管理列表========="
cat $file
echo "========================"
read -p "输入你要操作的主机号/主机组[A代表全部执行]:" name
#全部执行
if [[ "$name" = "A" ]]
then
ip_list=`grep "^[0-9]" $file | awk '{print $2}' | xargs`
for i in `echo $ip_list`
do
echo "======== $i=========="
ssh $i $*
done
exit 0
fi
ip_sum=`sed -n '${p}' $file | awk '{print $1}'`
#按编号执行
if [[ $name =~ ^[0-9] ]]
then
for i in `echo $name`
do
if [ $i -gt $ip_sum ]
then
echo "ERROR:IP编号超出范围......"
exit 1
fi
done
for j in `echo $name`
do
ip=`grep "^\<$j\>" $file | awk '{print $2}'`
echo "===========$ip============"
ssh $ip $*
done
exit 5
fi
#按分组执行
if [[ $name =~ ^[a-Z] ]]
then
ip_group=`grep "^[[]" $file | tr -d "[]" | xargs`
res=0
for i in `echo $name`
do
for j in `echo $ip_group`
do
if [ "$i" = "$j" ]
then
res=1
break
fi
done
if [ $res -eq 0 ]
then
echo "ERROR: 输入的名称有误,请检查 ..."
exit 1
fi
done
for x in `echo $name`
do
ip_group=`sed -n '/\<'$x'\>/,/^[[]/{p}' $file | grep "^[0-9]" | awk '{print $2}' | xargs `
for v in `echo $ip_group`
do
echo "=========== $v ============"
ssh $v $*
done
done
fi
执行脚本效果:
编写实现批量分发文件的脚本: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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89[root@admin ~/.ssh]# cat /shell/admin-file.sh
#!/bin/bash
if [ $# -lt 2 ]
then
echo "ERROR:参数个数不能少于两个....."
exit 1
fi
file="/root/ip.list"
target=`echo $@ | awk '{print $NF}'`
src=`echo $@ | awk '{$NF="";print}'`
for i in `echo $src`
do
if [ ! -e $i ]
then
echo "ERROR: 本地文件 $i 不存在,请检查后重新输入"
exit 1
fi
done
echo "=======管理列表========="
cat $file
echo "========================"
read -p "输入你要操作的主机号/主机组[A代表全部执行]:" name
#全部执行
if [[ "$name" = "A" ]]
then
ip_list=`grep "^[0-9]" $file | awk '{print $2}' | xargs`
for i in `echo $ip_list`
do
echo "========$i=========="
scp -rp $src $i:$target
done
exit 0
fi
ip_sum=`sed -n '${p}' $file | awk '{print $1}'`
#按编号执行
if [[ $name =~ ^[0-9] ]]
then
for i in `echo $name`
do
if [ $i -gt $ip_sum ]
then
echo "ERROR:IP编号超出范围......"
exit 1
fi
done
for j in `echo $name`
do
ip=`grep "^\<$j\>" $file | awk '{print $2}'`
echo "===========$ip============"
scp -rp $src $ip:$target
done
exit 5
fi
#按分组执行
if [[ $name =~ ^[a-Z] ]]
then
ip_group=`grep "^[[]" $file | tr -d "[]" | xargs`
res=0
for i in `echo $name`
do
for j in `echo $ip_group`
do
if [ "$i" = "$j" ]
then
res=1
continue
fi
done
if [ $res -eq 0 ]
then
echo "ERROR: 输入的名称有误,请检查 ..."
exit 1
fi
done
for x in `echo $name`
do
ip_group=`sed -n '/\<'$x'\>/,/^[[]/{p}' $file | grep "^[0-9]" | awk '{print $2}' | xargs `
for v in `echo $ip_group`
do
echo "===========$v============"
scp -rp $src $v:$target
done
done
fi
脚本执行效果:
注:有一个主机没有远程分发文件成功,是因为没有开机
脚本兼容性不高,若想脚本执行成功,需要把主机IP列表格式一样
最后更新: 2019年10月05日 10:08
原始链接: https://LiYuanSh.github.io/2019/08/27/运维实战三-跳板机的建立与管理/