- 浏览: 315053 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
JQ_AK47:
...
Linux下直接发送以太包 -
winsen2009:
谢谢分享,如果能再来一个列子就更好了,刚接触看完还是不懂的用
UNPv1_r3读书笔记: SCTP编程
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
1. 简介
httptunnel是通过HTTP通道来传输其他协议数据的工具软件,下载地址为:http://www.http-tunnel.com,目前最新版本3.0.5
2. htc
htc是客户端,安装在防火墙内部网络一侧htc源文件包括htc.c, common.c, tunnel.c, http.c, base64.c这几个文件和port目录下的库
程序流程:
main.c (htc.c)
parse_arguments (argc, argv, &arg);
解析命令行参数, htc.c如果转发端口 (arg.forward_port != -1),在此端口打开socket监听 s = server_socket (arg.forward_port, 0),
backlog=0, 其实不收连接, 注意用了SO_REUSEADDR选项, common.c;进入死循环 for (;;);
如果定义输入输出的终端设备(arg.device),打开设备fd = open_device (arg.device),common.c;否则如果定义了转发端口(arg.forward_port != -1),输入输出通过连接的socket来进行fd = wait_for_connection_on_socket (s),就是accept() , htc.c;
打开一个新的通道 tunnel = tunnel_new_client (
arg.host_name, arg.host_port,
arg.proxy_name, arg.proxy_port,
arg.content_length); tunnel.c
注意tunnel结构中的in_fd, out_fd都初始化为-1,表示没有连接, 缺省的content_length是100K字节.设置通道的一些选项:strict_content_length, keep_alive, max_connection_age, user_agent这些在HTTP头说明中会用到, 支持代理;
如果要进行代理认证(arg.proxy_authorization != NULL),将认证参数进行base64编码,作为通道的proxy_authorization参数;通道连接对方tunnel_connect (tunnel), tunnel.c, 建立http tunnel,主要是调用函数tunnel_write_request (tunnel, TUNNEL_OPEN, auth_data, sizeof auth_data)如果要写入和已经写入的数据长度超过content_length, 对tuenel进行填充;对于客户端已经连接好的tunnel,超时时进行断开;对于断开(或第一次连接)的客户端, 调用tunnel_out_connect (tunnel)发起连接调用do_connect()连接服务器(第一个连接), socket描述符为tunnel->out_fd.设置该socket的一些选项;调用shutdown(out_fd, 0), 不接收数据;调用http_post()函数向服务器发送HTTP的POST命令; http.c调用tunnel_write_data (tunnel, &request, sizeof request)函数向服务器写要执行的请求(此时为TUNNEL_OPEN)
继续写data部分,先写长度,然后是数据(此时为dummy的auth_data=42, length=1)(即HTTP的POST命令向服务器写TUNNEL_OPEN命令和一个dummy数据)然后进行数据长度判断是否在此连接中数据写多了进入函数tunnel_in_connect (tunnel) , 数据进入的连接调用do_connect()连接服务器(第2个连接),socket描述符为tunnel->in_fd.设置该socket的一些选项;调用http_get()函数向服务器发送HTTP的GET命令; http.c 调用shutdown(in_fd, 1), 不再写数据;调用http_parse_response (tunnel->in_fd, &response)解析HTTP服务器返回数据;处理统计信息此时tunnel_connect完成进入下一个循环poll选择用户的输入设备fd和网络tunnel的in_fd(第2条连接)数据,也就是用户的输入信息和服务器返回的信息进行对倒:fd输入->tunnel->out_fd输出; tunnel->in_fd输入->fd输出.handle_input()
handle_device_input()处理用户输入信息, common.c
handle_input()
handle_tunnel_input()处理来自通道的信息, common.c
客户端一共向服务器发起了两个连接, 第一个连接用于发送数据,第2个连接用于接收数据
3. hts
hts是服务器端,安装在外部网络一侧
hts源文件包括hts.c, common.c, tunnel.c, http.c这几个文件和port目录下的库
main() (hts.c)
parse_arguments (argc, argv, &arg); 解析命令行参数, hts.c
调用tunnel = tunnel_new_server (arg.port, arg.content_length)建立新的tunnel的服务端;
初始化tunnel, in_fd, out_fd都为-1
在tunnel->server_socket监听 server_socket (tunnel->dest.host_port, 1), backlog=1, 注意用了SO_REUSEADDR选项, common.c;
设置通道的一些选项:strict_content_length, keep_alive, max_connection_age, 这些在HTTP头说明中会用到;
写PID文件
进入死循环
如果定义输入输出的终端设备(arg.device),打开设备fd = open_device (arg.device),common.c;
tunnel_accept接受外部连接, tunnel.c
accept()连接
解析HTTP协议请求数据: http_parse_request (s, &request), http.c
POST或PUT命令, 将此socket设置为tunnel的in_fd, 用于接收客户端的数据;
GET命令, 将此socket设置为tunnel的out_fd, 用于发送去往客户端的数据;
如果设置了转发端口(arg.forward_port != -1), 调用do_connect连接到这个端口,描述符为fd, 注意这个连接是本机的
自己连自己的内部连接, hts起到代理转发作用, 目标端口也就是真正的被HTTP包裹的协议端口.
进入下一个循环
poll: fd 和tunnel->server_socket, 也就是网络通道数据和内部连接数据对倒
handle_input()
handle_device_input()处理fd输入信息, common.c
handle_input()
handle_tunnel_input()处理来自通道的信息, common.c
服务器端接收了客户端的两个连接, POST命令对应的连接服务器接收数据, GET命令对应的连接服务器
发送数据
4. 防御
对于http tunnel的防御, 可以根据以下方面(或的关系):
1)过滤POST/GET URL关键字: "/index.html?crap="
2)htc发的HTTP请求部分并不在一个包内发完, 分多次小包发送, 可以严格限制此类连接;
3)HTTP数据一般都是成比较大的块的,如果在连接中发现多次传输小包,可能是http tunnel;
4)根据数据行为检查,如果两机器间的HTTP同时存在POST/PUT和GET的连接,而且数据传输并不是很顺畅,总有一定中断然后突发一阵,可能是http tunnel;
5. 总结
http tunnel利用HTTP的POST和GET两个命令建立了两个连接, 分别用于客户端向服务器发送和接收数据, 而且考虑到了HTTP数据的合法性, 会随时检查所接收或发出的数据是否超过content-length规定的长度, 如果是则填充完后重新开连接进行处理新的数据, 保证了数据始终是合法的HTTP数据, 完全等价于客户端在同时用HTTP协议在上传和下载一个大文件, 文件数据中不需要不需要任何的HTTP命令或HTML语言标志, 某篇文章中试图以此来检查是行不通的.
对于http tunnel的防御, 由于它完全遵守了HTTP协议, 用HTTP协议异常来检测是检测不到的, 防御的1,2措施只是制标, 因为代码公开, 完全可以修改成其他URL和完整的HTTP包头一次发送; 防御3,4只是理论上的,需要相当的智能化处理才有可能不误伤正常HTTP数据, 资源消耗大,更适合在IDS而非防火墙上进行.
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
1. 简介
httptunnel是通过HTTP通道来传输其他协议数据的工具软件,下载地址为:http://www.http-tunnel.com,目前最新版本3.0.5
2. htc
htc是客户端,安装在防火墙内部网络一侧htc源文件包括htc.c, common.c, tunnel.c, http.c, base64.c这几个文件和port目录下的库
程序流程:
main.c (htc.c)
parse_arguments (argc, argv, &arg);
解析命令行参数, htc.c如果转发端口 (arg.forward_port != -1),在此端口打开socket监听 s = server_socket (arg.forward_port, 0),
backlog=0, 其实不收连接, 注意用了SO_REUSEADDR选项, common.c;进入死循环 for (;;);
如果定义输入输出的终端设备(arg.device),打开设备fd = open_device (arg.device),common.c;否则如果定义了转发端口(arg.forward_port != -1),输入输出通过连接的socket来进行fd = wait_for_connection_on_socket (s),就是accept() , htc.c;
打开一个新的通道 tunnel = tunnel_new_client (
arg.host_name, arg.host_port,
arg.proxy_name, arg.proxy_port,
arg.content_length); tunnel.c
注意tunnel结构中的in_fd, out_fd都初始化为-1,表示没有连接, 缺省的content_length是100K字节.设置通道的一些选项:strict_content_length, keep_alive, max_connection_age, user_agent这些在HTTP头说明中会用到, 支持代理;
如果要进行代理认证(arg.proxy_authorization != NULL),将认证参数进行base64编码,作为通道的proxy_authorization参数;通道连接对方tunnel_connect (tunnel), tunnel.c, 建立http tunnel,主要是调用函数tunnel_write_request (tunnel, TUNNEL_OPEN, auth_data, sizeof auth_data)如果要写入和已经写入的数据长度超过content_length, 对tuenel进行填充;对于客户端已经连接好的tunnel,超时时进行断开;对于断开(或第一次连接)的客户端, 调用tunnel_out_connect (tunnel)发起连接调用do_connect()连接服务器(第一个连接), socket描述符为tunnel->out_fd.设置该socket的一些选项;调用shutdown(out_fd, 0), 不接收数据;调用http_post()函数向服务器发送HTTP的POST命令; http.c调用tunnel_write_data (tunnel, &request, sizeof request)函数向服务器写要执行的请求(此时为TUNNEL_OPEN)
继续写data部分,先写长度,然后是数据(此时为dummy的auth_data=42, length=1)(即HTTP的POST命令向服务器写TUNNEL_OPEN命令和一个dummy数据)然后进行数据长度判断是否在此连接中数据写多了进入函数tunnel_in_connect (tunnel) , 数据进入的连接调用do_connect()连接服务器(第2个连接),socket描述符为tunnel->in_fd.设置该socket的一些选项;调用http_get()函数向服务器发送HTTP的GET命令; http.c 调用shutdown(in_fd, 1), 不再写数据;调用http_parse_response (tunnel->in_fd, &response)解析HTTP服务器返回数据;处理统计信息此时tunnel_connect完成进入下一个循环poll选择用户的输入设备fd和网络tunnel的in_fd(第2条连接)数据,也就是用户的输入信息和服务器返回的信息进行对倒:fd输入->tunnel->out_fd输出; tunnel->in_fd输入->fd输出.handle_input()
handle_device_input()处理用户输入信息, common.c
handle_input()
handle_tunnel_input()处理来自通道的信息, common.c
客户端一共向服务器发起了两个连接, 第一个连接用于发送数据,第2个连接用于接收数据
3. hts
hts是服务器端,安装在外部网络一侧
hts源文件包括hts.c, common.c, tunnel.c, http.c这几个文件和port目录下的库
main() (hts.c)
parse_arguments (argc, argv, &arg); 解析命令行参数, hts.c
调用tunnel = tunnel_new_server (arg.port, arg.content_length)建立新的tunnel的服务端;
初始化tunnel, in_fd, out_fd都为-1
在tunnel->server_socket监听 server_socket (tunnel->dest.host_port, 1), backlog=1, 注意用了SO_REUSEADDR选项, common.c;
设置通道的一些选项:strict_content_length, keep_alive, max_connection_age, 这些在HTTP头说明中会用到;
写PID文件
进入死循环
如果定义输入输出的终端设备(arg.device),打开设备fd = open_device (arg.device),common.c;
tunnel_accept接受外部连接, tunnel.c
accept()连接
解析HTTP协议请求数据: http_parse_request (s, &request), http.c
POST或PUT命令, 将此socket设置为tunnel的in_fd, 用于接收客户端的数据;
GET命令, 将此socket设置为tunnel的out_fd, 用于发送去往客户端的数据;
如果设置了转发端口(arg.forward_port != -1), 调用do_connect连接到这个端口,描述符为fd, 注意这个连接是本机的
自己连自己的内部连接, hts起到代理转发作用, 目标端口也就是真正的被HTTP包裹的协议端口.
进入下一个循环
poll: fd 和tunnel->server_socket, 也就是网络通道数据和内部连接数据对倒
handle_input()
handle_device_input()处理fd输入信息, common.c
handle_input()
handle_tunnel_input()处理来自通道的信息, common.c
服务器端接收了客户端的两个连接, POST命令对应的连接服务器接收数据, GET命令对应的连接服务器
发送数据
4. 防御
对于http tunnel的防御, 可以根据以下方面(或的关系):
1)过滤POST/GET URL关键字: "/index.html?crap="
2)htc发的HTTP请求部分并不在一个包内发完, 分多次小包发送, 可以严格限制此类连接;
3)HTTP数据一般都是成比较大的块的,如果在连接中发现多次传输小包,可能是http tunnel;
4)根据数据行为检查,如果两机器间的HTTP同时存在POST/PUT和GET的连接,而且数据传输并不是很顺畅,总有一定中断然后突发一阵,可能是http tunnel;
5. 总结
http tunnel利用HTTP的POST和GET两个命令建立了两个连接, 分别用于客户端向服务器发送和接收数据, 而且考虑到了HTTP数据的合法性, 会随时检查所接收或发出的数据是否超过content-length规定的长度, 如果是则填充完后重新开连接进行处理新的数据, 保证了数据始终是合法的HTTP数据, 完全等价于客户端在同时用HTTP协议在上传和下载一个大文件, 文件数据中不需要不需要任何的HTTP命令或HTML语言标志, 某篇文章中试图以此来检查是行不通的.
对于http tunnel的防御, 由于它完全遵守了HTTP协议, 用HTTP协议异常来检测是检测不到的, 防御的1,2措施只是制标, 因为代码公开, 完全可以修改成其他URL和完整的HTTP包头一次发送; 防御3,4只是理论上的,需要相当的智能化处理才有可能不误伤正常HTTP数据, 资源消耗大,更适合在IDS而非防火墙上进行.
发表评论
-
Linux内核中流量控制(24)
2011-01-10 16:33 2210本文档的Copyleft归yfydz所 ... -
Linux内核中流量控制(23)
2011-01-10 16:30 1492本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(22)
2011-01-10 16:29 1939本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(21)
2011-01-10 16:28 1357本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(20)
2011-01-10 16:27 1525本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(19)
2011-01-10 16:27 1979本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(18)
2011-01-10 16:26 1572Linux内核中流量控制(18) ... -
Linux内核中流量控制(17)
2011-01-10 16:25 1951本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(16)
2011-01-10 16:25 1807本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(15)
2011-01-10 16:24 1892本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(14)
2011-01-10 16:23 1961本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(13)
2011-01-10 16:22 2638本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(12)
2011-01-10 16:21 2110本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(11)
2011-01-10 16:21 3236本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(10)
2011-01-10 16:20 2007本文档的Copyleft归yfydz所 ... -
Linux内核中流量控制(9)
2011-01-10 16:19 1833本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(8)
2011-01-10 16:18 1498本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(7)
2011-01-10 16:18 2926本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(6)
2011-01-10 16:17 1495本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(5)
2011-01-10 16:16 1730本文档的Copyleft归yfydz所有,使用GPL发布,可以 ...
相关推荐
httptunnel下载,httptunnel下载地址,httptunnel下载说明
开源的Httptunnel,版本3.0.5,稳定版
HttpTunnel是一个开源的HTTP隧道实现。利用它能够方便的将自己应用的通讯进行HTTP封装,而不需要对应用作任何修改。是穿透防火墙的利器。现在一般能找到的是linux版本。有人将其移植到了windows平台。
http-tunnel http-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnelhttp-tunnel
非常实用的源代码,穿透防火墙对协议的限制,vc6.0编译通过
httptunnel_setup翻越QQ、MSN等端口,翻越网络网管封杀的端口。
HTTP Tunnel ,一个将HTTP请求加密为隧道的软件,速度还可以,适用于匿名浏览网络。
现在有很多公司都为自己的网络加装了防火墙,虽然防火墙主要是为了抵抗外敌,但很多公司也拿防火墙阻止员工任意使用 Internet。如果你有某个位于 Internet 的...别担心,防火墙所挡住的,HTTP-Tunnel NG 现在还给你!
使用Http通道软件可以突破防火墙的限制,利用唯一Http访问的权限获得其他Internet应用。
Http-tunnel突破单位网管封杀QQ、MSN端口的方法 ,非常好用,
通过该软件可以让QQ使用80端发送消息,其实就是在本机上架设HTTP代理!
httptunnel_setup.ziphttptunnel_setup.ziphttptunnel_setup.ziphttptunnel_setup.ziphttptunnel_setup.zip
tunnel 最简单,最安全而且快速的方式:利用SSH + CONNECT
通过任何防火墙。你可以利用它使用大多数的即时通讯软件(ATM,ICQ,Yahoo等,同时,它支持TCP,SOCKS5,Napster等。
qq端口被禁用,实现qq登录,附带说明,更改qq设置,实现qq登录。
现在有很多公司都为自己的网络加装了防火墙,虽然防火墙主要是为了抵抗外敌,但很多公司也拿防火墙阻止员工任意使用 Internet。如果你有某个位于 Internet 的...别担心,防火墙所挡住的,HTTP-Tunnel NG 现在还给你!
httptunnel:在HTTP请求中通过隧道传输的双向数据流
好用好用好用好用好用好用好用好用好用好用好用! 要求一定的英语功底!
解脱防火墙的限制,就用此软件,HTTP通道使得不允许的文件也可以传出去