常用IM典型登录方式及原理分析
1、典型剖析:MSN登录实例
一般来说,用户微机上的程序统称为MSN Messenger“客户端”,它通过Internet连接到一个MSN Messenger“服务器”。也就是说,客户端通过服务器与其他客户端交互信息。在大多数时间里,用户的客户端与服务器会话,然后由服务器来处理这些会话信息并通知其他人。了解之前,我们使用Sniffer NT来截获登录时的数据。
从截获的登录数据中,我们可以看到,在“数据”一栏中,有很多类似CVR、VER、USR等开头的数据,登录连接时还用到了TCP/1863和TCP/443这两个端口,它们记录了MSN Messenger登录的整个过程。在图中,我们看到了这样一条记录:“VER 145 MSNP11 MSNP10 CVR0”。
要回答这个问题,我们首先就要谈到MSN Messenger协议了。1999年,Microsoft向IETF(Internet Engineering Steering Group,国际互联网工程任务组,是世界上做互联网方面技术标准的组织)提交了一份“MSN Messenger Service 10 Protocol”草案,这是最初版本的MSN Messenger协议,不同的协议经常被写为“MSNP9”、“MSNP10”、“MSNP11”等。近几年中,MSN已经历经数次修订,目前MSN Messenger的协议已经到了第12版,简称MSNP12。现在,我们使用比较广泛的MSN70支持的协议是MSNP10和MSNP11,出于规范的需要,MSN Messenger用户必须升级到较高的版本,因为服务器对MSNP8以下的版本已经不再支持。这就是我们在刚才截获的数据中,为什么可以看到“MSNP11 MSNP10”的缘故了。
那么,CVR、VER、USR这些数据是什么意思呢客户端与服务器间信息都是以命令格式传递的。命令被描述为三个字符、所有字母大写的命令代号。所有一般命令都有一个事务ID并且以新行结束。客户端发送的命令一般会使服务器响应一个及以上的命令。这些数据是MSN Messenger命令,它们使用了纯ASCII码,同时对非ASCII码字符使用URL编码。命令的语法如下:
XXX [ TrID PARAM1 PARAM2…]
其中,是空白字符,是回车换行,XXX是一个3字符的命令串,TrID是一个流水号,PARAMx是参数,[ ]内是可选项。关于这些命令的含义,可以参考下表(列举部分):
命令 来源 去向 说明
CHG Client NS 发出改变状态的请求。
NS Client 返回改变状态的应答。
CHL NS Client 服务器发出验证要求。
SS Client
CVR Client NS 发出客户端的OS、语言、MSN Messenger版本等信息。对于官方客户端来说,服务器会响应建议用户使用的客户端版本信息。
Client SS
NS Client 返回推荐的MSN Messenger版本、升级软件需要的下载地址等信息。
SS Client
INF Client NS 询问服务器所支持的认证方式。
Client SS
NS Client 返回服务器所支持的认证方式。
SS Client
MSG Client SS 发送消息到其他用户(聊天对象)。
NS Client 传递服务器(系统)的消息到客户端。
SS Client 传递其他用户(聊天对象)的消息到客户端。
SYN Client NS 客户端-服务器同步。
NS Client
URL Client NS 发出获取MSN服务URL的请求。
NS Client 返回获取URL请求的应答。
USR All All 声明、传递、鉴别用户身份。
VER Client DS 协商MSN Messenger协议版本。
Client NS
DS Client
NS Client
XFR DS Client 向客户端分配NS(通知客户端转向连接指定的NS)。
Client NS 发出分配SS的请求。
NS Client 返回分配SS请求的应答。
这样,当我们看到“CVR 146 0x0804 winnt 50 i386 MSNMSGR 700777 msmsgs cndes2005@hotmailcom”时,就可以知道,现在客户端正发出OS、语言、MSN Messenger版本等信息。现在,聪明的读者可能会思考:在这些表中,我们看到了DS、NS、SS等代表来源和去向的服务器,他们又有什么特殊的意义呢简单介绍如下:
派遣服务器(Dispatch Server,简称DS服务器)。这是客户端最初连接的服务器,负责给客户端分配合适的通知服务器。域名是messengerhotmailcom,标准服务端口是1863。完成派遣任务后,切断TCP连接。
通知服务器(Notification Server,简称NS服务器)。通知服务器的目的主要就是保留用户的在线信息,还有其他用户所关心的重要人员的信息。包括登录、改变状态、获取用户列表、修改用户信息、发起聊天、接受呼叫、邮件通知、退出等等。通知服务器同样也提供其他通知服务,如hotmail的新邮件提示和创建或者加入会话等。服务端口由派遣服务器指定,通常也是1863。
接线服务器(Switchboard Server,简称SS服务器)。这里保存了各人员的即时会话信息,换句话说,每个MSN中的用户对应连接到一个共享交换板的会话中。因此,这里也可以看作客户端之间聊天使用的中转服务器。每开一个聊天窗口,客户端和服务器就建立一个TCP会话。当客户端之间需要进行文件传输或语音聊天时,发送系统消息,建立“点对点”会话通道(可能转为使用UDP),服务端口通常也是1863。“点对点”通信使用的端口由客户端自动协商决定,如文件传输通常使用6891端口。
在我们日常管理与维护服务器个过程中,我们都需要使用远程连接工具,今天我们就一同来总结下Linux常用的安全远程连接工具-OpenSSH。
远程登录协议
1、telnet:是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主
机工作的能力。默认使用的是TCP的23号端口,采用C/S架构,在用户登录的过程中传输的信息都是明文信息,安全无法保障,所以不建议用telnet。
2、ssh:为Secure Shell 的缩写,由IETF的网络工作小组所制定;SSH
为建立在应用层和传输层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH
协议可以有效防止远程管理过程中的信息泄露问题。默认使用的是TCP的22号端口,也是基于C/S架构,SSH有两个版本v1与v2。
sshv1:基于CRC-32做MAC(消息摘要认证),不安全,强烈建议不使用;
sshv2:基于双方主机的协商选择使用最安全的MAC方式 ,其有如下特点:1、加密机制及MAC机制由双方协商选定;2、基于DH实现密钥交换,基于RSA或DSA实现身份认证;3、客户端通过检查服务器端的主机密钥来判断是否能够继续通信;
OpenSSH简述
OpenSSH 是一组用于安全地访问远程计算机的连接工具。它可以作为rlogin、rsh
rcp以及telnet的直接替代品使用。更进一步,其他任何TCP/IP连接都可以通过SSH安全地进行隧道/转发。OpenSSH
对所有的传输进行加密,从而有效地阻止了窃听、连接劫持,以及其他网络级的攻击。OpenSSH 由 OpenBSD project 维护。
登录过程和使用rlogin或telnet建立的会话非常类似。在连接时,SSH
会利用一个密钥指纹系统来验证服务器的真实性。只有在第一次连接时,用户会被要求输入yes进行确认,之后的连接将会验证预先保存下来的密钥指纹。如果保
存的指纹与登录时接收到的不符, 则将会给出警告。 指纹保存在 ~/ssh/known_hosts中,对于SSHv2指纹,则是
~/ssh/known_hosts2。
默认情况下,较新版本的OpenSSH只接受SSHv2连接。如果能用版本2则客户程序会自动使用,否则它会返回使用版本1的模式。此外,也可以通
过命令行参数-1或-2来相应地强制使用版本1或2。 保持客户端的版本1能力是为了考虑较早版本的兼容性,建议尽量使用版本2。
SSH服务器和客户端工作流程
OpenSSH使用C/S架构:
服务端工具(S):sshd
客户端工具(C):ssh命令、putty、xshell、securecrt、sshshellclient;
OpenSSH客户端组件-ssh
配置文本:/etc/ssh/ssh_config
使用方法:
ssh [username@] host [COMMAND]或 ssh -l username host [COMMAND]
-p PORT:指定远程服务器端口;
-l username:指定登录远程主机的用户,不指定则使用当前用户;
username@:等同于 -l username;
如果设置了COMMAND,表示使用username账户登录远程主机执行一次指定的命令并返回结果,不会停留在远程主机上;
[root@www ~]# ssh 1921680110 #使用root用户登录;
The authenticity of host '1921680110 (1921680110)' can't be established
RSA key fingerprint is 01:2e:43:cc:bc:1d:f1:e5:f0:f4:89:78:74:a9:49:44
Are you sure you want to continue connecting (yes/no) yes #第一次连接,需手动进行确认;
Warning: Permanently added '1921680110' (RSA) to the list of known hosts
root@1921680110's password: #输入远程主机root账户的密码;
Last login: Mon May 11 16:44:52 2015 from 1921680104
[root@mailCentOS6 ~]# #登录成功了,远程主机名为mailCentOS6;
[root@mailCentOS6 ~]# ls #显示远程主机root家目录下的文件;
2sh bootiso installlog sdbmbr test1
anaconda-kscfg crontab installlogsyslog \temp\test
[root@mailCentOS6 ~]# exit #退出登录;
logout
Connection to 1921680110 closed
[root@www ~]# ssh root@1921680110 ls #使用root登录远程主机,执行一次ls命令,返回结果便退出;
root@1921680110's password: #第二次连接,就不需要输入yes了,直接输入密码即可;
2sh
anaconda-kscfg
bootiso
crontab
installlog
installlogsyslog
sdbmbr
\temp\test
test1
[root@www ~]# #看到了吗,我们当前并没有登录在远程主机;
OpenSSH服务器端组件-sshd
配置文件:/etc/ssh/sshd_config(通过修改此文件可以修改ssh的默认监听端口与其他参数)
服务脚本:/etc/rcd/initd/sshd
服务启动|停止|重启:serveice sshd start|stop|restart
脚本配置文件:/etc/sysconfig/sshd
配置参数
# man sshd_config 查看配置参数的说明;
# vim /etc/sysconfig/sshd 通过编辑配置文件来修改配置参数;
#+空格+文字:以此格式开头的行表示改行为注释说明;
#+文字:以此格式开头的行表示可启用选项,不改变则表示使用该选项的默认设置,反之使用设定值“#”要去掉哦!
例:#Port 22 如不去掉#且22不变,表示使用默认的22号端口;
若把#Port 22改成port 7777,表示把sshd的监听端口改成7777;
注意:修改参数与配置后,必须重启服务(service sshd restart)
经常需要修改的参数:
[root@www ~]# cat /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 180 2008/07/02 02:24:18 djm Exp $
# This is the sshd server system-wide configuration file See
# sshd_config(5) for more information
# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented Uncommented options change a
# default value
#Port 22 #修改默认监听的端口;
port 7777 #把sshd的监听端口改成7777;
#AddressFamily any #监听的地址家族,指定是监听在IPV4上还是IPV6上,any表示所有;
#ListenAddress 0000 #指定监听的地址 (0000表示本机的所有地址);
#ListenAddress ::
# Disable legacy (protocol version 1) support in the server for new
# installations In future the default will change to require explicit
# activation of protocol 1
Protocol 2
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key #使用shhv1用到的主机密钥;
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 1024 #密钥长度;
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m #登录宽限期;
#PermitRootLogin yes #是否允许管理员直接登录;
#StrictModes yes
#MaxAuthTries 6 #最大密码输入错误次数;
#MaxSessions 10 #最大会话个数;
#RSAAuthentication yes #是否允许使用RSA机制来认证;
#PubkeyAuthentication yes
#--------中间不长改变的配置参数略----------
Subsystem sftp /usr/libexec/openssh/sftp-server #表示是否启动sftp功能;
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# ForceCommand cvs server
sshd认证方式:
1、基于口令的认证;
2、基于密钥的认证;
# ssh-keygen -t rsa 用rsa算法生成密钥,默认密钥为id_rsa(私钥), id_rsapub(公钥)
# ssh-keygen -f /path/to/somefile -P oldpassword 根据现有的密钥文件生成密钥
-f /path/to/somefile: 密钥文件保存在的位置;
-P '': 指定生成旧密钥时使用的密码;
方法一:把本地主机生成的公钥 id_rsapub使用scp复制到远程主机的上,在远程主机使用cat id_rsapub>>ssh/authorized_keys追加该公钥信息,这样就可以实现基于密钥认证的ssh登录;
方法二:# ssh-copy-id -i ssh/id_rsapub USERNAME@HOST
[root@www ~]# ssh-keygen -t rsa #用rsa算法生成密钥;
Generating public/private rsa key pair
Enter file in which to save the key (/root/ssh/id_rsa): #指定密钥存放路径及名称,一般不用
#修改,直接回车;
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_rsapub
The key fingerprint is:
c2:f9:c2:3d:4d:ca:52:39:7a:a7:33:de:42:11:d3:8f root@www99com
The key's randomart image is:
+--[ RSA 2048]----+
| |
| o |
| o o |
| E |
| + S |
| B= |
| =B o |
| ++= |
| o+ |
+-----------------+
[root@www ~]# ssh-keygen -f ssh/id_rsa -P '' #根据现有密钥文件重新生成密钥;
Generating public/private rsa key pair
ssh/id_rsa already exists
Overwrite (y/n) y #提示是否确定要覆盖;
Your identification has been saved in ssh/id_rsa
Your public key has been saved in ssh/id_rsapub
The key fingerprint is:
bf:55:f0:0b:a5:ee:4e:4a:1d:d3:b1:0e:66:ee:55:9b root@www99com
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| o |
| o |
| S O = |
| B oo|
| o +E |
| B |
| o+ |
+-----------------+
#-----使用方法一:实现通过密钥文件完成身份验证(不需要输入密码)-----
[root@www ~]# scp ssh/id_rsapub root@1921680110:/root/ #使用spc命令复制公钥文件到远程
#主机的用户家目录下的ss/路径下;
root@1921680110's password: #输入登录远程主机的密码;
id_rsapub 100% 397 04KB/s 00:00 #提示复制成功;
[root@mailCentOS6 ~]# ls ssh/ #验证确认文件复制成功;
id_rsapub known_hosts
[root@mailCentOS6 ~]# touch ssh/authorized_keys #路径内没有自动验证密钥文件,创建一个;
[root@mailCentOS6 ~]# cat ssh/id_rsapub >> ssh/authorized_keys #把公钥追加到自动验证密钥文件;
[root@www ~]# ssh 1921680110
Last login: Mon May 11 20:45:10 2015 from 1921680111
[root@mailCentOS6 ~]# #OK了,看到了没有,不用输入密码我们就直接可以远程登录了!!
#-----使用方法二:实现通过密钥文件完成身份验证(不需要输入密码)-----
[root@mailCentOS6 ~]# rm -f ssh/authorized_keys #删除原有保存的自动验证密钥文件;
[root@www ~]# ssh-copy-id -i ssh/id_rsapub root@1921680110 #使用命令自动传输生成自动验证密钥文件;
root@1921680110's password:
Now try logging into the machine, with "ssh 'root@1921680110'", and check in:
ssh/authorized_keys #提示生成的文件;
to make sure we haven't added extra keys that you weren't expecting
[root@www ~]# ssh 1921680110 #验证看看是否可以登录;
Last login: Mon May 11 21:02:29 2015 from 1921680111
[root@mailCentOS6 ~]# ls ssh/ #看到了没有,我们现在已经登录到了mailCentOS6这台主机上了;
authorized_keys known_hosts
命令补充
scp: 利用ssh协议在主机之间实现安全文件传输的工具
scp SRC1 DEST
分两种情形:
1、源文件在本机,目标为远程主机
# scp /path/to/somefile USERNAME@HOST:/path/to/somewhere
源可以是目录或文件有多个,目标必须是目录
2、源文件在远程,本地为目标
# scp USERNAME@HOST:/path/to/somewhere /path/to/somewhere
-r: 复制目录时使用(实现递归复制),scp默认不能复制目录;
-p: 保持源文件的元数据信息,包括mode和timestamp
-q: 静默模式,复制过程不显示状态信息;
-p PORT: 指定ssh协议监听的端口(远程主机)。
“ss”是一个计算机术语,有多个含义,一是软交换(softswitch);二是堆栈段寄存器(Stack Segment);三是慢启动(slowstart)。具体如下:
1、软交换(softswitch):
当时在企业网络环境下,用户采用基于以太网的电话,通过一套基于PC服务器的呼叫控制软件(Call Manager、Call Server),实现PBX功能(IP PBX)。对于这样一套设备,系统不需单独铺设网络,而只通过与局域网共享就可实现管理与维护的统一,综合成本远低于传统的PBX。
由于企业网环境对设备的可靠性、计费和管理要求不高,主要用于满足通信需求,设备门槛低,许多设备商都可提供此类解决方案,因此IP PBX应用获得了巨大成功。
受到IP PBX成功的启发,为了提高网络综合运营效益,网络的发展更加趋于合理、开放,更好的服务于用户。业界提出了这样一种思想:将传统的交换设备部件化,分为呼叫控制与媒体处理,二者之间采用标准协议(MGCP、H248)且主要使用纯软件进行处理,于是,SoftSwitch(软交换)技术应运而生。
2、堆栈段寄存器(Stack Segment):
堆栈段寄存器用于存放堆栈段的基值。
3、慢启动(slowstart):
在计算机网络中,为了拥塞避免,传输文件需要慢启动。即在一个时间段里,先发送1个MSS(最大报文段长度),再发送2个MSS,然后4个、8个,直到到达cong-win。
0条评论