language中文

子网掩码、私有IP地址探索(Internet连接共享安全性)

visibility 338 comment 0 access_time 13 years ago

额,最近刚租房,办的艾普的宽带,但是艾普限制得很死,通过交换机+HomeShare软件都无法共享网络,于是想到通过共享Internet连接的方式,以达到我们三个人同时上网的目的,通过这个简单的交换机组成的局域网。

不过最终是可以共享网络了,但是却出现了问题,因为其他人也可以通过这个共享连接来上网了,这样很不安全而且影响网速。于是想到用防火墙,只允许我两个同事的IP访问我的电脑,结果可能是我没设置好,要么是都不能上网,要么是其他人也能上网,可能还需要再去研究下Avira防火墙规则设置。

于是想到另外一种方法,通过子网掩码找出属于同一个子网的,IP地址与子网掩码按位与计算后刚好只有三个IP地址的网络地址相同的子网掩码。

由于我这个非计算机专业的人对网络知之甚少,所以不知道尝试是否能成功,以后一定要多学习网络相关的知识了。

程序语言:C#

代码如下:(仅计算C类私有地址,IP范围192.168.0.0~192.168.255.255;子网掩码范围255.255.255.1~255.255.255.244)

初步设计的计算类是

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleTests
{
   /// <summary>
   /// IPv4计算类,只计算IP最后一段,前三段相同,计算出统一网络地址IP为指定个数的子网掩码和对应IP,子网掩码范围255.255.255.1-255.255.255.254
   /// </summary>
   /// <remarks>Add by 1987raymond</remarks>
   public class IPCompute
   {
      private int m_LastIPSectionBegin;
      /// <summary>
      /// IP最后一段的起始地址
      /// </summary>
      public int LastIPSectionBegin
      {
         get { return m_LastIPSectionBegin; }
         set
         {
            if (value > 254)
            {
               m_LastIPSectionBegin = 254;
            }
            else
            {
               m_LastIPSectionBegin = value;
            }
         }
      }
      private int m_LastIPSectionEnd;
      /// <summary>
      /// IPv4最后一段的结束点
      /// </summary>
      public int LastIPSectionEnd
      {
         get { return m_LastIPSectionEnd; }
         set
         {
            if (value > 254)
            {
               m_LastIPSectionEnd = 254;
            }
            else
            {
               m_LastIPSectionEnd = value;
            }
         }
      }

      private int m_IPCount;
      /// <summary>
      /// 要计算出的IP的个数
      /// </summary>
      public int IPCount
      {
         get { return m_IPCount; }
         set { m_IPCount = value; }
      }

      /// <summary>
      /// 构造函数
      /// </summary>
      /// <param name="lastIPSectionBegin"></param>
      /// <param name="lastIPSectionEnd"></param>
      /// <param name="ipCount">要计算出的IP的个数</param>
      public IPCompute(int lastIPSectionBegin, int lastIPSectionEnd, int ipCount)
      {
         this.LastIPSectionBegin = lastIPSectionBegin;
         this.LastIPSectionEnd = lastIPSectionEnd;
         this.IPCount = ipCount;
      }

      /// <summary>
      /// 开始计算,这里没有考虑性能哈,直接先计算一遍再筛选
      /// </summary>
      /// <returns></returns>
      public string DoCompute()
      {

         Dictionary<int, Dictionary<int, Dictionary<int, int>>> results = new Dictionary<int, Dictionary<int, Dictionary<int, int>>>();
         int result;
         Dictionary<int, Dictionary<int, int>> ipAndResults;
         //子网掩码最后一段的循环
         for (int i = 1; i < 255; i++)
         {
            ipAndResults = new Dictionary<int, Dictionary<int, int>>();
            //IP地址最后一段的循环
            for (int j = this.LastIPSectionBegin; j <= this.LastIPSectionEnd; j++)
            {
               //计算结果
               result = i & j;
               if (ipAndResults.ContainsKey(result))
               {
                  ipAndResults[result].Add(j, i);
               }
               else
               {
                  Dictionary<int, int> r = new Dictionary<int, int>();
                  r.Add(j, i);
                  ipAndResults.Add(result, r);
               }

            }//end for j
            results.Add(i, ipAndResults);
         }//end for i

         StringBuilder sb = new StringBuilder();
         //开始寻找地址相同且个数为指定个数的IP和掩码
         foreach (int k in results.Keys)
         {
            Dictionary<int, Dictionary<int, int>> r = results[k];

            foreach (int site in r.Keys)
            {
               if (r[site].Keys.Count == this.IPCount)
               {
                  sb.AppendFormat("当子网掩码最后一段为{0}时,有{1}个IP地址换算后的网络地址最后一位相等为{2},IP地址最后一段分别为\n", k, this.IPCount, site);
                  foreach (int v in r[site].Keys)
                  {
                     sb.AppendFormat("{0},", v);
                  }
                  sb.Append("\n");
               }
            }

         }
         return sb.ToString();
      }

   }
}

