控制从 Internet 到 DMZ 或 Intranet 的 IP 流量
控制从 Internet 到 DMZ 或 Intranet 的 IP 流量
引言
如果你是应用服务器或网络的管理员,那么了解全局情况会很有趣:网络中哪里出了问题。 这是每十分钟变化的示例图片。 它是安装了 OWC(Office Web Components)的 WebPart

我几年前完成了这项工作,但我希望这对你来说会很有趣。
背景
时不时地,网络中会出现一些问题。 你需要登录到每个系统并查看接口的状态和流量。
如果你看上面的图片,你可以按小时查看主机和流量分组。
这可以帮助你决定在网络架构中更改什么。 这项工作是几年前完成的,并进行了几年的研究。
之前,我毕业于 Cisco CCNA 课程,这帮助我完成了这项工作。 所以,我的网络看起来像这样(从 DMZ 到 Pix 设备的外部接口有静态地址转换)

Using the Code
该程序的想法是尽可能快地读取路由器的数据,并将这些数据存储到“Rain
”表中。 数据由 Microsoft SQL server 触发器和批处理过程计算,结果通过安装了 OWC 的 SharePoint 查看。 触发器的主要目的是使用户可以尽快查看结果。 Cisco 的操作系统可以积累有关流量路径的信息。 每个接口都必须这样配置
Conf t
Int s0
...
ip accounting output-packets
...
Int e0
...
ip accounting output-packets
...
ip accounting-threshold 10000
此数据必须存储到数据库表中。 我在 Microsoft SQL2005 数据库中创建了这个表,如下所示
CREATE TABLE [dbo].[RAIN_TRAFFIC] (
[ID] [bigint] IDENTITY (1, 1) NOT NULL ,
[IPS] [char] (15) NOT NULL ,
[IPD] [char] (15) NOT NULL ,
[PACKETS] [int] NOT NULL ,
[BYTES] [int] NOT NULL ,
[RDATE] [smalldatetime] NOT NULL ,
[SNAME] [varchar] (256) NULL ,
[DNAME] [varchar] (256) NULL
) ON [PRIMARY]
这里是
IPS
- 来自源主机(外部)的 IP 地址IPD
- 到目标主机(内部)的 IP 地址BYTES
- 通过路由器的字节数RDATE
- 从路由器读取行的格式时间tCheckPoint=CTime::GetCurrentTime(); CString sCheckTime=tCheckPoint.Format("{ts \'%Y-%m-%d %H:%M:%S\'}");
它是如何工作的?
可以有任意数量的线程用于将数据写入 SQL 数据库(可能有大量数据等待写入)。 这是线程如何启动的代码
void CIPtrafficDlg::OnTimer(UINT nIDEvent)
{
m_uTimer-=1; // timer counter
CButton *pRunning=(CButton *)GetDlgItem(IDC_CHECK_RUN_THREADs);
if(pRunning->GetCheck()!=1)
{
m_bRun=-1;// stop
}else{
CStatic *pStxtTimer=(CStatic *)GetDlgItem(IDC_STATICTIMER);
CString sTxt;
sTxt.Format("%u",m_uTimer);
pStxtTimer->SetWindowText(sTxt);
}
if(m_uTimer<=0 || !m_iOne)
{
m_iOne=1;
m_uTimer=m_uMXTIMER;
if(getRouterAccounting())
checkCreateThreads();
}
clearTHREADS();
CDialog::OnTimer(nIDEvent);
}
从路由器读取数据的过程
bool CIPtrafficDlg::getRouterAccounting(void)
我需要说一些关于程序和路由器之间如何进行对话的话。
这是此对话中的对话配置

方括号中的数据需要由你的安全数据更改,以便连接到路由器并执行一些命令。 该程序发送数据并等待答案,如本示例脚本对话框所示。 你需要在属性对话框中填写初始数据以连接数据库和路由器

以下是如何调用上述对话框

