先说几句废话。论坛里面的机油有些时候会会问类似的问题,比如这两个求助帖关于某内网3389端口转发不出来 ,内网转发的问题求助,都是内网无法转出来,使用我上次发布的工具很容易就转出来了。再比如这几个求助帖:提权,内网,国外的服务器,转发的时候出现这种情况 ,虽然我没有试过,但是目测和上面的情况差不多。至于是什么原因,我在这里简单说一下:
原因很简单,我们可以把端口转发工具(如lcx等)想象成一个桥,由于客户端和远程主机无法直接连接,需要一个桥梁才可以建立连接,正常情况下,这个桥梁建立起来后,就不会被自动拆掉。但是有一些特殊情况,比如,服务端负载较多,版本不一致,连接客户端太多等问题,都会导致桥梁建立起来后会被服务器自动拆掉。如果是直接连接,mstsc客户端会自动重连,而服务器端收到自动重连,会正常建立起连接来,也就是说有些情况需要2次或者更多次,才可以建立成功的连接。而如果转发工具没有考虑到这一点,就会在服务器拆掉桥梁后无法再次把桥梁自动架起来,导致转发失败,典型的失败效果如下图所示:
知道原因后,解决方法就很简单,那就是让工具支持自动重连就OK了,可以轻松秒掉。说了半天废话,下面说今天的重点内容。
说明:
四月份,我写了端口转发工具第一版,只支持TCP传输,Windows平台。后来,又想要支持端口复用,于是对工具升级。端口复用没有成功,但是还是对程序做了大的改进,目前支持UDP和TCP双通道转发,支持WINDOWS和LINUX平台(跨平台,双通道端口转发)。如果防火墙对TCP有限制,可以试试UDP通道(不一定绝对可以通过)。至于LINUX的转发,也是有实际意义的,我就用它来SSH登录过内网的LINUX主机。(话说这次改进很心酸,写了好几天,主要是遇到各种蛋疼问题,唉~~我把遇到的问题也记录下来了,各种蛋疼啊。。)
下面开始正文:
1.端口复用尝试
1).通过SOCKET的选项SO_REUSEADDR来进行复用测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.s_addr=inet_addr(“10.104.171.216″);//本地对外ip。也就是本机的公网IP地址
ServerAddr.sin_port=htons(RECV_PORT);
val=TRUE;
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)//设置socket选项用来重绑定端口
{
printf(“设置socket选项错误!n”);
return(-1);
}
if(bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)//绑定端口
{
printf(“socket绑定失败!”);
return(-1);
}
|
2).Windwos的远程桌面和Linux的SSH,建立连接后,第一个包的发起者不同。前者是客户端发送第一个包,后者是服务端发送第一个包。这一点, 对Windows和Linux的转发的流程,和使用顺序有影响。
四.程序使用说明
程序参数如下:
然后,linux的SSH反弹回来:
这样,就可以成功登录SSH了:
2.Windows下的UDP通道测试。
同样,先在主机上监听端口,后面不要加-linux参数,而是加-udp参数:
然后,远程主机反弹回来:
然后,mstsc连接过去:
Copyright © hongdaChiaki. All Rights Reserved. 鸿大千秋 版权所有
联系方式:
地址: 深圳市南山区招商街道沿山社区沿山路43号创业壹号大楼A栋107室
邮箱:service@hongdaqianqiu.com
备案号:粤ICP备15078875号