调用

IPCompute compute = new IPCompute(1, 254, 3);
         Console.Write(compute.DoCompute());

结果如下:

当子网掩码最后一段为63时,有3个IP地址换算后的网络地址最后一位相等为63,IP地址最
后一段分别为
63,127,191,
当子网掩码最后一段为63时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最后
一段分别为
64,128,192,
当子网掩码最后一段为95时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最后
一段分别为
32,128,160,
当子网掩码最后一段为95时,有3个IP地址换算后的网络地址最后一位相等为95,IP地址最
后一段分别为
95,127,223,
当子网掩码最后一段为111时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
16,128,144,
当子网掩码最后一段为111时,有3个IP地址换算后的网络地址最后一位相等为111,IP地址
最后一段分别为
111,127,239,
当子网掩码最后一段为119时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
8,128,136,
当子网掩码最后一段为119时,有3个IP地址换算后的网络地址最后一位相等为119,IP地址
最后一段分别为
119,127,247,
当子网掩码最后一段为123时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
4,128,132,
当子网掩码最后一段为123时,有3个IP地址换算后的网络地址最后一位相等为123,IP地址
最后一段分别为
123,127,251,
当子网掩码最后一段为125时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
2,128,130,
当子网掩码最后一段为125时,有3个IP地址换算后的网络地址最后一位相等为125,IP地址
最后一段分别为
125,127,253,
当子网掩码最后一段为126时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
1,128,129,
当子网掩码最后一段为126时,有3个IP地址换算后的网络地址最后一位相等为126,IP地址
最后一段分别为
126,127,254,
当子网掩码最后一段为159时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
32,64,96,
当子网掩码最后一段为159时,有3个IP地址换算后的网络地址最后一位相等为159,IP地址
最后一段分别为
159,191,223,
当子网掩码最后一段为175时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
16,64,80,
当子网掩码最后一段为175时,有3个IP地址换算后的网络地址最后一位相等为175,IP地址
最后一段分别为
175,191,239,
当子网掩码最后一段为183时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
8,64,72,
当子网掩码最后一段为183时,有3个IP地址换算后的网络地址最后一位相等为183,IP地址
最后一段分别为
183,191,247,
当子网掩码最后一段为187时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
4,64,68,
当子网掩码最后一段为187时,有3个IP地址换算后的网络地址最后一位相等为187,IP地址
最后一段分别为
187,191,251,
当子网掩码最后一段为189时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
2,64,66,
当子网掩码最后一段为189时,有3个IP地址换算后的网络地址最后一位相等为189,IP地址
最后一段分别为
189,191,253,
当子网掩码最后一段为190时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
1,64,65,
当子网掩码最后一段为190时,有3个IP地址换算后的网络地址最后一位相等为190,IP地址
最后一段分别为
190,191,254,
当子网掩码最后一段为207时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
16,32,48,
当子网掩码最后一段为207时,有3个IP地址换算后的网络地址最后一位相等为207,IP地址
最后一段分别为
207,223,239,
当子网掩码最后一段为215时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
8,32,40,
当子网掩码最后一段为215时,有3个IP地址换算后的网络地址最后一位相等为215,IP地址
最后一段分别为
215,223,247,
当子网掩码最后一段为219时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
4,32,36,
当子网掩码最后一段为219时,有3个IP地址换算后的网络地址最后一位相等为219,IP地址
最后一段分别为
219,223,251,
当子网掩码最后一段为221时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
2,32,34,
当子网掩码最后一段为221时,有3个IP地址换算后的网络地址最后一位相等为221,IP地址
最后一段分别为
221,223,253,
当子网掩码最后一段为222时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
1,32,33,
当子网掩码最后一段为222时,有3个IP地址换算后的网络地址最后一位相等为222,IP地址
最后一段分别为
222,223,254,
当子网掩码最后一段为231时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
8,16,24,
当子网掩码最后一段为231时,有3个IP地址换算后的网络地址最后一位相等为231,IP地址
最后一段分别为
231,239,247,
当子网掩码最后一段为235时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
4,16,20,
当子网掩码最后一段为235时,有3个IP地址换算后的网络地址最后一位相等为235,IP地址
最后一段分别为
235,239,251,
当子网掩码最后一段为237时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
2,16,18,
当子网掩码最后一段为237时,有3个IP地址换算后的网络地址最后一位相等为237,IP地址
最后一段分别为
237,239,253,
当子网掩码最后一段为238时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
1,16,17,
当子网掩码最后一段为238时,有3个IP地址换算后的网络地址最后一位相等为238,IP地址
最后一段分别为
238,239,254,
当子网掩码最后一段为243时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
4,8,12,
当子网掩码最后一段为243时,有3个IP地址换算后的网络地址最后一位相等为243,IP地址
最后一段分别为
243,247,251,
当子网掩码最后一段为245时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
2,8,10,
当子网掩码最后一段为245时,有3个IP地址换算后的网络地址最后一位相等为245,IP地址
最后一段分别为
245,247,253,
当子网掩码最后一段为246时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
1,8,9,
当子网掩码最后一段为246时,有3个IP地址换算后的网络地址最后一位相等为246,IP地址
最后一段分别为
246,247,254,
当子网掩码最后一段为249时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
2,4,6,
当子网掩码最后一段为249时,有3个IP地址换算后的网络地址最后一位相等为249,IP地址
最后一段分别为
249,251,253,
当子网掩码最后一段为250时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
1,4,5,
当子网掩码最后一段为250时,有3个IP地址换算后的网络地址最后一位相等为250,IP地址
最后一段分别为
250,251,254,
当子网掩码最后一段为252时,有3个IP地址换算后的网络地址最后一位相等为0,IP地址最
后一段分别为
1,2,3,
当子网掩码最后一段为252时,有3个IP地址换算后的网络地址最后一位相等为252,IP地址
最后一段分别为
252,253,254,

