前言 SSH 简介
Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议. 它是专为远程登录会话 (甚至可以用 Windows 远程登录 Linux 服务器进行文件互传) 和其他网络服务提供安全性的协议, 可有效弥补网络中的漏洞. 通过 SSH, 可以把所有传输的数据进行加密, 也能够防止 DNS 欺骗和 IP 欺骗. 还有一个额外的好处就是传输的数据是经过压缩的, 所以可以加快传输的速度. 目前已经成为 Linux 系统的标准配置.
SSH 只是一种协议, 存在多种实现, 既有商业实现, 也有开源实现. 本文主要介绍 OpenSSH 免费开源软件, 如果要在 Windows 中使用 SSH, 需要使用另一个软件 PuTTY.
SSH 的优势, 网络传输服务程序不止有 SSH, 还有很多. FTP,Pop 和 Telnet 其本质上都是不安全的; 因为它们在网络上用明文传送数据, 用户帐号和用户口令, 很容易受到中间人 (man-in-the-middle) 攻击方式的攻击. SSH 可以通过 RSA 加密对传输内容加密, 并且压缩, 所以相对较快, 较安全.
SSH 的验证方式有两种: 帐密验证和公钥私钥验证, 第二种方式相对较安全.
一, SSH 服务程序
相关联的 RPM 包: openssh(底层包) , openssh-clients , openssh-server
服务器端安装: yum install openssh-server (安装了 openssh-server 会自动安装 openssh)
客户端安装: yum install openssh-clients (安装了 openssh-clients 会自动安装 openssh)
卸载: yum remove openssh (卸载了 openssh, 然后会自动卸载 openssh-server 和 openssh-clients)
服务:/usr/sbin/sshd
服务端口: tcp / 22
服务器端配置文件:/etc/SSH/sshd_config
客户端配置文件: /etc/SSH/ssh_config
用法: SSH -p 22 [email protected] , 如果配置文件中 /etc/SSH/ssh_config 默认是 22 号端口, 则可以直接 SSH [email protected]
服务开启 / 关闭 / 重启 / 开机自启 / 开启不自启: systemctl start / stop / restart / enable / disable sshd
SSH 服务端的配置文件(部分): /etc/SSH/sshd_config
- #Port 22 // 默认的端口号为 22 修改端口时, 取消注释
- #LoginGraceTime 2m //SSH 登录时, 密码验证的超时时间, 默认 2 分钟
- #PermitRootLogin yes // 是否允许以 root 用户身份登录
- #MaxAuthTries 6 // 最大认证次数
- #MaxSessions 10 // 登录 Sessions 保持的天数
- #PermitEmptyPasswords no // 是否允许空密码
- PasswordAuthentication yes // 开启密码认证
我们需要修改配置的时候, 最终极办法就是修改完配置文件直接重启就行 service sshd restart
命令可以检查 SSH 服务是否开启 ps -e | grep SSH
二, 口令连接
-p 命令可以指定连接的端口 SSH -p 1234 name@192.168.0.1
然后输入该用户的面即可
图形用户界面的连接更加简单, 不做讲述.
三, 公钥登录
在主机 A 上, 使用 SSH-keygen, 然后输入保存的文件名 (默认为 id_rsa) 和自己的私钥, 完成之后会在 ~/.SSH/ 生成的两个密钥: id_rsa(私钥) 和 id_rsa.pub(公钥)
私钥 (id_rsa) 保存在本地主机, 公钥 (id_rsa.pub) 通过 SSH-copy-id [email protected] 会自动传递到对端 B 主机的~/.SSH / 目录下, 并且自动重命名为 authorized_keys
登录目标主机: SSH [email protected] 使用刚刚输入的私钥登录
具体:
1, 在本机生成密钥对
使用 SSH-keygen 命令生成密钥对:
SSH-keygen -t rsa #-t 表示类型选项, 这里采用 rsa 加密算法
然后根据提示一步步的按 enter 键即可(其中有一个提示是要求设置私钥口令 passphrase, 不设置则为空, 这里看心情吧, 如果不放心私钥的安全可以设置一下), 执行结束以后会在 /home / 当前用户 目录下生成一个 .SSH 文件夹, 其中包含私钥文件 id_rsa 和公钥文件 id_rsa.pub.
2, 将公钥复制到远程主机中
使用 SSH-copy-id 命令将公钥复制到远程主机. SSH-copy-id 会将公钥写到远程主机的 ~/ .SSH/authorized_key 文件中
SSH-copy-id [email protected]
点击此处是一个网友远程登录谷歌云的例子
四, SSH 应用
1, 可以利用 nohup + 需要运行的程序 使运行的程序在切断 SSH 连接的时候仍然能够继续在远程主机中运行. nohup 即 no hang up(不挂起).
2,scap,put,get 等跨主机传输文件
3, 绑定本地端口
$ SSH -D 8080 [email protected]
SSH 会建立一个 socket, 去监听本地的 8080 端口. 一旦有数据传向 8080 端口, 就自动把它转移到 SSH 连接上面, 发往远程主机. 可以想象, 如果 8080 端口原来是一个不加密端口, 现在将变成一个加密端口.
根据柚子皮的例子:
有时, 绑定本地端口还不够, 还必须指定数据传送的目标主机, 从而形成点对点的 "端口转发". 为了区别后文的 "远程端口转发", 我们把这种情况称为 "本地端口转发"(Local forwarding).
假定 host1 是本地主机, host2 是远程主机. 由于种种原因, 这两台主机之间无法连通. 但是, 另外还有一台 host3, 可以同时连通前面两台主机. 因此, 很自然的想法就是, 通过 host3, 将 host1 连上 host2.
我们在 host1 执行下面的命令:
$ SSH -L 2121:host2:21 host3
命令中的 L 参数一共接受三个值, 分别是 "本地端口: 目标主机: 目标主机端口", 它们之间用冒号分隔. 这条命令的意思, 就是指定 SSH 绑定本地端口 2121, 然后指定 host3 将所有的数据, 转发到目标主机 host2 的 21 端口(假定 host2 运行 FTP, 默认端口为 21).
这样一来, 我们只要连接 host1 的 2121 端口, 就等于连上了 host2 的 21 端口.
$ ftp localhost:2121
"本地端口转发" 使得 host1 和 host3 之间仿佛形成一个数据传输的秘密隧道, 因此又被称为 "SSH 隧道".
下面是一个比较有趣的例子.
$ SSH -L 5900:localhost:5900 host3
它表示将本机的 5900 端口绑定 host3 的 5900 端口(这里的 localhost 指的是 host3, 因为目标主机是相对 host3 而言的).
另一个例子是通过 host3 的端口转发, SSH 登录 host2.
$ SSH -L 9001:host2:22 host3
这时, 只要 SSH 登录本机的 9001 端口, 就相当于登录 host2 了.
$ SSH -p 9001 localhost
上面的 - p 参数表示指定登录端口.
出错处理: SSH: Could not resolve hostname 192.168.*.*:***: Name or service not known
解决: 指定端口不能直接使用 ip: 端口号, 使用 - p 参数来解决就可以了.
4, 远程端口转发(来自柚子皮)
远程端口转发
既然 "本地端口转发" 是指绑定本地端口的转发, 那么 "远程端口转发"(remote forwarding)当然是指绑定远程端口的转发.
还是接着看上面那个例子, host1 与 host2 之间无法连通, 必须借助 host3 转发. 但是, 特殊情况出现了, host3 是一台内网机器, 它可以连接外网的 host1, 但是反过来就不行, 外网的 host1 连不上内网的 host3. 这时,"本地端口转发" 就不能用了, 怎么办?
解决办法是, 既然 host3 可以连 host1, 那么就从 host3 上建立与 host1 的 SSH 连接, 然后在 host1 上使用这条连接就可以了.
我们在 host3 执行下面的命令:
$ SSH -R 2121:host2:21 host1
R 参数也是接受三个值, 分别是 "远程主机端口: 目标主机: 目标主机端口". 这条命令的意思, 就是让 host1 监听它自己的 2121 端口, 然后将所有数据经由 host3, 转发到 host2 的 21 端口. 由于对于 host3 来说, host1 是远程主机, 所以这种情况就被称为 "远程端口绑定".
绑定之后, 我们在 host1 就可以连接 host2 了:
$ ftp localhost:2121
这里必须指出,"远程端口转发" 的前提条件是, host1 和 host3 两台主机都有 sshD 和 SSH 客户端.
来源: http://www.bubuko.com/infodetail-3190215.html