在目标 IP/端口上生成 ESTABLISHED 空闲连接





0/5 (0投票)
检查服务器是否正确处理空闲连接限制
引言
您的服务器是否正确处理空闲连接?它是否处理来自同一 IP 地址的多个连接?连接超时有助于减少空闲连接消耗的处理资源损失。当您启用连接超时时,IIS 在连接级别强制执行超时。IIS/Apache 和大多数 HTTP 服务器都相当安全,但许多非典型服务器并非如此,并且容易受到恶意连接的影响。
此脚本对于生成与服务器/端口的 ESTABLISHED 空闲连接非常有用。
背景
我将此脚本运行到我的 win2k 服务器上,它真的因为 3000 个打开的连接而变得迟缓,而脚本使用的内存却很少。
我也将此脚本测试到我的 winXP IIS 服务器上,它在建立仅 10 个套接字后就拒绝连接。我提前终止了服务器压力测试,因为我不确定我的 ISP 会如何处理它或后果会如何……
我相信在 Linux 下,可以玩弄 IPtables 或也许创建原始数据包来故意不发送 [RST]。但是,在 Windows 下,我找不到任何东西。
Using the Code
例如,它的工作原理如下。它调用一个 Windows 工具
netsh interface ip set address name="Wireless Network Connection" static 192.168.1.4 255.255.255.0 1.1.1.1 1
这将设置一个假的网关 1.1.1.1,从而关闭我所有的本地 Perl 套接字,从而生成典型的 [RST] 数据包,但它们无法通知目标服务器,因为网关是假的。接下来,我会重新打开网关
netsh interface ip set address name="Wireless Network Connection" static 192.168.1.4 255.255.255.0 192.168.1.1 1
然后生成 100 个新的打开的套接字并重复该过程。
此脚本阻止任何客户端到服务器的 http [RST, ACK] 数据包,这使服务器套接字保持在 ESTABLISHED 状态。下面的脚本打开 100 个套接字到目标服务器 127.0.0.1 的 80 端口,在本地关闭它们,并重复此操作……
#!/usr/bin/perl -w
# Generates ESTABLISHED idle connections on the target IP/port.
use IO::Socket;
use Thread;
use Win32::OLE qw(in);
# --- SCRIPT CONFIGURATION ---
my $host="127.0.0.1";
my $port=80;
# --- END CONFIGURATION ---
my $ip="";
my $gateway="";
my $fake_gateway="1.1.1.1";
my $mask="";
my $adpater="";
print "Getting local IP, Gateway, and Subnet Mask.\n";
$object=Win32::OLE->GetObject('winmgmts:{impersonationLevel=impersonate}!//.');
foreach my $nic(in$object->InstancesOf('Win32_NetworkAdapterConfiguration')){
next unless $nic->{IPEnabled};
$ip=@{$nic->{IPAddress}}[0];
$gateway=@{$nic->{DefaultIPGateway}}[0];
$mask=@{$nic->{IPSubnet}}[0];
print "$ip $gateway $mask\n";
last;
}
print "Getting Ethernet Adapter Name.\n";
$objWMI = Win32::OLE->GetObject("winmgmts://./root/cimv2");
$colNAs = $objWMI->InstancesOf('Win32_NetworkAdapter');
foreach my $objNA (in $colNAs){
next unless $objNA->{NetEnabled};
$adapter=$objNA->NetConnectionID;
print "$adapter\n";
last;
}
while (1) {
for ($n=0;$n<=100;$n++){
$thr=new Thread\&connect;
$thr->detach;
$t++;
print "Connection: $t\n";
# Sleep 0.5 seconds...
select(undef, undef, undef, 0.5);
}
print "\nDisabling Gateway...\n";
system("netsh interface ip set address name=\"$adapter\"
static $ip $mask $fake_gateway 1");
sleep 5;
print "\nEnabling Gateway....\n";
system("netsh interface ip set address name=\"$adapter\" static $ip $mask $gateway 1");
sleep 5;
}
sub connect{IO::Socket::INET->new(Proto=>"tcp",PeerAddr=>$host,PeerPort=>$port);}
关注点
此 Perl 脚本可以识别当前启用的网卡并提取诸如 NetConnectionID、IP 地址、网关和子网掩码等信息。此外,它可以使用这些信息来调用 netsh.exe 以动态地更改网卡。很酷!谢谢。
历史
- 2009 年 9 月 16 日:初始发布