ssh: (secure shell)
SSH 为建立在应用层基础上的安全协议,端口号为22/tcp
功能
具体的软件实现:
SSH协议版本
用户登录认证:
示例1:连接格式
'1. 连接目标主机以v9用户登录'
[root@hai7 ~]$ssh [email protected]
'2. 连接目标主机执行命令后退回'
[root@hai7 ~]$ssh [email protected] 'cat /etc/centos-release'
'3. 第二种格式,效果相同'
[root@hai7 ~]$ssh -l v9 172.20.50.201
'4. 简写方式默认以root方式连接 '
[root@hai7 ~]$ssh 172.20.50.201
示例2:更改默认端口,修改服务器配置文件vim /etc/ssh/sshd_config如下项
'1. 修改配置文件'
[root@hai7 ~]$vim /etc/ssh/sshd_config
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22 <==去掉注释,更改端口
Port 10086 <==修改后效果
'2. 重新读入一次,新端口生效'
[root@hai7 ~]$systemctl reload sshd
'3. 更改后再远程连接需要加上-p选项'
[root@hai7 ~]$ssh [email protected] -p 10086
'4. 如果服务器端口都更改为10086,可以考虑将客户端默认连接端口改为10086就不需要每次加-p选项'
[root@hai7 ~]$vim /etc/ssh/ssh_config
# Port 22 <==去掉注释,修改为10086
# Protocol 2
示例3:指定客户端ip去链接目标地址
[root@hai7 ~]$ssh -b 172.20.50.100 192.168.121.66
示例4:在CentOS6图形界面上使用终端连接CentOS7(172.20.121.4),打开7上的图形工具nm-connection-editor
'1. 使用ssh直接连接,显示如下,打不开'
[root@os6 ~]$ssh 172.20.121.4
[root@os7 ~]$nm-connection-editor
(nm-connection-editor:11120): Gtk-WARNING **: cannot open display:
'2. 想要远程打开目标服务器的图形工具,需要配合选项-X,例如远程安装oracle数据库,此时CentOS6充当X协议的服务器(server),CentOS7充当X协议的客户端(client)'
[root@os6 ~]$ssh -X 172.20.121.4
示例5:在Windows环境管理Linux系统
示例6:服务器A只允许B连接,C可以连接B,C想要连接A,通过B来跳转,期间需要输入输入2次口令,分别为B、A的密码
ssh ssh -t remoteserverB ssh -t remoteserverA
[root@localhost ~]$ssh 172.20.50.201
The authenticity of host '172.20.50.201 (172.20.50.201)' can't be established.
ECDSA key fingerprint is SHA256:GFmkHQ3S85LfqblqjPjOF3InnScqL9HIS+UZw3MDzro.
"通过SHA256哈希运算服务器的公钥"
ECDSA key fingerprint is MD5:21:bb:99:04:c1:bd:9f:db:60:b1:5d:7d:79:0a:d5:ed.
"通过MD5哈希运算服务器的公钥"
Are you sure you want to continue connecting (yes/no)?
获取公钥哈希值
'CentOS7为例,服务器端找到以ssh_host_ecdsa_key.pub,拷贝副本'
[root@hai7 ssh]$cp ssh_host_ecdsa_key.pub ssh_host_ecdsa_key.pub1
'将其上下注释去掉,base64 -d还原文本,生成文件f1'
[root@hai7 /etc/ssh]$base64 -d ssh_host_ecdsa_key.pub1>f1
'运算得到哈希值'
[root@hai7 /etc/ssh]$md5sum f1
21bb9904c1bd9fdb60b15d7d790ad5ed f1
[root@hai7 ~]$ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
'将生成的密钥保存至,默认为/root/.ssh/id_rsa'
Enter passphrase (empty for no passphrase):
'为密钥加密'
[root@hai7 ~/.ssh]$ll -a
-rw------- 1 root root 1675 Sep 17 20:41 id_rsa
'生成的私钥'
-rw-r--r-- 1 root root 393 Sep 17 20:41 id_rsa.pub
'生成的公钥'
[root@hai7 ~]$ssh-copy-id -i /root/.ssh/id_rsa.pub 172.20.129.251
[root@hai7 ~/.ssh]$ssh 172.20.129.251
Last login: Sun Sep 16 01:28:20 2018 from 172.20.129.183
'1. 如果不指定路径,会交互式问答要求输入密钥路径'
[root@hai7 .ssh]$ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa): /data/.ssh/id_rsa
'2. 如果需要写入脚本可也可以如下写法,直接修改'
[root@hai7 .ssh]$ssh-keygen -p -f "/data/.ssh/id_rsa" -P "abc" -N "123"
'3. 加密后的私钥会多出如下行'
[root@hai7 ~/.ssh]$cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED '<==已被加密,使用的是AES-128算法'
DEK-Info: AES-128-CBC,9FEBEF484BDEECB537DCA17308D3A843
ssh-agent bash
来激活代理[root@hai7 ~/.ssh]$ssh-add
Enter passphrase for /root/.ssh/id_ras:
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
[root@hai6 ~/.ssh]$cat id_rsa_1024.pub >>authorized_keys
测试,在Xshell对话框,新建连接,填写登录主机(有公钥的主机)ip,点击用户身份验证,方法选择Public key,输入用户名,选择密钥,输入私钥密码,确定连接。
如果是SecureCRT生成的公钥,需要导入登录主机后转化为openssh兼容格式,权限必须为600,命令如下
[root@hai6 ~/.ssh]$ssh-keygen -i -f *.pub >> .ssh/authorized_keys
'1. 将文件拷贝到目标主机'
[root@hai7 ~]$scp /etc/passwd/ 192.168.32.6:/data
'2. 将目标文件拷贝至本机'
[root@hai7 ~]$scp 192.168.32.6:/etc/passwd /data/
'3. 在本机上,将目标A192.168.32.6的文件拷贝给目标B192.168.32.17'
[root@hai7 ~]$scp 192.168.32.6:/etc/passwd 192.168.32.17:/data
'1. 从A主机拷贝文件f1、f2、f3至主机B'
[root@hai7 ~]$scp -p f* 172.20.50.150:/data
f1 100% 13 28.3KB/s 00:00
f2 100% 7 17.3KB/s 00:00
f3 100% 10 23.6KB/s 00:00
'2. 然后在A主机更改文件f2其他文件不变,再次执行'
[root@hai7 data]$echo abc>>f1
'3. 再次执行,会将所有文件再次拷贝一次'
[root@hai7 ~]$scp -p f* 172.20.50.150:/data
f1 100% 17 5.4KB/s 00:00
f2 100% 7 4.8KB/s 00:00
f3 100% 10 7.4KB/s 00:00
'4. 使用rsync命令重复操作,reync只复制更改的文件'
[root@hai7 data]$rsync -v f* 172.20.129.251:/data
f1
sent 117 bytes received 40 bytes 12.56 bytes/sec
基于ssh和rsh服务实现高效率的远程系统之间复制文件
需要注意的格式
rsync –av /etc server1:/tmp 复制目录和目录下文件
rsync –av /etc/ server1:/tmp 只复制目录下文件
选项:
-n:模拟复制过程
-v:显示详细过程
-r:递归复制目录树
-p:保留权限
-t:保留时间戳
-g:保留组信息
-o:保留所有者信息
-l:将软链接文件本身进行复制(默认)
-L:将软链接文件指向的文件复制
-a:存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
sftp命令
交互式文件传输工具,用法和传统的ftp工具相似
利用ssh服务实现安全的文件上传和下载
格式
sftp [user@]host
[root@hai7 .ssh]# sftp 172.20.129.251
获取帮助
进入交互界面后输入?或help
[root@hai7 .ssh]$sftp 172.20.129.251
[email protected]'s password:
Connected to 172.20.129.251.
sftp> ? <==获取帮助
Available commands:
bye Quit sftp
cd path Change remote directory to path
pssh是一个python编写可以在多台服务器上执行命令的工具,也可实现文件复制,来自epel源
示例1:密码验证-A选项,连接目标主机并执行命令hostname
1. '完整格式'
[root@hai7 ~]$pssh -H [email protected] -A -i hostname
2. '省略格式,默认用户为root'
[root@hai7 ~]$pssh -H 172.20.129.251 -A hostname
[1] 21:51:20 [SUCCESS] 172.20.129.251
'不加-i选项只会提示执行成功失败,不显示内容'
[root@hai7 ~]$pssh -H 172.20.129.251 -A -i hostname
[1] 21:52:03 [SUCCESS] 172.20.129.251
hai6
示例2:基于key验证,连接多台主机执行命令hostname,默认为k验证,不需要加选项
[root@localhost~]$pssh -H "172.20.129.251 172.20.50.201" -i hostname
[1] 21:52:03 [SUCCESS] 172.20.50.201
已经做过基于key验证的主机,登录成功
hai7
[2] 20:11:02 [FAILURE] 172.20.129.251 Exited with error code 255
172.20.129.251没有做基于key验证的主机,验证失败
Stderr: pssh error: SSH requested a password. Please create SSH keys or use
the -A option to provide a password.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
示例3:-h选项,将ip放入文件中,批量执行
[root@localhost]$touch f1
[root@localhost]$echo 172.20.50.201>>f1
[root@localhost]$pssh -h f1 -i ls
示例4:通过pssh批量关闭seLinux
pssh -H [email protected] -i "sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config"
示例5:将标准错误和标准正确重定向都保存至/data目录下
[root@localhost]$pssh -H "172.20.129.251 172.20.50.201" -o /data -e /data -A -i hostname
会自动生成以ip命名的文件夹来存放
[root@localhost]$ls
172.20.129.251 172.20.50.201 f1 shanwuyu.key
pscp.pssh功能是将本地文件批量复制到远程主机
[root@hai7 ~]$pscp.pssh -H 172.20.50.201 /data/a.sh /data/
示例2:将本地多个文件批量复制到/app/目录
[root@hai7 ~]$pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh /app/
示例3:将本地目录批量复制到/app/目录
[root@hai7 ~]$pscp.pssh -H 192.168.1.10 -r /root/test/ /app/
pslurp功能是将远程主机的文件批量复制到本地
[root@hai7 ~]$pslurp -H 192.168.1.10 -L /app/ /var/log/messages user
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。而且,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。
例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯
SSH 端口转发能够提供两大功能:
例如在局域网中的服务器,限制了只有局域网中的客户机才可以访问此服务器,外部客户端想要访问,就需要通过本地端口转发
本地转发格式
-L
例如ssh -L 10086:172.20.50.121:23 172.20.169.50
选项:
-f 后台启用
-N 不打开远程shell,处于等待状态
-g 启用网关功能
示例
客户端A想要使用telnet服务连接文件服务器C,而telnet服务时明文的,不安全。
使用SSH隧道功能,将telnet服务包在SSH中,以达到安全连接的目的。
前提是客户机A要有与服务器B连接SSH的能力
在客户机A上操作,开通与SSH服务器的隧道
在客户端A开一个端口10086来连接SSH服务器B,开通隧道
[root@haiA ~]$ssh –L |10086:|172.20.129.50:|23 |172.20.50.121|
|客户端A连接SSH服务器B的端口|目标服务器C的ip|C的端口|SSH服务器ip|
上例只是登录到SSH服务器B上,加上选项-N,会在当前shell中等待执行指令,终端不释放,客户机A不能执行其他操作
[root@haiA ~]$ssh -L 10086:172.20.129.50:23 -N 172.20.50.121
配合-f选项,后台执行,不影响
[root@haiA ~]$ssh -L 10086:172.20.129.50:23 -Nf 172.20.50.121
当A访问本机的10086的端口时,会通过ssh服务将据被加密后转发到SSH服务器B的,B再解密信息转发到C:23
[root@haiA ~]$telnet 127.0.0.1 10086
输入口令登录
客户端A
[root@haiA ~]$ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 127.0.0.1:51562 127.0.0.1:10086
'本机服务器开随机端口10086接收数据,10086通过SSH封装数据'
ESTAB 0 0 192.168.50.100:53198 172.20.50.121:22
'将封装后的数据再开一个随机端口发送给远程服务器上'
[root@haiB ~]$ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 172.20.50.121:49638 172.20.129.50:23
'SSH服务器B充当客户端A与C连接'
ESTAB 0 0 172.20.50.121:22 192.168.50.100:53198
[root@haiC ~]$ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 172.20.129.50:23 172.20.50.121:49638
通常情况下,外部网络是不能直接使用ssh服务与防火墙内部的主机连接,而内部网络是可以向外通讯的,可以由内部向外搭接隧道,来达成远程转发,依然以上例图为例。
在实际工作中搭接要注意telnet服务器地址为公网地址,不然连接不了
[root@haiB ~]$ssh -R 10086:172.20.129.50:23 -fN 192.168.50.100
| 1 | 2 | 3 | | 4 |
|A:ssh端口|:Cip|:Ctelnet端口| | Aip |
充当telnet客户端以及ssh的客户端
[root@haiA ~]$telnet 127.0.0.1 10086
反向连接,客户端A充当的是SSH的服务器
[root@haiD ~]$iptables -A INPUT -s 172.20.50.100 -j REJECT
[root@haiD ~]$iptables -A INPUT -s 172.20.50.201 -j REJECT
[root@haiB ~]$ssh -L 10086:172.20.50.150:23 172.20.50.202 -fgN
[root@haiB ~]$telnet 172.20.50.201 10086
$ssh -R 10086:D:25 B -fgN
当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet
'启动httpd服务'
[root@haiB ~]$service httpd start
'将google放入名/var/www/html/index.html,伪装google页面'
[root@haiB ~]$echo www.google.com>/var/www/html/index.html
加入名字DNS解析,将192.168.32.6伪装为google,这里只是做实验,正常不这么配
[root@haiC ~]$vim /etc/hosts
192.168.32.6 www.google.com
字符界面,检验搭建情况
[root@haiC ~]$curl www.google.com
图形界面
[root@haiC ~]$firefox www.google.com
[root@haiA ~]$iptables -A INPUT -s 172.20.50.201 -j REJECT
[root@haiA ~]$ssh -D 10086 172.20.50.150 -fN
[root@haiC ~]$ssh -D 10086 172.20.50.150 -fgN
字符界面
[root@haiD ~]$curl --socks5 172.20.50.201:10086 http://www.google.com
图形界面
配置浏览器,在浏览界面选择菜单preferences→ Advanced→ Network→ Seting→ Manual proxy configuration→ SOCKS Host 172.20.50.201 Port:10086
SSH服务器端 配置文件
修改服务器端配置时,建议先备份
/etc/ssh/sshd_config
常用参数
#Port 22
'建议修改为非常规端口'
#AddressFamily any
'支持ipv4/ipv6,any为都支持'
#ListenAddress 0.0.0.0 <==指定那个IP地址来监听服务端口port
listenaddress 172.20.251.121 <==添加一行指定监听端口
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
'key验证算法相关'
'连接centos6优先使用RSA key'
'连接centos7优先使用EXDSA key'
#LoginGraceTime 2m
'登录宽限时长,也就是等待输入密码时间'
#PermitRootLogin yes
'改为no,不予许root连接登录 <==解决方法,用普通账户登录,然后su -root'
ListenAddress ip
#StrictModes yes
'检查.ssh/文件的所有者,权限等,改为no就会跳过,不检查这些属性'
#MaxAuthTries 6
'最大尝试连接次数,为指定值的一半'
#MaxSessions 10 同一个连接最大会话
'每一个网络连接开启的会话'
AuthorizedkeysFile .ssh/authorized_keys
'基于key验证,公钥的存放文件'
#PubkeyAuthentication yes
'支持基于key验证'
PasswordAuthentication yes
'支持用户密码验证'
GSSAPIAuthentication yes
'提高连接速度可改为no'
GatewayPorts no
'是否允许远程主机连接本地的转发端口'
UseDNS yes
'提高连接速度可改为no'
#AllowAgentForwarding yes
'允许代理转发'
#AllowTcpForwarding yes
'允许Tcp转发'
#MaxStartups 10:30:100
'未认证连接超过10时, 限制30%的连接,多大为100个连接'
PermitEmptyPasswords no
'是否允许空口令登录'
#ClientAliveInterval 0
'每过多少秒,探测一次连接用户是否活动'
#ClientAliveCountMax 3
'最大探测次数,超过后断开'
Banner /path/file <==如:/etc/ssh.txt
'登录提示语句,指定一个文件路径,在文本中写入提示语,ssh连接是会显示文本内容'
例如 在配置文件中加如下行,v9为另一台主机的用户
AllowUsers v9
只允许用户v9连接
DENYUSERS v9
拒绝用户v9连接
dropbear是一个较小的SSH服务器和客户端,使用时避免与SSH冲突,更改与SSH不同的端口
源码编译安装:
make install
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
touch /etc/profile.d/dropber.sh
PATH=/app/dropbear/bin:/app/dropbear/sbin:$PATH
/etc/profile.d/dropbear.sh
mkdir /etc/dropbear
dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
dropbearkey -t dss -f /etc/dropbear/dropbear_dsa_host_key
dropbear -p :2222 -F –E
dropbear -p :2222
客户端访问:
简写:dbclient 172.20.50.201
当做服务器使用
命令:dropbear
选项
-F:不在后台执行
-E:记录错误信息而不在日志中,将错误信息在屏幕打印
-p:指定端口
-r :基于key登录
-P:运行进程的端口pid文件,默认为/var/run/dropbear.pid
如:dropbear -FEp 2222 打开一个2222的端口作为连接服务器
dropbear传输文件命令scp
示例:可能出现的错误
1. 将文件/etc/fstab发送给192.168.32.6存放在其家目录下
[root@hai7-7 ~]$scp /etc/fstab 192.168.32.6:
/usr/bin/dbclient:No such file or directory <==报错
lost connection
错误原因,scp调用dbclient,程序执行时调用的是PATH变量,找不到/app/dropbear/bin
解决方法:
1.将文件拷贝到/usr/bin/下
2.创建软连接:ln -s /app/dropbear/bin/dbclient /usr/bin/dbclient
/app/dropbear/sbin/dropbear -p 2222