但是从计算结果我们可以看出这样做并不正确,因为还没有排除当子网掩码最后一段不相同,但是计算结果却相同的情况,或者子网掩码相同时属于同一子网的必要条件但是不是充分条件,还有就是子网掩码和ip地址是不能随意设置的

这里的仅最后的当子网掩码最后一段为252时,有3个IP地址换算后的网络地址最后一位相等为252,IP地址
最后一段分别为
252,253,254,

是正确的

其实这些都是因为自己之前对TCP/IP不是很了解,根本不用这样计算的

因为子网掩码前边都是1代表网络号后边代表主机号

子网掩码一个简洁算法转载:

很多人肯定对设定子网掩码这个不熟悉,很头疼,那么我现在就告诉大家一个很容易算子网掩码的方法,帮助一下喜欢偷懒的人:)
  
  大家都应该知道2的0次方到10次方是多少把?也给大家说一下,分别是:
  1 2 4 8 16 32 64 128 256 512 1024。
  
  如果你希望每个子网中只有5个ip地址可以给机器用,那么你就最少需要准备给每个子网7个ip地址,因为需要加上两头的不可用的网络和广播ip,所以你需要选比7多的最近的那位,也就是8,就是说选每个子网8个ip。好,到这一步,你就可以算掩码了,这个方法就是:最后一位掩码就是256减去你每个子网所需要的ip地址的数量,那么这个例子就是256-8=248,那么算出这个,你就可以知道那些ip是不能用的了,看:0-7,8-15,16-23,24-31依此类推,写在上面的0、7、8、15、16、23、24、31(依此类推)都是不能用的,你应该用某两个数字之间的IP,那个就是一个子网可用的IP,怎么了?是不是不相信?太简单了。。。
  
  我再试验一下,就拿200台机器分成4个子网来做例子吧。
  200台机器,4个子网,那么就是每个子网50台机器,设定为192.168.10.0,C类的IP,大子网掩码应为255.255.255.0,对巴,但是我们要分子网,所以按照上面的,我们用32个IP一个子网内不够,应该每个子网用64个IP(其中62位可用,足够了吧),然后用我的办法:子网掩码应该是256-64=192,那么总的子网掩码应该为:255.255.255.192。不相信?算算:0-63,64-127,128-191,192-255,这样你就可以把四个区域分别设定到四个子网的机器上了,是不是很简单?不需要软件算了吧。。。呵呵。。希望大家能看懂我写的。。。。

百科参考:http://baike.baidu.com/view/878.htm

info Last modified by Raymond 13 years ago copyright This page is subject to Site terms.

Subscribe newsletter

Please log in or register to comment.

account_circle Log in person_add Register

Log in with external accounts