第9章 使用ssh服务管理远程主机。
章节简述:
学习使用nmtui命令配置网卡参数、手工将多块网卡做绑定、使用nmcli命令查看网卡信息和使用ss命令查看网络及端口状态。
完整演示sshd服务配置方法并详细讲述每个参数的作用,实战基于密钥远程登陆实验以及用screen服务让远程会话不再终断。
本章目录结构
9.1 配置网卡连接网络
9.1.1 配置网卡参数
本实验需要两台虚拟主机来完成,分别是:
主机名称 | 操作系统 | IP地址 |
本地主机 | 红帽RHEL7操作系统 | 192.168.10.10 |
远程主机 | 红帽RHEL7操作系统 | 192.168.10.20 |
在正式配置sshd服务之前,我们必须保证本地主机与远程主机之间数据是可以互相传送的,前面在学习Vim编辑器的章节中修改过网卡文件,本次使用图形工具来配置网络,效果是一样的。
请您按照下面的幻灯片逐步操作,可点击图片两侧箭头或下方小圆点“○”切换步骤。
使用nmtui工具配置完网卡后请一定要再修改配置文件设置成"ONBOOT=yes"。
当您按照上述步骤配置完网卡后在本地主机执行"ping 192.168.10.20"来检测网络是否已经配置妥当。
9.1.2 查看网卡信息
nmcli是一款能够方便我们配置网络的工具,能够轻松的查看网卡信息或网络状态:
查看网卡的配置信息:
[root@linuxprobe ~]# nmcli connection show
NAME(网卡名称) | UUID(唯一识别码) | TYPE(网卡类型) | DEVICE(设备) |
eno16777736 | 13756690-ac77-b776-4fc1-f5535cee6f16 | 802-3-ethernet | eno16777736 |
查看网卡的连接状态:
[root@linuxprobe ~]# nmcli device status
DEVICE(设备) | TYPE(类型) | STATE(状态) | CONNECTION(连接) |
eno16777736 | ethernet | connected | eno16777736 |
lo | loopback | unmanaged | -- |
如果想看网卡设备"eno16777736"的详细信息,只需执行"nmcli con show eno16777736",信息相当详细哦!
对了!网卡还支持了简单实用的多会话功能了呢,例如将Linux系统安装到了笔记本上,上午拿到公司工作时是要指定IP地址,而晚上回到家是DHCP分配IP地址,这样改来改去真的很麻烦,所以我们可以设置多个网卡会话,在不同的环境激活就可以了,但每个网卡同时仅能有一个会话是激活状态的。
我们可以将在公司的会话叫做"company",在家里的会话叫做"house",记住了哦,现在配置!
添加公司会话,参数为connection(会话),add(添加动作),con-name(会话名称),type(网卡类型),ifname(网卡名称):
Connection 'company' (3a6677a8-59b0-4c8a-ae15-2a9f3e502f33) successfully added.
添加居家会话:
Connection 'house' (03f366a3-04b6-4545-a996-f10d7bffbf64) successfully added.
启用居家会话:
[root@linuxprobe ~]# nmcli connection up house
查看会话的信息:
[root@linuxprobe ~]# nmcli connection show
NAME(名称) | UUID(唯一标识符) | TYPE (网卡类型) | DEVICE(设备) |
house | 03f366a3-04b6-4545-a996-f10d7bffbf64 | 802-3-ethernet | -- |
company | 3a6677a8-59b0-4c8a-ae15-2a9f3e502f33 | 802-3-ethernet | -- |
eno16777736 | 13756690-ac77-b776-4fc1-f5535cee6f16 | 802-3-ethernet | eno16777736 |
实用nmcli命令创建或修改的会话配置信息回自动保存为网卡配置文件,重启后依然有效。
9.1.3 绑定两块网卡
我们可以将多块网卡多绑定操作,不仅能够提高带宽的速率而且让其中一块网卡出现故障时,不会让网络完全中断。
第1步:在虚拟机中额外添加一块网卡。
编辑虚拟机设置,添加网络适配器:
保证两块网卡的连接类型都是相同的:
查看两块网卡的名称:
[root@linuxprobe ~]# ifconfig | grep flags eno16777728: flags=4163>UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 eno33554968: flags=4163>UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
第2步:配置网卡的参数:
设置第1块网卡为从卡,而主卡为bond0:
[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777728 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=eno16777728 MASTER=bond0 SLAVE=yes
相似的方法设置第2块网卡,主卡依然为bond0:
[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno33554968 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=eno33554968 MASTER=bond0 SLAVE=yes
创建绑定网卡的配置文件并指定IP地址等信息:
[root@linuxprobe ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=bond0 IPADDR=192.168.10.10 PREFIX=24 DNS=192.168.10.1 NM_CONTROLLED=no
第3步:让内核支持Bonding的驱动。
为bond0网卡添加bonding驱动的支持:
[root@linuxprobe ~]# vim /etc/modprobe.d/bond.conf alias bond0 bonding options bond0 miimon=100 mode=6
常用的绑定驱动模式有:
mode=0平衡负载模式:平时两块网卡均工作,且自动备援,采用Switch支援。
mode=1自动备援模式:平时只有一块网卡工作,故障后自动替换为另外的网卡。
mode=6:平衡负载模式:平时两块网卡均工作,且自动备援,无须设置Switch支援。
第4步:重新加载网卡后绑定即成功。
重新加载网卡信息:
[root@linuxprobe ~]# systemctl restart network bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST> mtu 1500 inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::20c:29ff:fe9c:637d prefixlen 64 scopeid 0x20<link> ether 00:0c:29:9c:63:7d txqueuelen 0 (Ethernet) RX packets 700 bytes 82899 (80.9 KiB) RX errors 0 dropped 6 overruns 0 frame 0 TX packets 588 bytes 40260 (39.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno16777728: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500 ether 00:0c:29:9c:63:73 txqueuelen 1000 (Ethernet) RX packets 347 bytes 40112 (39.1 KiB) RX errors 0 dropped 6 overruns 0 frame 0 TX packets 263 bytes 20682 (20.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eno33554968: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500 ether 00:0c:29:9c:63:7d txqueuelen 1000 (Ethernet) RX packets 353 bytes 42787 (41.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 325 bytes 19578 (19.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
9.1.4 查看端口状态
有经验的管理员都会在配置网卡后顺手执行一条ping命令来检测网络的可用性,并且以前大家习惯用netstat命令查看本机的端口连接状态,这条命令也已经在红帽RHEL7系统中则被效率更高、显示信息更多的ss命令替代了。
ss命令用于查看本机的端口连接状态,具体的参数:
参数 | 作用 |
-a | 显示所有的套接字 |
-l | 显示所有连接状态的套接字 |
-e | 显示详细的套接字信息 |
-m | 显示套接字的内存使用情况 |
-p | 显示套接字的进程信息 |
-4 | 显示ipv4的套接字信息 |
-6 | 显示ipv6的套接字信息 |
-t | 仅显示tcp的套接字信息 |
-u | 仅显示udp的套接字信息 |
-n | 不解析主机名(提升速度) |
-s | 查看概述 |
查看监听状态中的套接字:
[root@linuxprobe ~]# ss -ntl
State | Recv-Q | Send-Q | Local Address:Port | Peer Address:Port |
LISTEN | 0 | 100 | 127.0.0.1:25 | *:* |
LISTEN | 0 | 128 | *:55820 | *:* |
LISTEN | 0 | 100 | *:22 | *:* |
LISTEN | 0 | 128 | 127.0.0.1:631 | *:* |
LISTEN | 0 | 128 | :::60863 | *:* |
查看进程名和PID号码:
[root@linuxprobe ~]# ss -s
Total: 1091 (kernel 1173) | |||
TCP: 11 (estab 0, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0 | |||
Transport | Total | IP | IPv6 |
* | 1173 | - | - |
RAW | 0 | 0 | 0 |
UDP | 13 | 8 | 5 |
TCP | 10 | 5 | 5 |
INET | 23 | 13 | 10 |
FRAG | 0 | 0 | 0 |
如果我们希望查看IP数据包从本机到另外一台电脑经过的路由信息,那就可以用tracepath命令啦!
这里格式非常简单:"tracepath 目标地址(域名或IP地址均可)",确实没什么可讲。
[root@linuxprobe ~]# tracepath www.linuxprobe.com
追踪从本地主机到《Linux就该这么学》的服务器中数据包经过了那些路由器,般来讲路由跳数越少,延时越低,访问速度越快哦!
出现问题?大胆提问!
因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~
Linux技术交流请加A群:560843(满),B群:340829(推荐),点此查看全国群。
*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。
9.2 远程控制服务
9.2.1 了解sshd服务
SSH(Secure Shell)是一种能够提供安全远程登陆会话的协议,假如希望在远程Linux系统中执行命令,就是通过这个协议啦!
为什么要强调SSH协议是安全的呢?因为比如ftp、telnet等服务在网络上不会对口令或数据进行加密,那么骇客们真的非常容易就可以截获这些信息(尤其是同局域网内的用户),因此它们在本质是就是不安全的。
sshd服务提供两种安全验证的方法:
基于口令的安全验证:经过验证帐号与密码即可登陆到远程主机。
基于密钥的安全验证:需要在本地生成"密钥对"后将公钥传送至服务端,进行公共密钥的比较。
sshd服务的配置文件解析:
[root@linuxprobe ~]# cat /etc/ssh/sshd_config
参数 | 作用 |
#Port 22 | 默认的sshd服务端口。 |
#ListenAddress 0.0.0.0 | 设定sshd服务端监听的IP地址。 |
#Protocol 2 | SSH协议的版本号。 |
#HostKey /etc/ssh/ssh_host_key | SSH协议版本为1时,私钥存放的位置。 |
HostKey /etc/ssh/ssh_host_rsa_key | SSH协议版本为2时,RSA私钥存放的位置。 |
#HostKey /etc/ssh/ssh_host_dsa_key | SSH协议版本为2时,DSA私钥存放的位置。 |
#PermitRootLogin yes | 设定是否允许root用户直接登录。 |
#StrictModes yes | 当远程用户私钥改变时则直接拒绝连接。 |
#MaxAuthTries 6 | 最大密码尝试次数 |
#MaxSessions 10 | 最大终端数 |
#PasswordAuthentication yes | 是否允许密码验证 |
#PermitEmptyPasswords no | 是否允许空密码登陆(很不安全) |
若您想要修改服务的配置参数,请一定要记得删除参数前面的注释符"#"并重启服务才生效的。
在远程主机上启动sshd服务并加入到开机启动项:
[root@localhost ~]# systemctl start sshd [root@localhost ~]# systemctl enable sshd
9.2.2 使用ssh命令
ssh命令用于远程管理Linux主机,格式为:“ssh [参数] 主机”。
参数 | 作用 |
-p | 指定连接端口(默认为22) |
-v | 显示连接过程的详细信息 |
[root@localhost ~]# ssh 192.168.10.20
The authenticity of host '192.168.10.20 (192.168.10.20)' can't be established.
ECDSA key fingerprint is 4f:a7:91:9e:8d:6f:b9:48:02:32:61:95:48:ed:1e:3f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.20' (ECDSA) to the list of known hosts.
root@192.168.10.20's password:此处输入远程主机root用户的密码
Last login: Wed Apr 15 15:54:21 2015 from 192.168.10.10
[root@localhost ~]#
9.2.3 安全密钥验证
使用密码验证终归会存在着被骇客暴力破解或嗅探监听的危险,其实也可以让ssh服务基于密钥进行安全验证(可无需密码验证)。
第1步:在本地主机中生成“密钥对”并将公钥传送到远程主机中:
[root@linuxprobe ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa):回车或设置密钥的存储路径 Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): 回车或设置密钥的密码 Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 40:32:48:18:e4:ac:c0:c3:c1:ba:7c:6c:3a:a8:b5:22 root@linuxprobe.com The key's randomart image is: +--[ RSA 2048]----+ |+*..o . | |*.o + | |o* . | |+ . . | |o.. S | |.. + | |. = | |E+ . | |+.o | +-----------------+
将生成好的公钥密钥传送至远程主机:
[root@linuxprobe ~]# ssh-copy-id 192.168.10.20 The authenticity of host '192.168.10.20 (192.168.10.20)' can't be established. ECDSA key fingerprint is 4f:a7:91:9e:8d:6f:b9:48:02:32:61:95:48:ed:1e:3f. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.10.20's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.10.20'" and check to make sure that only the key(s) you wanted were added.
第2步:首先要在远程主机中修改sshd服务的配置文件(修改后记得重启服务):
请您按照下面的幻灯片逐步操作,可点击图片两侧箭头或下方小圆点“○”切换步骤。
第3步:最后来尝试无需密码的远程登录吧:
[root@linuxprobe ~]# ssh 192.168.10.20 Last login: Mon Apr 13 19:34:13 2015
9.2.4 远程传输命令
要想将一些文件通过网络传送给其他主机,又恰好两台主机都是Linux系统,我们便可以直接用scp命令传输文件到另外一台主机~
scp命令用于在网络中安全的传输文件,格式为:“scp [参数] 本地文件 远程帐户@远程IP地址:远程目录”。
参数 | 作用 |
-v | 显示详细的连接进度 |
-P | 指定远程主机的sshd端口号 |
-r | 传送文件夹时请加此参数 |
-6 | 使用ipv6协议 |
将本地文件/root/out.txt传送到远程主机的/home目录:
[root@linuxprobe ~]# scp /root/out.txt 192.168.10.20:/home root@192.168.10.20's password:此处输入远程主机中root用户的密码 out.txt 100% 0 0.0KB/s 00:00
传送下文件夹并指定远程用户:
[root@linuxprobe ~]# scp -r results/ linuxprobe@192.168.10.20:/home linuxprobe@192.168.10.20's password:此处输入远程主机中linuxprobe用户的密码
强大的scp命令还可以将远程主机的文件传输到本地呢,格式为"scp [参数] 远程用户@远程IP地址:远程文件 本地目录"。
将远程主机的/etc/issue.net文件下载到本地的/root目录:
[root@linuxprobe ~]# scp linuxprobe@192.168.10.20:/etc/issue.net /root linuxprobe@192.168.10.20's password: issue.net 100% 22 0.0KB/s 00:00
9.3 不间断会话服务
9.3.1 了解Screen服务
学完了ssh服务后有没有发现一个很重要的事情——当连接的终端被关闭时,运行在服务器上的命令也会中断。如果有长时间文件备份或FTP传输等任务时,通常我们都会新开一个连接窗口再继续工作,并且中途不能关闭窗口或断开链接(也包括网络不稳定的情况),否则这个任务就会被中断,还要重新开始。
Screen便是为了解决上述问题而设计的,用户可以通过使用Screen命令同时控制多个命令行会话并自由切换,特点有:
会话恢复:即便网络中断,也可让会话随时恢复,用户不会失去对命令行的控制。
多窗口:每个会话都是独立运行的,拥有独立的编号、输入输出和窗口缓存。
会话共享:可以使多个用户从不同终端使用同一个会话,也可让他们看到完全相同的输出。
9.3.2 掌握命令参数
红帽RHEL7系统中默认没有包含screen,需要先来安装。
使用yum命令安装screen程序包:
[root@linuxprobe ~]# yum install screen Loaded plugins: langpacks, product-id, subscription-manager ………………省略部分安装信息……………… Installing: screen x86_64 4.1.0-0.19.20120314git3c2946.el7 rhel7 551 k ………………省略部分安装信息……………… Complete!
screen命令的常用命令参数包括:
参数 | 作用 |
-A | 让所有视窗自动调整适应当前终端机的大小。 |
-d <会话名称> | 将指定的screen会话离线。 |
-r<会话名称> | 将指定的screen会话恢复。 |
-h<行数> | 指定视窗的缓冲区行数。 |
-S<会话名称> | 指定screen会话的名称 |
-x | 恢复所有离线的会话。 |
-ls或-list | 显示当前的screen会话。 |
--wipe | 自动将无法使用的screen会话删除。 |
9.3.3 创建与使用会话功能
完成安装后直接运行screen即可使用服务,推荐为每个会话都取一个名字,方便分辨。
创建名称为backup的会话:
[root@linuxprobe ~]# screen -S backup
查看当前已经存在的会话:
[root@linuxprobe ~]# screen -ls There is a screen on: 32230.backup (Attached) 1 Socket in /var/run/screen/S-root.
当执行screen命令后会调用系统默认的shell(通常即bash),所以敲完screen命令后会立即返回一个命令提示符,虽然看起来与刚刚没有变化,但此时你已经进入screen会话啦!
创建一个会话,初始为用vim编辑器写文件:
[root@linuxprobe ~]# screen vim memo.txt
退出vim后会话也会被自动被删除:
[root@linuxprobe ~]# screen -ls There is a screen on: 32230.backup (Attached) 1 Socket in /var/run/screen/S-root.
新建一个叫做linuxprobe的会话:
[root@linuxprobe ~]# screen -S linuxprobe
列出当前所有会话(有两个哦):
[root@linuxprobe ~]# screen --ls There are screens on: 32403.linuxprobe (Attached) 32230.backup (Attached) 2 Sockets in /var/run/screen/S-root.
回到backup会话中:
[root@linuxprobe ~]# screen -r backup
将linuxprobe会话离线:
[root@linuxprobe ~]# screen -d linuxprobe [remote detached from 32403.linuxprobe]
再次查看会话状态(linuxprobe已经被离线了):
[root@linuxprobe ~]# screen -ls There are screens on: 32403.linuxprobe (Detached) 32230.backup (Attached) 2 Sockets in /var/run/screen/S-root.
将当前会话离线并回到linuxprobe会话中:
[root@linuxprobe ~]# screen -d -r linuxprobe [32403.linuxprobe detached.]
回到linuxprobe会话后,状态又改变了:
[root@linuxprobe ~]# screen -ls There are screens on: 32403.linuxprobe (Attached) 32230.backup (Attached) 2 Sockets in /var/run/screen/S-root.
总结来说:将screen会话甚至为暂时断开(detach),那么会话窗口中的程序依然会执行。随后将会话重新连接(attach),那么即可重新控制会话窗口中运行的程序啦。
9.3.4 会话共享功能
会话共享功能是一件很酷的事,它让多个用户同时使用某一个会话,甚至让您和对方看到相同的终端内容,拓扑如下:
将两台Linux主机均连入同一个服务器:
在主机A的终端上执行创建会话的操作:
[root@linuxprobe ~]# screen -S linuxprobe 在主机B的终端上同步会话信息: [root@linuxprobe ~]# screen -x
那么此时终端A与终端B上做的任何操作,都可以实时同步到对方的屏幕上,真的很酷哦!