通过ssh通道加密通信数据
2016-03-24 18:44
323 查看
ssh数据加密是非常棒的,先来个如何进行加密的示意图。
图.1
开启ssh服务(ubuntu):
查看ssh 服务状态:
图.2
执行:
图.3
可以看到,ssh客户端开启了一个监听,监听的端口号是6000,那么接下来我们的client只需要去连接6000端口了。
那为什么有个37344 <--> 22的连接呢?那是因为ssh客户端创建出一个进程或者线程和sshd连接,给第三方应用通信,父进程依然在等待新的第三方程序的请求。
下面是server 和 client 的测试代码:
在开启server 和 client之前,我们先用tcpdump监听端口,这里我们应该选择37344端口监听!同时选择的是回环设备。
注意,不是8888 或者 6000端口,为什么?因为在连接37344 <--> 22之间的数据才是加密的(看图1理解)。
图.4
开启server 和 client.
图.5
可以看到客户端返回了正确数据,再来看看tcpdump的输出。
最后一次是传输的数据,如果不采用ssh 加密,那么可以看到红色部分是明文You connect success.(上面的<span style .. . . . > </span>部分)
或者用tcpdump监听8888和6000均是明文。
SSH加密到此结束。
图.1
开启ssh服务(ubuntu):
#/etc/init.d/ssh start
查看ssh 服务状态:
图.2
执行:
#ssh -L 6000:127.0.0.1:8888 -N 127.0.0.1 // 注意,这里第一个ip是回环地址,第二个应该是远程的地址,这里用于测试。6000是sshPort,8888是serPort #netstat -tnlp | grep ssh
图.3
可以看到,ssh客户端开启了一个监听,监听的端口号是6000,那么接下来我们的client只需要去连接6000端口了。
那为什么有个37344 <--> 22的连接呢?那是因为ssh客户端创建出一个进程或者线程和sshd连接,给第三方应用通信,父进程依然在等待新的第三方程序的请求。
下面是server 和 client 的测试代码:
/* Server.c */ #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <sys/socket.h> #include <string.h> int main(int argc, char *argv[]) { int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) write(STDERR_FILENO, "socket error", 11); struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(8888); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); bind(sock, (struct sockaddr *)&addr, sizeof(addr)); listen(sock, 32767); int connfd = accept(sock, NULL, NULL); write(connfd, "You connect success.\n", 21); sleep(10000); close(connfd); close(sock); return 0; }
/* Client.c */ #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <stdio.h> #include <string.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { int sock = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(6000); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(sock, (struct sockaddr *)&addr, sizeof(addr)); char buf[512]; memset(buf, 0, sizeof(buf)); //printf("sizeof(buf):%d\n", sizeof(buf)); read(sock, buf, 512); write(STDOUT_FILENO, buf, strlen(buf)); sleep(10000); close(sock); return 0; }
在开启server 和 client之前,我们先用tcpdump监听端口,这里我们应该选择37344端口监听!同时选择的是回环设备。
注意,不是8888 或者 6000端口,为什么?因为在连接37344 <--> 22之间的数据才是加密的(看图1理解)。
图.4
开启server 和 client.
#./server #./client
图.5
可以看到客户端返回了正确数据,再来看看tcpdump的输出。
18:34:15.538916 IP 127.0.0.1.37344 > 127.0.0.1.22: Flags [P.], seq 3506275179:3506275271, ack 3174401501, win 386, options [nop,nop,TS val 3634369 ecr 3502811], length 92 0x0000: 4510 0090 160a 4000 4006 264c 7f00 0001 E.....@.@.&L.... 0x0010: 7f00 0001 91e0 0016 d0fd 836b bd35 85dd ...........k.5.. 0x0020: 8018 0182 fe84 0000 0101 080a 0037 74c1 .............7t. 0x0030: 0035 72db 97e4 2ffd 23df c0c5 eeb7 bbb4 .5r.../.#....... 0x0040: 08de fa22 eb43 2d58 6074 1e51 cb07 b193 ...".C-X`t.Q.... 0x0050: 0d93 5f38 c3b3 9846 a859 0c14 1b3d 9884 .._8...F.Y...=.. 0x0060: b1f5 ce8a 89c1 2567 d17e 58ae 3f54 d043 ......%g.~X.?T.C 0x0070: bccf e4b4 1f13 6717 c45f d0ac 7075 3d0e ......g.._..pu=. 0x0080: d387 c803 3ca1 f939 eabc f10c c01d 672c ....<..9......g, 18:34:15.538954 IP 127.0.0.1.22 > 127.0.0.1.37344: Flags [.], ack 92, win 1365, options [nop,nop,TS val 3634369 ecr 3634369], length 0 0x0000: 4500 0034 1325 4000 4006 299d 7f00 0001 E..4.%@.@.)..... 0x0010: 7f00 0001 0016 91e0 bd35 85dd d0fd 83c7 .........5...... 0x0020: 8010 0555 fe28 0000 0101 080a 0037 74c1 ...U.(.......7t. 0x0030: 0037 74c1 .7t. 18:34:15.539218 IP 127.0.0.1.22 > 127.0.0.1.37344: Flags [P.], seq 1:45, ack 92, win 1365, options [nop,nop,TS val 3634369 ecr 3634369], length 44 0x0000: 4500 0060 1326 4000 4006 2970 7f00 0001 E..`.&@.@.)p.... 0x0010: 7f00 0001 0016 91e0 bd35 85dd d0fd 83c7 .........5...... 0x0020: 8018 0555 fe54 0000 0101 080a 0037 74c1 ...U.T.......7t. 0x0030: 0037 74c1 ba76 018f 3cfd 88c1 79e0 3756 .7t..v..<...y.7V 0x0040: 473b 6839 a577 62e1 7a67 6e4b 03cb 3a94 G;h9.wb.zgnK..:. 0x0050: 6c5c e89f 7bbc 734a bc7e b343 1e9d d063 l\..{.sJ.~.C...c 18:34:15.539230 IP 127.0.0.1.37344 > 127.0.0.1.22: Flags [.], ack 45, win 386, options [nop,nop,TS val 3634369 ecr 3634369], length 0 0x0000: 4510 0034 160b 4000 4006 26a7 7f00 0001 <span style="color:#CC0000;">E..4..@.@.&.....</span> 0x0010: 7f00 0001 91e0 0016 d0fd 83c7 bd35 8609 <span style="color:#CC0000;">.............5..</span> 0x0020: 8010 0182 fe28 0000 0101 080a 0037 74c1 <span style="color:#CC0000;">.....(.......7t.</span> 0x0030: 0037 74c1 <span style="color:#CC0000;">.7t.</span>其中,前三个捕获是tcp的三次握手过程。
最后一次是传输的数据,如果不采用ssh 加密,那么可以看到红色部分是明文You connect success.(上面的<span style .. . . . > </span>部分)
或者用tcpdump监听8888和6000均是明文。
SSH加密到此结束。
相关文章推荐
- Java并发编程:synchronized
- Linux 的 completion机制
- HOJ 2317 Pimp My Ride(状态压缩DP)
- 第四周—周记
- 3月24日学习笔记(两个活动之间的数据传递)
- svn升级(mac)
- 第四周项目2-太乐了
- ListView(SimpleCursorAdapter实现)
- HDOJ的题目分类
- SylixOS WIFI
- 第二篇:数据仓库与数据集市建模
- C++中弱符号(弱引用)的意义及实例
- HDOJ的题目分类
- zip4j -- Java处理zip压缩文件的完整解决方案
- 将SSH移植到arm soc上
- 第四周项目1-求最大公约数(2)
- 微信公众号(服务号)接入开发(2)之微信授权登陆
- EFI方式编译启动Xen
- PDFbox实现文本抽取
- TraceTool 跟踪工具的瑞士军刀(C++版使用)