我是一个热爱编程的机房管理员,为了能控制局域网中的机器只能访问局域网而不能访问INTERNET,绞尽脑汁也没有找到一个好的方法。现在只是通过程序动态更改机器的DNS来控制,但是知道DNS地址的人随便改一下DNS配置就可以上网了。哪位大侠有什么好的思路吗?只要有建议我就给分。谢谢各位!

解决方案 »

  1.   

    1,服务器上的INTERNET共享去掉,或安装天网防火墙,再设置一下(很简单)
      

  2.   

    但是那些机器不是通过某一台代理服务器上网的,所以tanqth(青蛙)的办法不行。还有就是这些设置经常要改动,在路由上做不方便。
      

  3.   

    有那种控制路由器的上网监控软件,直接监视从路由器上经过的数据,具有网络访问控制的功能。现在我的网络是这样的:有192.168.0到192.168.2共三个网段,直接接到网络中心的交换机上,通过那里上网。但是某些时候要禁止部分网段的机器上网,所有可行的办法就是自己做一个程序运行在每一台机器上。我现在用的办法就是通过这个程序动态的禁用DNS,但是一旦启用了DNS,想要禁用的话,虽然TCP/IP属性里面没有了DNS,但是那些机器还是同样可以上网;再一个就是只要是知道DNS地址的人到TCP/IP属性里面改了DNS配置后同样也可以上网。显然,这样的漏洞太大。
      

  4.   

    如果只是禁止上网(即封80端口)倒是很多软件都可以做到。封TCP连接即使就是网络监听型的软件都可以实现这个功能(采用IP欺骗的办法),这样就可以在局域网内的路由器旁边安装一个软件,其他机器不需要任何配置。
      

  5.   

    使用代理服务器
    Proxy,ISA,WinGate 或SysGate
      

  6.   

    你看看这个行不,我们就是用的这个:
    sysGate(为了让局域网内的机子访问互联网)
    天网防火墙(随意控制局域网内的机子访问互联网--想让谁上就让谁上;增强网络安全)
    如果你感觉这个合适你,请回短消息,我在对给你,呵呵,交流嘛
      

  7.   

    上面各位兄台的方法我都考虑过,但是由于种种原因都不太容易实现。我就想在局域网内的机器上想办法,看有没有可能通过自己的程序控制上网。其实我觉得动态屏蔽DNS也可以,只是在98和Me下一旦给机器添加了DNS,想在禁用就必须要重新启动机器才可以生效。Xp下面虽然可以,但是不重新启动的话QQ等聊天工具还是可以用。有没有可能在不重新启动机器的情况下让我的程序能够实现我想要的效果?!
      

  8.   

    楼主已有思路了阿,就是先让网卡禁用再启用。
    用IphlpApi中的函数
    Platform SDK: Internet Protocol Helper SetIfEntryUse the SetIfEntry function to set the administrative status of an interface.
    DWORD SetIfEntry(
     PMIB_IFROW pIfRow
    );Parameters
    pIfRow 
    [in] Pointer to a MIB_IFROW structure. The dwIndex member of this structure specifies the interface on which to set administrative status. The dwAdminStatus member specifies the new administrative status. The dwAdminStatus member can be one of the following values. Value Meaning 
    MIB_IF_ADMIN_STATUS_UP The interface is administratively enabled. 
    MIB_IF_ADMIN_STATUS_DOWN The interface is administratively disabled. Return Values
    If the function succeeds, the return value is NO_ERROR.If the function fails, use FormatMessage to obtain the message string for the returned error.Requirements
    Windows NT/2000/XP: Included in Windows NT 4.0 SP4 and later.
    Windows 95/98/Me: Included in Windows 98 and later.
    Header: Declared in Iphlpapi.h.
    Library: Use Iphlpapi.lib.
      

  9.   

    方法2:
    关闭所有网卡:
    procedure TForm1.DisplayInterfaceList;
    var
     IfTable: PMibIfTable;
     Row: TMibIfRow;
     Size: ULONG;
     I, J: Integer;
     S,ss: string;
    begin
     Size := 0;
     if not GetIfTable(nil, Size, True) = ERROR_BUFFER_OVERFLOW then Exit;
     IfTable := AllocMem(Size);
     try
       if GetIfTable(IfTable, Size, True) = ERROR_SUCCESS then
       begin
         for I := 0 to IfTable^.dwNumEntries - 1 do
         begin
           ss:='';
           Row := IfTable^.Table[I];
           ss:=ss+Format('0x%-x ..... ', [Row.dwIndex]);
           S := '';
           for J := 0 to Row.dwDescrLen - 1 do
             S := S + Chr(Row.bDescr[J]);
           ss:=ss+s;
           Form1.memo1.Lines.Add(ss);
           row.dwAdminStatus:=MIB_IF_ADMIN_STATUS_UP;
           SetIfEntry(row);
         end;
       end;
     finally
       FreeMem(IfTable);
     end;
    end;
    试试行不行啊。不过禁用网卡是比较好的选择。
      

  10.   

    PMibIfTable, TMibIfRow在哪定义的?现在编译不了,还要包含哪些单元?
      

  11.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/setifentry.asp谢谢各位的帮助!