探测远程主机防火墙允许开放端口
天下维客,你可以修改的网络知识库
telnet远程主机端口时,如果很快返回连接失败就说明端口关闭;如果等了十多秒才返回多半是对方装有防火墙。这个方法是对的,可是一共有65535个端口,不会让我慢慢去telnet吧,所以就写个程序自动去扫。
同端口扫描程序类似,这个程序也调用winsock的connect函数,但由于端口是关闭的,所以connect会返回一个错误码10061(连接被拒。由于被目标机器拒绝,连接无法建立);但如果是对方的防火墙拦截了连接请求的话,过段时间就会返回10060错误(连接超时)。利用返回的错误类型我们就可以判断该端口是否为远程主机防火墙允许开放的了。不过这里注意,如果目标ip不存在主机的话也会超时的哦。
- 代理防火墙
- 代理防火墙不让任何直接的网络流通过,而由它作为Internet和内部网络计算机之间的中间媒介。防火墙自己处理各种网络服务而不是只让它们直接通过。
- 例如,登录到网络上的计算机请求一个Internet网页。计算机不直接链接到Internet网络服务提供的网页,而是连到自己网络的代理服务器上,代理服务器识别代理请求,然后以合适的方式传递给相应的Internet网络服务器。远程网络服务器视为来自防火墙服务器的正常网络请求,发送合适的网页,防火墙服务器再把网页返送给计算机。
- 名词辨析
- 防火墙:在电脑运算中,防火墙是一块硬件或软件,在联网环境中发挥作用,以避免安全策略中禁止的一些通信,与建筑中的防火墙功能相似。它有控制资讯基本的任务在不同信任的区域。 典型信任的区域包括网际网路(一个没有信任的区域) 和一个内部网路(一个高信任的区域)
- 代理:英文全称是Proxy Server,可以代理网络用户去获取网络信息,我们上网过程中,一般是使用浏览器直接连接Internet站点获取网络信息,而代理服务器则是介于浏览器和Web服务器之间的一台服务器,使用代理服务器之后,我们的浏览器就不是直接到Web服务器去获取网页信息了,而是先访问代理服务器,然后由代理服务器获取所需要的信息并传送给浏览器。
目录 |
[编辑]
探测远程主机防火墙允许开放端口
原理搞懂了写程序也就很简单了,就是调用winsock的connect。关于winsock编程参考《WINDOWS网络编程技术》吧;嗯,另外注意用多线程,不然的话,呵呵,一整天都扫不完。多线程要使用CreateThread这个API函数,看看MSDN吧。随便在网上找了个扫描器代码参考,写了这个程序,代码如下:
#include
#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
#define MAXThreadCount 100//设置最大线程数
#define SumScanCount 65535//设置扫描端口总数
struct sockaddr_in server;
int ThreadCount=0;
int dwThrdParam = 1; //CreateThread的参数,提到前面好计算
unsigned int resolve(char *name)
struct hostent *he;
unsigned int ip;
if((ip=inet_addr(name))==(-1))
if((he = gethostbyname(name))==0)
printf("ERROR: Don't find the %s .\n",name);
exit(0);
}
memcpy(&ip,he->h_addr,4);
}
return ip;
}
DWORD WINAPI Scan(LPVOID lpParam )
int mysock,code,port=(int)lpParam ;
mysock=socket(AF_INET,SOCK_STREAM,0);
if(mysock < 0) { printf("socket error!");
server.sin_port = htons(port);
if(connect(mysock,(struct sockaddr *) & server,sizeof(server))!=0)
code=GetLastError();
if(code==10061)printf("port %d allown open\n",port);
else
printf("port %d openning\n",port);
closesocket(mysock);
ThreadCount--;
return 0;
}
void thread(int port)
{
DWORD dwThreadId;
HANDLE hThread;
WSADATA ws;
if (WSAStartup( MAKEWORD(2,2), &ws )!=0) �;
{
printf(" [-] WSAStartup() error\n");
exit(0);
}
hThread = CreateThread(
NULL, // no security attributes g
0, // use default stack size
Scan, // thread function
(LPVOID)port, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier n
if (hThread == NULL)
printf( "CreateThread failed." );
dwThrdParam++;
ThreadCount++;
Sleep(200); //延时,否则CPU会用满……
CloseHandle(hThread);
}
void main(int argc, char* argv[])
{
if(argc!=2)
{
printf("\n- This program find port that firewall allow open -\n");
printf("- Only for test by lake2 - \n");
printf("Usage: %s IP\n",argv[0]);
exit(0);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = resolve( argv[1] );
printf("Starting and waiting..............\n");
while( dwThrdParam <= SumScanCount )
{
if( ThreadCount < MAXThreadCount ){ thread(dwThrdParam); }
}
while( ThreadCount!=0 ){ }
WSACleanup();
printf("Done!");
}
运行程序,填上ip它就会自动探测所有端口,由于那些被过滤的端口大概都差不多要等二十秒,速度比较慢,可以自己设个超时值加快速度;另外也可以修改一下让用户自定义扫描范围等等,现在不管了,用得起就行。
程序做好了当然要拿来用啦,经过漫长的3小时多的扫描之后,得到结果:目标主机_blank">防火墙只开放80端口。当场晕死!
[编辑]
参考资料
[编辑]
相关条目
[编辑]


