目录shell
引言编程
Telnetubuntu
简介windows
工做原理安全
安全性bash
SSH服务器
简介网络
安装与开启服务ssh
命令ide
在进行远程链接服务器时,我常用MobaXterm,在选择Session时,常会看到这个页面:
以前不求甚解,只知道SSH能够进行远程链接,不清楚Telnet,其实学过FTP,看到SFTP,也没去看他们到底区别在哪里,Shell编程学了一点也不系统,感受好多要学。今天先来学习Telnet和SSH协议。
TelnetTelnet(telecommunication network protocol,电信网络协议)是一个简单的远程终端协议,使用端口23。用户用Telnet就可在其所在地经过TCP链接注册(即登陆)到远地的另外一台主机上(使用主机名或IP地址)。Telnet能将用户的击键传到远地主机,同时也能将远地主机的输出经过TCP链接返回到用户屏幕。这种服务是透明的,由于用户感受到好像键盘和显示器是直接连在远地主机上。所以,Telnet又称为终端仿真协议。
Telnet也使用客户/服务器方式。在本地系统运行Telnet客户进程,而在远地主机则运行Telnet服务器进程。和FTP的状况类似,服务器中的主进程等待新的请求,并产生从属进程来处理每个链接。
Telnet可以适应许多计算机和操做系统的差别。例如,对于文本中一行的结束,有的系统使用ASCII码的回车(CR),有的系统使用换行(LF),还有的系统使用两个字符,回车-换行(CR-LF)。又如,在中断一个程序时,许多系统使用Control-C(C),但也有系统使用ESC按键。为了适应这种差别,Telnet定义了数据和命令应怎样经过互联网。这些定义就是所谓的NVT(Network Virtual Terminal,网络虚拟终端)。
客户软件把用户的击键和命令转换成NVT格式,并送交服务器。服务器软件把收到的数据和命令从NVT格式转换成远地系统所需的格式。向用户返回数据时,服务器把远地系统的格式转换为NVT格式,本地客户再从NVT格式转换到本地系统所需的格式。
NVT的格式定义很简单:全部的通讯都使用8位(一个字节)。在运转时,NVT使用7位ASCII 码传送数据,而当高位置1时用做控制命令。ASCII码共有95个可打印字符(如字母、数字、标点符号)和33个控制字符。全部可打印字符在NVT中的意义和在ASCII码中同样。但NVT只使用了ASCII码的控制字符中的几个。此外,NVT还定义了两字符的CR-LF为标准的行结束控制符。当用户键入回车按键时,Telnet的客户就把它转换为CR-LF再进行传输,而Telnet服务器要把CR-LF转换为远地机器的行结束字符。
Telnet的选项协商(Option Negotiation)机制使Telnet客户和Telnet服务器可商定使用更多的终端功能,协商的双方是平等的,也就是说任何一方均可以主动发送选项协商请求给对方。
注:因为Telnet规则规定,对于激活选项请求(如1和2),有权赞成或者不一样意。而对于使选项失效请求(如3和4),必须赞成。这样,4种请求就会组合出6种状况,如上图所示。
不安全,由于使用明文传输。一旦被ARP中毒等中间人***,就会暴露用户名、密码等敏感信息。另外,帐号密码简单时也可被暴力破解。
SSHSSH(Secure Shell),由 IETF 的网络小组(Network Working Group)所制定,端口22。SSH 为创建在应用层基础上的安全协议。SSH 是较可靠的,专为远程登陆会话和其余网络服务提供安全性的协议。利用 SSH 协议能够有效防止远程管理过程当中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其余操做平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台,几乎全部UNIX平台均可使用。
经过使用SSH,你能够把全部传输的数据进行加密,这样"中间人"这种***方式就不可能实现了,并且也可以防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是通过压缩的,因此能够加快传输的速度。SSH有不少功能,它既能够代替Telnet,又能够为FTP、PoP、甚至为PPP提供一个安全的"通道" 。
22端口由来小故事:SSH设计者Tatu Ylonen设计SSH是为了替代telnet(端口23)和ftp(端口21),端口22在当时是空闲的,正好就在telnet和ftp的端口之间,他感受这个端口号自然就带有可信度光环。因而就选择了端口22做为SSH的端口。原文可查看ssh-端口。
另外,Tatu Ylonen于1995年写的SSH,W·Richard Stevens 于1994年写的《TCP/IP详解卷I》,因此里面只有Telnet,而没有SSH。能够阅读RFC4250进行更详细的了解。
OpenSSH是SSH协议的免费开源实现,OpenSSH提供了服务端的程序(openssh-server)和客户端工具(openssh-client),接下来以OpenSSH为例,介绍一下SSH命令及高级配置
# 安装服务端/客户端(Ubuntu)
$ sudo apt install openssh-server/openssh-client# 安装服务端/客户端(Centos)
$ sudo yum install openssh-server/openssh-client# 查看ssh服务是否开启
$ netstat -tlp | grep ssh# 启动/中止/重启 ssh服务
$ sudo /etc/init.d/ssh start/stop/restart
选项 | 参数 | 含义 |
---|---|---|
--46AaCfGgKkMNnqsTtVvXxYy | 查看软件版本等信息 | |
-b | bind_address | 绑定ip地址,如xxx.xxx.xxx.xxx |
-c | cipher_spec | |
-D | [bind_address:]port | |
-E | log_file | 指定日志文件xxx//xx//xx.log |
-e | escape_char | |
-F | configfile | 指定配置文件 |
-i | identify_file | 认证文件 |
-J | [user@host[:port]] | |
-L | address | |
-l | login_name | |
-m | mac-spec | |
-O | ctl-cmd | |
-o | option | |
-p | port | 指定端口,默认22 |
-Q | query_option | |
-R | address | |
-S | ctl-path | |
-W | host:port | |
-w | local_tun[:remote_tun] | |
[user@]hostname [command] | 用于客户端链接服务器 |
注意
user
是远程服务器登陆的用户名,默认为当前用户hostname是
远程服务器地址,能够是IP/域名/别名exit/logout
命令都可退出当前登陆接下来,展现一下链接ssh服务器
能够看到,使用SHA256进行了校验,生成了一个指纹,咱们关闭链接,重连一次。
再次链接,能够发现,已经没有了校验显示,输入密码后直接登陆,稍微简便了一点。那么,校验记录存在哪呢?
cd ~/.shh cat known_hosts
第一条是个人GitLab的,就划掉了,第二条是刚才链接的。
在~/.ssh/known_hosts文件中能够看到。接下来,咱们就来详细看看一些配置。
Linux下,ssh配置信息都保存在~/.ssh
中
配置文件 | 做用 |
---|---|
known_hosts | 做为客户端。记录曾链接服务器受权。ssh第一次链接一台服务器会有一个受权提示,确认受权后会记录在此文件中,下次链接记录中的服务器时则再也不须要进行受权确认提示 |
authorized_keys | 做为服务端。客户端的免密链接公钥文件 |
config | 做为客户端。记录链接服务器配置的别名 |
后两个默认是不存在的,须要手动建立。下面Windows中也是仅有known_hosts文件的,另外两个是我给GitLab配置密钥文件时建立的。
Windows下
每次都写IP地址,可是IP地址比较难记,咱们能够去一个别名。新建一个config文件,内容以下:
Host Ubuntu
HostName 10.28.214.174
User llvm
Port 22
其中,Port能够不写,默认就是22端口。
经过以上,咱们便可经过别名和密码登陆了,可是每次都输入密码,比较麻烦,接下来咱们看看免密登陆。
客户端生成密钥对
ssh-keygen
我通常是不用参数的,它会给一些提示,我通常所有按Enter,选择默认,此次因为文件路径名字重复,才改了一个。上面的参数,博主只感受-t参数比较有用,可是密码学学的也很差,默认的rsa加密方式也很好,通常也是默认。
上传公钥到服务器
ssh-copy-id user@hostname
windows下没有这个命令,只能手动了。使用这个命令实际上是将公钥追加到了服务器的authroized_keys文件中,咱们把文件放到Ubuntu中,使用命令追加一下。
接下来,咱们就可使用密钥文件登陆了
ssh -i id_rsa_ubuntu Ubuntu
仍是有点麻烦,须要记着服务器须要使用哪一个对应的私钥。咱们再配置一下,添加私钥文件:
IdentityFile C:\Users\DELL\.ssh\id_rsa_ubuntu
好啦,至此,咱们能够只是用一个别名就能登陆了:
固然,咱们只是为了学习一下ssh,平时博主也直接使用MobaXterm、Xshell等软件直接链接,有工具的话会节省不少时间。
对于GitHub、GitLab等也会使用密钥文件的方式,将公钥上传到服务器便可。
以GitLab为例,能够看到,要求上传ssh-rsa或ssh-ed25519的公钥。客户端生成密钥对时,可使用-t参数,选择ed25519,也可以使用默认的rsa方式。
帐号密码简单时也可被暴力破解。
关于这两个协议的安全实验,将在学习暴力破解的时候再展现。
参考《计算机网络第7版 谢希仁》6.3
《TCP/IP详解I》第26章