65.9K
CodeProject 正在变化。 阅读更多。
Home

控制从 Internet 到 DMZ 或 Intranet 的 IP 流量

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (5投票s)

2011年12月5日

CPOL

3分钟阅读

viewsIcon

24951

downloadIcon

997

控制从 Internet 到 DMZ 或 Intranet 的 IP 流量

引言

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

PivotTable_Day.jpg

我几年前完成了这项工作,但我希望这对你来说会很有趣。

背景

时不时地,网络中会出现一些问题。 你需要登录到每个系统并查看接口的状态和流量。
如果你看上面的图片,你可以按小时查看主机和流量分组。
这可以帮助你决定在网络架构中更改什么。 这项工作是几年前完成的,并进行了几年的研究。

之前,我毕业于 Cisco CCNA 课程,这帮助我完成了这项工作。 所以,我的网络看起来像这样(从 DMZ 到 Pix 设备的外部接口有静态地址转换)

network.jpg

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)

我需要说一些关于程序和路由器之间如何进行对话的话。
这是此对话中的对话配置

rAsk_Answer.jpg

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

Properties.jpg

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

Menu.jpg

当从路由器读取数据并插入到数据库中时,将调用 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 流量

By_week.jpg

按月划分的 IP 流量

By_month.jpg

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 日
© . All rights reserved.