当从路由器读取数据并插入到数据库中时,将调用 SQL 存储过程(将表中的数据拆分为多个表,以便快速提取数据以进行演示)
execSQL(_T("Exec splitDataFast"));
Microsoft SQL 存储过程
CREATE PROCEDURE [dbo].[splitDataFast]
AS
/* IPTRAFFIC table */
DECLARE @RDATE smalldatetime,@SNAME varchar(256),@DNAME varchar(256)
DECLARE @IPS char(15),@IPD char(15)
DECLARE @PACKETS int,@BYTES int
/* R_IPTRAFFIC table */
DECLARE @iTopID bigint
DECLARE @iSNAME bigint,@iDNAME bigint
DECLARE @iIPS int,@iIPD int
DECLARE iptraffic_cursor CURSOR FOR
SELECT ID,IPS,IPD,SNAME,DNAME,PACKETS,BYTES,RDATE FROM RAIN_TRAFFIC
begin
OPEN iptraffic_cursor
FETCH NEXT FROM iptraffic_cursor INTO @iTopID,@IPS,@IPD,@SNAME,_
@DNAME,@PACKETS,@BYTES,@RDATE
WHILE @@FETCH_STATUS = 0
begin
/* URL Source Name */
begin transaction
SET @iSNAME=(select ID from URL where URL=@SNAME)
if @iSNAME is NULL
begin
insert into URL(URL) VALUES (@SNAME)
SET @iSNAME=IDENT_CURRENT('URL')
end
if @@ERROR<>0
begin
print 'ERR' + 'insert into URL(URL) VALUES (@SNAME)'
print '@SNAME):'+@SNAME
break
end
/* URL Destination Name */
SET @iDNAME=(select ID from URL where URL=@DNAME)
if @iDNAME is NULL
begin
insert into URL(URL) VALUES (@DNAME)
SET @iDNAME=IDENT_CURRENT('URL')
end
if @@ERROR<>0
begin
print 'ERR' + 'select ID from URL where URL=@DNAME'
print '@DNAME):'+@DNAME
break
end
/* IPURL (IP,ID_URL,RDATE) SOURCE*/
SET @iIPS=(select ID from IPURL where IP=@IPS AND ID_URL=@iSNAME)
if @iIPS is NULL
begin
insert into IPURL(IP,ID_URL,RDATE) VALUES (@IPS,@iSNAME,@RDATE)
SET @iIPS=IDENT_CURRENT('IPURL')
end
if @@ERROR<>0
begin
print 'ERR' + 'insert into IPURL(IP,ID_URL) VALUES (@IPS,@iSNAME)'
print '(@IPS,@iDNAME):'+@IPS+','+STR(@iSNAME)
break
end
/* IPURL (IP,ID_URL,RDATE) DESTINATION*/
SET @iIPD=(select ID from IPURL where IP=@IPD AND ID_URL=@iDNAME)
if @iIPD is NULL
begin
insert into IPURL(IP,ID_URL,RDATE) VALUES (@IPD,@iDNAME,@RDATE)
SET @iIPD=IDENT_CURRENT('IPURL')
end
if @@ERROR<>0
begin
print 'ERR' + 'insert into IPURL(IP,ID_URL) VALUES (@IPS,@iDNAME)'
print '(@IPS,@iDNAME):'+@IPD+','+STR(@iDNAME)
break
end
/* IPTRAFFIC */
Set @iTopID=(select ID from IPTRAFFIC where IDS=@iIPS and IDD=@iIPD and RDATE=@RDATE)
if @iTopID is NULL
insert into IPTRAFFIC(IDS,IDD,PACKETS,BYTES,RDATE) VALUES _
(@iIPS,@iIPD,@PACKETS,@BYTES,@RDATE)
if @@ERROR<>0
begin
print 'Can Not insert into IPTRAFFIC(IDS,IDD,PACKETS,BYTES,RDATE)'
print 'IDS:'+STR(@iIPS)
print 'IDD:'+STR(@iIPD)
print 'PACKETS:'+STR(@PACKETS)
print 'BYTES'+STR(@BYTES)
print 'RDATE'+CONVERT(VARCHAR(10),@RDATE)
end
delete from RAIN_TRAFFIC where CURRENT OF iptraffic_cursor
commit
FETCH NEXT FROM iptraffic_cursor INTO @iTopID,@IPS,@IPD,_
@SNAME,@DNAME,@PACKETS,@BYTES,@RDATE
end
CLOSE iptraffic_cursor
DEALLOCATE iptraffic_cursor
end
上述过程从 rain_iptraffic
表中获取数据并填充表
IPTRAFFIC
IPURL
URL
这只是一个想法,你可以创建你自己的后期工作任务!
存储在数据库中的数据可以呈现,例如通过 Excel 中的数据透视表,或者在安装了 OWC 的 Microsoft SharePoint 服务器中。 结果可能看起来像
按周划分的 IP 流量

按月划分的 IP 流量
SharePoint 页面中的上述 WebPart 使用 Microsoft SQL 表中的视图
BytesIPhoursTODAYtotal
(来自表:R_BytesIPURLhours
)BytesIPhoursWEEKtotal
(来自表:R_BytesIPURLDays
)viewKBytesByDays
(来自表:R_BytesIPURLDays
)
存储过程需要定期以不同的时间间隔执行
Exec splitDataFast
(填充表:IPTRAFFIC
)Exec [dbo].spFillReportDaysTable 7
(填充表:R_BytesIPURLDays
)Exec spFillReportMonthTable
(填充表:R_BytesDaysTraffic
)
存储在数据库中的数据可以按 3 个月排列
delete from IPTRAFFIC where datediff(m,rdate,getdate())>3
历史
- 发布于 2011 年 12 月 05 日