Пример #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="IPAddressRange"/> class.
        /// </summary>
        /// <param name="cidr">
        /// An IP network that represents a starting IP and a subnet in a CIDR notation.
        /// </param>
        public IPAddressRange(IPNetwork cidr)
        {
            if (cidr == null)
            {
                throw new ArgumentNullException("cidr");
            }

            m_addressFamily = cidr.FirstUsable.AddressFamily;
            m_lowerBytes = cidr.FirstUsable.GetAddressBytes();
            m_upperBytes = cidr.LastUsable.GetAddressBytes();
        }
Пример #2
0
 protected override void BecauseOf()
 {
     m_result = new IPNetwork(Value, PrefixLength);
 }
Пример #3
0
        private static bool TryParseIPNetwork(string ip, CidrParseEnum cidrParseEnum, byte cidr, out IPNetwork ipn) {

            IPNetwork ipnetwork = null;
            if (cidrParseEnum == CidrParseEnum.Default) {
                if (!IPNetwork.TryParse(ip, out ipnetwork)) {
                    ipn = null;
                    return false;
                }
            }
            else if (cidrParseEnum == CidrParseEnum.Value) {
                if (!IPNetwork.TryParse(ip, cidr, out ipnetwork)) {
                    if (!IPNetwork.TryParse(ip, out ipnetwork)) {
                        ipn = null;
                        return false;
                    }
                }
            }
            ipn = ipnetwork;
            return true;
        }
Пример #4
0
 protected override void BecauseOf()
 {
     m_result = new IPNetwork(Value, PrefixLength);
 }
 internal IPAddressCollection(IPNetwork ipnetwork)
 {
     this._ipnetwork  = ipnetwork;
     this._enumerator = -1;
 }
Пример #6
0
 internal static bool IsIn(this IPAddress address, IPNetwork network) => network.Contains(address);
Пример #7
0
 internal IPAddressCollection(IPNetwork ipnetwork, FilterEnum filter)
 {
     this._ipnetwork = ipnetwork;
     this._filter    = filter;
     Reset();
 }
Пример #8
0
 public override IPRanges GetIPRanges()
 {
     return(new IPRanges(new IPRange(IPNetwork.Parse(Subnet, Netmask))));
 }
Пример #9
0
 public geoIp(IPNetwork network, GeoLocateResult data)
 {
     Network = network;
     Result  = data;
 }
Пример #10
0
        public static IPAddress[] ConvertIPRangeToIPAddresses(string[] ipRanges, CancellationToken cancellationToken)
        {
            ConcurrentBag <IPAddress> bag = new ConcurrentBag <IPAddress>();

            ParallelOptions parallelOptions = new ParallelOptions()
            {
                CancellationToken = cancellationToken
            };

            foreach (string ipOrRange in ipRanges)
            {
                // Match 192.168.0.1
                if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressRegex))
                {
                    bag.Add(IPAddress.Parse(ipOrRange));
                    continue;
                }

                // Match 192.168.0.0/24 or 192.168.0.0/255.255.255.0
                if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressCidrRegex) || Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressSubnetmaskRegex))
                {
                    IPNetwork network = IPNetwork.Parse(ipOrRange);

                    Parallel.For(IPv4AddressHelper.ConvertToInt32(network.Network), IPv4AddressHelper.ConvertToInt32(network.Broadcast) + 1, parallelOptions, i =>
                    {
                        bag.Add(IPv4AddressHelper.ConvertFromInt32(i));

                        parallelOptions.CancellationToken.ThrowIfCancellationRequested();
                    });

                    continue;
                }

                // Match 192.168.0.0 - 192.168.0.100
                if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressRangeRegex))
                {
                    string[] range = ipOrRange.Split('-');

                    Parallel.For(IPv4AddressHelper.ConvertToInt32(IPAddress.Parse(range[0])), IPv4AddressHelper.ConvertToInt32(IPAddress.Parse(range[1])) + 1, parallelOptions, i =>
                    {
                        bag.Add(IPv4AddressHelper.ConvertFromInt32(i));

                        parallelOptions.CancellationToken.ThrowIfCancellationRequested();
                    });

                    continue;
                }

                // Convert 192.168.[50-100,200].1 to 192.168.50.1, 192.168.51.1, 192.168.52.1, {..}, 192.168.200.1
                if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressSpecialRangeRegex))
                {
                    string[] octets = ipOrRange.Split('.');

                    List <List <int> > list = new List <List <int> >();

                    // Go through each octet...
                    for (int i = 0; i < octets.Length; i++)
                    {
                        List <int> innerList = new List <int>();

                        // Create a range for each octet
                        if (Regex.IsMatch(octets[i], RegexHelper.SpecialRangeRegex))
                        {
                            foreach (string numberOrRange in octets[i].Substring(1, octets[i].Length - 2).Split(','))
                            {
                                // 50-100
                                if (numberOrRange.Contains("-"))
                                {
                                    string[] rangeNumbers = numberOrRange.Split('-');

                                    for (int j = int.Parse(rangeNumbers[0]); j < (int.Parse(rangeNumbers[1]) + 1); j++)
                                    {
                                        innerList.Add(j);
                                    }
                                } // 200
                                else
                                {
                                    innerList.Add(int.Parse(numberOrRange));
                                }
                            }
                        }
                        else
                        {
                            innerList.Add(int.Parse(octets[i]));
                        }

                        list.Add(innerList);
                    }

                    // Build the new ipv4
                    foreach (int i in list[0])
                    {
                        foreach (int j in list[1])
                        {
                            foreach (int k in list[2])
                            {
                                foreach (int h in list[3])
                                {
                                    bag.Add(IPAddress.Parse(string.Format("{0}.{1}.{2}.{3}", i, j, k, h)));
                                }
                            }
                        }
                    }

                    continue;
                }
            }

            return(bag.ToArray());
        }
Пример #11
0
        private static IDictionary <IPNetwork, string> CreateSubnetDictionary(string ipFilePath)
        {
            var    subnets    = new Dictionary <IPNetwork, string>();
            string ipFileList = ConfigurationManager.AppSettings["AzureIpRangeFileList"];

            // Load Azure ip range data
            foreach (string filePath in ipFileList.Split(';'))
            {
                var xmlDoc = new XmlDocument();
                xmlDoc.Load(ipFilePath + @"\IpRangeFiles\Azure\" + filePath);
                var root = xmlDoc.DocumentElement;
                foreach (XmlElement ele in root)
                {
                    string region = ele.GetAttribute("Name");
                    foreach (XmlElement ipRange in ele)
                    {
                        var       subnet = ipRange.GetAttribute("Subnet");
                        IPNetwork net;
                        if (IPNetwork.TryParse(subnet, out net))
                        {
                            if (!subnets.ContainsKey(net))
                            {
                                subnets.Add(net, region);
                            }
                        }
                    }
                }
            }

            // Get AWS ip range data
            string awsIpFile      = ConfigurationManager.AppSettings["AwsIpRangeFile"];
            string json           = File.ReadAllText(ipFilePath + @"\IpRangeFiles\AWS\" + awsIpFile);
            var    jsSerializer   = new JavaScriptSerializer();
            var    awsIpRangeData = jsSerializer.Deserialize <AwsIpRangeData>(json);

            foreach (var prefix in awsIpRangeData.prefixes)
            {
                IPNetwork net;
                if (IPNetwork.TryParse(prefix.ip_prefix, out net))
                {
                    if (!subnets.ContainsKey(net))
                    {
                        subnets.Add(net, prefix.region);
                    }
                }
            }

            // Get AliCloud ip range data
            string aliCloudIpFile = ConfigurationManager.AppSettings["AliCloudIpRangeFile"];

            string[] lines = File.ReadAllLines(ipFilePath + @"\IpRangeFiles\AliCloud\" + aliCloudIpFile);
            foreach (var line in lines)
            {
                IPNetwork net;
                if (IPNetwork.TryParse(line, out net))
                {
                    if (!subnets.ContainsKey(net))
                    {
                        subnets.Add(net, "alicloud");
                    }
                }
            }
            return(subnets);
        }
Пример #12
0
        public static IPAddress[] CreateIPAddressesFromIPRanges(string[] ipRanges, CancellationToken cancellationToken)
        {
            var bag = new ConcurrentBag <IPAddress>();

            var parallelOptions = new ParallelOptions
            {
                CancellationToken = cancellationToken
            };

            foreach (var ipOrRange in ipRanges)
            {
                // 192.168.0.1
                if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressRegex))
                {
                    bag.Add(IPAddress.Parse(ipOrRange));
                    continue;
                }

                // 192.168.0.0/24 or 192.168.0.0/255.255.255.0
                if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressCidrRegex) || Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressSubnetmaskRegex))
                {
                    var network = IPNetwork.Parse(ipOrRange);

                    Parallel.For(IPv4Address.ToInt32(network.Network), IPv4Address.ToInt32(network.Broadcast) + 1, parallelOptions, i =>
                    {
                        bag.Add(IPv4Address.FromInt32(i));

                        parallelOptions.CancellationToken.ThrowIfCancellationRequested();
                    });

                    continue;
                }

                // 192.168.0.0 - 192.168.0.100
                if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressRangeRegex))
                {
                    var range = ipOrRange.Split('-');

                    Parallel.For(IPv4Address.ToInt32(IPAddress.Parse(range[0])), IPv4Address.ToInt32(IPAddress.Parse(range[1])) + 1, parallelOptions, i =>
                    {
                        bag.Add(IPv4Address.FromInt32(i));

                        parallelOptions.CancellationToken.ThrowIfCancellationRequested();
                    });

                    continue;
                }

                // 192.168.[50-100,200].1 --> 192.168.50.1, 192.168.51.1, 192.168.52.1, {..}, 192.168.200.1
                if (Regex.IsMatch(ipOrRange, RegexHelper.IPv4AddressSpecialRangeRegex))
                {
                    var octets = ipOrRange.Split('.');

                    var list = new List <List <int> >();

                    // Go through each octet...
                    foreach (var octet in octets)
                    {
                        var innerList = new List <int>();

                        // Create a range for each octet
                        if (Regex.IsMatch(octet, RegexHelper.SpecialRangeRegex))
                        {
                            foreach (var numberOrRange in octet.Substring(1, octet.Length - 2).Split(','))
                            {
                                // 50-100
                                if (numberOrRange.Contains("-"))
                                {
                                    var rangeNumbers = numberOrRange.Split('-');

                                    for (var i = int.Parse(rangeNumbers[0]); i < (int.Parse(rangeNumbers[1]) + 1); i++)
                                    {
                                        innerList.Add(i);
                                    }
                                } // 200
                                else
                                {
                                    innerList.Add(int.Parse(numberOrRange));
                                }
                            }
                        }
                        else
                        {
                            innerList.Add(int.Parse(octet));
                        }

                        list.Add(innerList);
                    }

                    // Build the new ipv4
                    foreach (var i in list[0])
                    {
                        foreach (var j in list[1])
                        {
                            foreach (var k in list[2])
                            {
                                foreach (var h in list[3])
                                {
                                    bag.Add(IPAddress.Parse($"{i}.{j}.{k}.{h}"));
                                }
                            }
                        }
                    }

                    continue;
                }

                // 2001:db8:85a3::8a2e:370:7334
                if (Regex.IsMatch(ipOrRange, RegexHelper.IPv6AddressRegex))
                {
                    bag.Add(IPAddress.Parse(ipOrRange));
                }
            }

            return(bag.ToArray());
        }
Пример #13
0
        static void Main(string[] args)
        {
            var showHelp   = false;
            var loadTarget = 4;

            var options = new OptionSet
            {
                "Usage: TlsConnectStressTest.exe --load 4",
                { "h|?|help", "Displays usage instructions.", val => showHelp = val != null },
                { "load=", "Amount of load to generate, from 1 to N", (int x) => loadTarget = x }
            };

            var remainingOptions = options.Parse(args);

            if (showHelp)
            {
                options.WriteOptionDescriptions(Console.Out);
                return;
            }

            if (remainingOptions.Count != 0)
            {
                Console.WriteLine("Unknown command line parameters: {0}", string.Join(" ", remainingOptions.ToArray()));
                Console.WriteLine("For usage instructions, use the --help command line parameter.");
                return;
            }

            var targetUrl = new Uri("https://localhost:443");
            var payload   = Helpers.Random.GetBytes(1 * 1024 * 1024);

            var iterations = 0L;

            var clientRange     = IPNetwork.Parse("127.0.0.0/16");
            var clientAddresses = new List <IPAddress>(256 * 256 * 256);

            foreach (var address in clientRange.ListIPAddress(FilterEnum.Usable).ToList())
            {
                clientAddresses.Add(address);
            }

            var serverEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 443);

            var threadCount = loadTarget;
            var threads     = new Thread[threadCount];

            for (var i = 0; i < threadCount; i++)
            {
                bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => true;

                void ThreadEntryPoint()
                {
                    while (true)
                    {
                        try
                        {
                            // We exhaust local dynamic port pool per IP address, so just hop addresses.
                            var clientAddress = Helpers.Random.GetRandomItem(clientAddresses);

                            using var client = new TcpClient(new IPEndPoint(clientAddress, 0));

                            // We want to send small packets, trickled one by one.
                            client.NoDelay = true;

                            // One would hope that this prevents the client port from hanging around for long.
                            // One would be wrong but we might as well try.
                            client.LingerState.Enabled    = false;
                            client.LingerState.LingerTime = 1;

                            // Just in case.
                            client.SendTimeout    = 1000;
                            client.ReceiveTimeout = 1000;

                            client.Connect(serverEndpoint);

                            using var rawStream = client.GetStream();
                            using var slicer    = new SlicerStream(rawStream);
                            using var stream    = new SslStream(slicer, false, ValidateServerCertificate, null);

                            stream.AuthenticateAsClient("127.0.0.1");

                            stream.Write(payload);
                            stream.Flush();
                            stream.ReadByte();

                            rawStream.Close(100);
                        }
                        catch
                        {
                            // Don't really care about errors.
                        }
                        finally
                        {
                            Interlocked.Increment(ref iterations);
                        }
                    }
                }

                threads[i] = new Thread(ThreadEntryPoint)
                {
                    IsBackground = true,
                    Name         = $"Worker #{i}"
                };

                threads[i].Start();
            }

            Console.WriteLine($"Starting https://127.0.0.1:443 with {threadCount} threads.");

            while (true)
            {
                Thread.Sleep(TimeSpan.FromSeconds(5));

                Console.WriteLine($"Iteration {iterations:N0}");
            }
        }
Пример #14
0
        /// <summary>
        /// Gets all unique <c>pairs</c> of hosts with monitoring flag set and which share the same subnet.<br/>
        /// Subnets with less than or more than two hosts will be discarded.
        /// </summary>
        /// <param name="hamnetDbAccess">The handle to access the database.</param>
        /// <param name="subnet">The subnet to return data for.</param>
        /// <returns>The dictionary mapping a subnet to its unique monitored host pair.</returns>
        public static IReadOnlyDictionary <IHamnetDbSubnet, IHamnetDbHosts> UniqueMonitoredHostPairsInSubnet(this IHamnetDbAccess hamnetDbAccess, IPNetwork subnet)
        {
            if (hamnetDbAccess == null)
            {
                throw new ArgumentNullException(nameof(hamnetDbAccess), "hamnetDbAccess to work with is null");
            }

            if (subnet == null)
            {
                throw new ArgumentNullException(nameof(subnet), "subnet search monitored hosts for is null");
            }

            var directSupportHamnetAccess = hamnetDbAccess as IDirectSupportOfHamnetDbAccessExtensions;

            if (directSupportHamnetAccess != null)
            {
                return(directSupportHamnetAccess.UniqueMonitoredHostPairsInSubnet(subnet));
            }

            var hosts      = hamnetDbAccess.QueryMonitoredHosts();
            var allSubnets = hamnetDbAccess.QuerySubnets();

            // filter out parents for which we have nested subnets
            var subnets = allSubnets.Where(s => !allSubnets.Any(a => !object.ReferenceEquals(s.Subnet, a.Subnet) && s.Subnet.Contains(a.Subnet)));

            var association = subnets.AssociateHosts(hosts);

            var uniquePairs = association
                              .Where(a => subnet.Contains(a.Key.Subnet) || subnet.Equals(a.Key.Subnet))
                              .Where(a => a.Value.Count == 2)
                              .ToDictionary(k => k.Key, v => v.Value);

            return(uniquePairs);
        }
Пример #15
0
 public Subnet(String input)
 {
     Input   = input;
     Network = IPNetwork.Parse(input);
 }
        public void FindDevices()
        {
            DevicesLoading      = true;
            DevicesAlreadyAdded = 0;
            DevicesNotAdded     = 0;
            NetworkNodesFound   = 0;
            nodesChecked        = 0;
            DeviceInfos.Clear();
            addressRange = null;
            LogItems.Clear();

            pingTimeout = PingTimeout;

            var hostIp     = Network_Functions.GetHostIP();
            var hostSubnet = Network_Functions.GetSubnetMask(hostIp);

            if (hostIp != null && hostSubnet != null)
            {
                var ipNetwork = IPNetwork.Parse(hostIp, hostSubnet);
                if (ipNetwork != null)
                {
                    var ips = IPNetwork.ListIPAddress(ipNetwork).ToList();
                    if (ips != null && ips.Count > 0)
                    {
                        // Get Start Address
                        IPAddress start = null;
                        IPAddress.TryParse(StartAddress, out start);

                        // Get End Address
                        IPAddress end = null;
                        IPAddress.TryParse(EndAddress, out end);

                        if (start != null && end != null)
                        {
                            AddtoLog(LogType.INFO, "Starting Auto Detect..");
                            AddtoLog(LogType.INFO, "IP Address Range : From " + start.ToString() + " to " + end.ToString());
                            AddtoLog(LogType.INFO, "Port Range : From " + portRangeStart.ToString() + " to " + portRangeStop.ToString());

                            var range = new Network_Functions.IPAddressRange(start, end);

                            addressRange = ips.FindAll(o => range.IsInRange(o));

                            int localhostIndex = addressRange.FindIndex(o => o.ToString() == hostIp.ToString());
                            if (localhostIndex >= 0)
                            {
                                addressRange[localhostIndex] = IPAddress.Loopback;
                            }
                        }
                    }
                }
            }

            portRangeStart = StartPort;
            portRangeStop  = EndPort;

            SearchProgressValue   = 0;
            SearchProgressMaximum = 0;

            stop = new ManualResetEvent(false);

            ThreadPool.QueueUserWorkItem(new WaitCallback(FindDevices_Worker));
        }
Пример #17
0
        public IEnumerable <ValidationResult> Validate(ValidationContext validationContext)
        {
            var results = new List <ValidationResult>();

            // Subnet name must be unique.
            if (VirtualNetwork.Subnets.Where(s => s.Name.Equals(Name)).FirstOrDefault() != null)
            {
                results.Add(new ValidationResult("Subnet name must be unique within a virtual network."));
            }
            // IpPerInstance must be > 0 for non fixed cidr.
            if (!Service.FixedSubnetCidr && IpPerInstance <= 0)
            {
                results.Add(new ValidationResult("Address/Instance must be greater than 0."));
            }
            // Number of instances need to be between min and max.
            if (!Service.FixedSubnetCidr && Service.MaxInstances > Service.MinInstances &&
                (ServiceInstances > Service.MaxInstances || ServiceInstances < Service.MinInstances))
            {
                results.Add(new ValidationResult($"The instance must be between {Service.MinInstances} and {Service.MaxInstances}."));
            }

            var       ipAddress = IPAddress.Parse(StartIP);
            IPNetwork network1  = IPNetwork.Parse("10.0.0.0/8");
            IPNetwork network2  = IPNetwork.Parse("172.16.0.0/12");
            IPNetwork network3  = IPNetwork.Parse("192.168.0.0/16");

            if (!network1.Contains(ipAddress) && !network2.Contains(ipAddress) && !network3.Contains(ipAddress))
            {
                results.Add(new ValidationResult($"The start ip is not in the range of RFC1918."));
                return(results);
            }

            var network = Network;

            if (IPRangeId < 0)
            {
                results.Add(new ValidationResult($"The subnet address range {network} is not contained in the virtual network's address spaces."));
                return(results);
            }
            // Validate CIDR block.
            if (!Equals(network.Network, ipAddress))
            {
                var current = IPNetwork.ToBigInteger(network.Network);
                var next    = current + network.Total;
                var nextIp  = IPNetwork.ToIPAddress(next, AddressFamily.InterNetwork);
                results.Add(new ValidationResult($"{StartIP}/{network.Cidr} is not a valid CIDR block. Try {network.Network} or {nextIp} instead."));
                return(results);
            }

            // Overlap with other subnets
            foreach (var subnet in VirtualNetwork.Subnets)
            {
                if (network.Overlap(subnet.Network))
                {
                    results.Add(new ValidationResult($"The subnet address range {network} overlaps with {subnet.Name} address range {subnet.Network}."));
                    break;
                }
            }

            return(results);
        }
Пример #18
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="pathBlocksIp">Ruta de bloques ip</param>
        /// <param name="pathLocations">Ruta de posiciones</param>
        public GeoLite2LocationProvider(string pathBlocksIp, string pathLocations)
        {
            if (File.Exists(pathBlocksIp) && File.Exists(pathLocations))
            {
                Dictionary <long, GeoLocateResult> data = new Dictionary <long, GeoLocateResult>();

                using (Stream fs = CompressHelper.UnGzFile(pathLocations))
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        Parallel.ForEach <string>(LineGenerator(sr), line =>
                        {
                            string[] sp = line.Split(',');
                            if (sp.Length <= 0)
                            {
                                return;
                            }

                            long c;
                            if (long.TryParse(sp[0], out c))
                            {
                                switch (sp.Length)
                                {
                                case 6:
                                    {
                                        // Archivo de paises
                                        GeoLocateResult add = new GeoLocateResult(sp[2] + "-" + sp[4], (string.IsNullOrEmpty(sp[3]) ? "" : sp[3] + " - ") + sp[5]);
                                        lock (data) data.Add(c, add);
                                        break;
                                    }

                                case 13:
                                    {
                                        // Archivo de paises y poblaciones
                                        GeoLocateResult add = new GeoLocateResult(sp[2] + "-" + sp[4], (string.IsNullOrEmpty(sp[12]) ? "" : sp[12] + " - ") + sp[5]);
                                        lock (data) data.Add(c, add);
                                        break;
                                    }
                                }
                            }
                        }
                                                  );
                    }

                List <geoIp> l = new List <geoIp>();
                using (Stream fs = CompressHelper.UnGzFile(pathBlocksIp))
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        Parallel.ForEach <string>(LineGenerator(sr), line =>
                        {
                            string[] sp = line.Split(',');
                            // El archivo grande y pequeño están organizados igual
                            if (sp.Length != 10 && sp.Length != 6)
                            {
                                return;
                            }

                            long c;
                            GeoLocateResult r;
                            if (long.TryParse(sp[2], out c) && data.TryGetValue(c, out r))
                            {
                                IPNetwork net;
                                if (IPNetwork.TryParse(sp[0], out net))
                                {
                                    geoIp add = new geoIp(net, r);
                                    lock (l) l.Add(add);
                                }
                            }
                        }
                                                  );
                    }
                _Locates = l.ToArray();
            }
        }
Пример #19
0
        private async void ProcessMessageAsync(UdpReceiveResult udpMessage)
        {
            await Task.Run(async() =>
            {
                DnsMessage message = new DnsMessage();
                DnsQuestion question;

                try
                {
                    var respondedFromCache = false;

                    try
                    {
                        message  = DnsMessage.Parse(udpMessage.Buffer);
                        question = message.Questions[0];
                    }
                    catch (Exception)
                    {
                        throw new ParsingException();
                    }

                    // Check for authorized subnet access
                    var allowedClient = _options.AllowedClientIPs;
                    var clientIP      = udpMessage.RemoteEndPoint.Address;
                    if ((allowedClient != null) && (allowedClient.Count > 0))
                    {
                        if (allowedClient.All(ipNetwork => !IPNetwork.Contains(ipNetwork, clientIP)))
                        {
                            logger.Warn($"{clientIP} is not authorized.");

                            throw new AuthorizationException();
                        }
                    }
                    logger.Info($"{clientIP} requested {question.Name} (#{message.TransactionID}, {question.RecordType}).");

                    // Query cache
                    if (_options.CacheResponse)
                    {
                        if (Cache.ContainsKey(question.Name) && Cache[question.Name].ContainsKey(question.RecordType))
                        {
                            var entry = Cache[question.Name][question.RecordType];
                            if (!entry.IsExpired)
                            {
                                var cachedMessage = entry.Message;
                                logger.Info($"-> #{message.TransactionID} served from cache.");
                                cachedMessage.TransactionID = message.TransactionID; // Update transaction ID
                                cachedMessage.TSigOptions   = message.TSigOptions;   // Update TSig _options
                                message            = cachedMessage;
                                respondedFromCache = true;
                            }
                        }
                    }

                    var targetNameServer       = _options.LocalNameServer;
                    var useHttpQuery           = _options.UseHttpQuery;
                    var queryTimeout           = _options.QueryTimeout;
                    var useCompressionMutation = _options.CompressionMutation;

                    // Match rules
                    if (message.IsQuery &&
                        (question.RecordType == RecordType.A || question.RecordType == RecordType.Aaaa))
                    {
                        for (var i = Rules.Count - 1; i >= 0; i--)
                        {
                            var match = Regex.Match(question.Name, Rules[i].Pattern);
                            if (!match.Success)
                            {
                                continue;
                            }

                            // Domain name matched

                            var recordType = question.RecordType;
                            if (Rules[i].ForceAAAA != null && Rules[i].ForceAAAA.Value) // RecordType override
                            {
                                recordType = RecordType.Aaaa;
                            }

                            if (Rules[i].NameServer != null) // Name server override
                            {
                                targetNameServer = Rules[i].NameServer;
                            }

                            if (Rules[i].UseHttpQuery != null) // HTTP query override
                            {
                                useHttpQuery = Rules[i].UseHttpQuery.Value;
                            }

                            if (Rules[i].QueryTimeout != null) // Query timeout override
                            {
                                queryTimeout = Rules[i].QueryTimeout.Value;
                            }

                            if (Rules[i].CompressionMutation != null) // Compression pointer mutation override
                            {
                                useCompressionMutation = Rules[i].CompressionMutation.Value;
                            }

                            if (Rules[i].Address != null)
                            {
                                IPAddress ip;
                                IPAddress.TryParse(Rules[i].Address, out ip);
                                if (ip == null) // Invalid IP, may be a domain name
                                {
                                    var address = string.Format(Rules[i].Address, match.Groups.Cast <object>().ToArray());
                                    if (recordType == RecordType.A && useHttpQuery)
                                    {
                                        await ResolveWithHttp(targetNameServer, address, queryTimeout, message);
                                    }
                                    else
                                    {
                                        var serverEndpoint = Utils.CreateIpEndPoint(targetNameServer, 53);
                                        var dnsClient      = new DnsClient(serverEndpoint.Address, queryTimeout,
                                                                           serverEndpoint.Port);
                                        var response =
                                            await
                                            Task <DnsMessage> .Factory.FromAsync(dnsClient.BeginResolve,
                                                                                 dnsClient.EndResolve,
                                                                                 address, recordType, question.RecordClass, null);
                                        if (response == null)
                                        {
                                            logger.Warn($"Remote resolve failed for {address}.");
                                            return;
                                        }
                                        foreach (var answerRecord in response.AnswerRecords)
                                        {
                                            answerRecord.Name = question.Name;
                                            message.AnswerRecords.Add(answerRecord);
                                        }
                                        message.ReturnCode = response.ReturnCode;
                                        message.IsQuery    = false;
                                    }
                                }
                                else
                                {
                                    if (recordType == RecordType.A &&
                                        ip.AddressFamily == AddressFamily.InterNetwork)
                                    {
                                        message.AnswerRecords.Add(new ARecord(question.Name, 600, ip));
                                    }
                                    else if (recordType == RecordType.Aaaa &&
                                             ip.AddressFamily == AddressFamily.InterNetworkV6)
                                    {
                                        message.AnswerRecords.Add(new AaaaRecord(question.Name, 600, ip));
                                    }
                                    else // Type mismatch
                                    {
                                        continue;
                                    }

                                    message.ReturnCode = ReturnCode.NoError;
                                    message.IsQuery    = false;
                                }
                            }

                            break;
                        }
                    }

                    // TODO: Consider how to integrate System.Net.Dns with this project.
                    // Using System.Net.Dns to forward query if compression mutation is disabled
                    //if (message.IsQuery && !useCompressionMutation &&
                    //    (question.RecordType == RecordType.A || question.RecordType == RecordType.Aaaa))
                    //{
                    //    var dnsResponse = await Dns.GetHostAddressesAsync(question.Name);

                    //    if (question.RecordType == RecordType.A)
                    //    {
                    //        message.AnswerRecords.AddRange(dnsResponse.Where(
                    //            ip => ip.AddressFamily == AddressFamily.InterNetwork).Select(
                    //                ip => new ARecord(question.Name, 0, ip)));
                    //    else if (question.RecordType == RecordType.Aaaa)
                    //    {
                    //        message.AnswerRecords.AddRange(dnsResponse.Where(
                    //            ip => ip.AddressFamily == AddressFamily.InterNetworkV6).Select(
                    //                ip => new AaaaRecord(question.Name, 0, ip)));
                    //    }
                    //    message.ReturnCode = ReturnCode.NoError;
                    //    message.IsQuery = false;
                    //}

                    if (message.IsQuery && question.RecordType == RecordType.A && useHttpQuery)
                    {
                        await ResolveWithHttp(targetNameServer, question.Name, queryTimeout, message);
                    }

                    if (message.IsQuery)
                    {
                        // Use internal forwarder to forward query to another name server
                        await ForwardMessage(message, udpMessage, Utils.CreateIpEndPoint(targetNameServer, 53),
                                             queryTimeout, useCompressionMutation);
                    }
                    else
                    {
                        // Already answered, directly return to the client
                        byte[] responseBuffer;
                        message.Encode(false, out responseBuffer);
                        if (responseBuffer != null)
                        {
                            await
                            _udpListener.SendAsync(responseBuffer, responseBuffer.Length, udpMessage.RemoteEndPoint);

                            // Update cache
                            if (_options.CacheResponse && !respondedFromCache)
                            {
                                Cache.Update(question, message, _options.CacheAge);
                            }
                        }
                    }
                }
                catch (ParsingException)
                {
                }
                catch (AuthorizationException)
                {
                    message.ReturnCode = ReturnCode.Refused;
                    message.IsQuery    = false;
                    // Already answered, directly return to the client
                    byte[] responseBuffer;
                    message.Encode(false, out responseBuffer);
                    if (responseBuffer != null)
                    {
                        await
                        _udpListener.SendAsync(responseBuffer, responseBuffer.Length, udpMessage.RemoteEndPoint);
                    }
                }
                catch (SocketException e)
                {
                    logger.Error("[Listener.Send] Unexpected socket error:\n{0}", e);
                }
                catch (Exception e)
                {
                    logger.Error("[Processor] Unexpected exception:\n{0}", e);
                }
            });
        }
Пример #20
0
 public void AddPacketHandler(IPNetwork network, String sharedSecret, IPacketHandler packetHandler)
 {
     _packetHandlerRepository.Add(network, packetHandler, sharedSecret);
 }
Пример #21
0
        /// <summary>
        ///     设置绕行规则
        /// </summary>
        /// <returns>是否设置成功</returns>
        private bool SetupRouteTable()
        {
            Logging.Info("收集路由表规则");
            Global.MainForm.StatusText(i18N.Translate("SetupBypass"));

            Logging.Info("绕行 → 全局绕过 IP");
            _directIPs.AddRange(Global.Settings.BypassIPs.Select(IPNetwork.Parse));

            Logging.Info("绕行 → 服务器 IP");
            _directIPs.AddRange(_serverAddresses.Where(address => !IPAddress.IsLoopback(address)).Select(address => IPNetwork.Parse(address.ToString(), 32)));

            if (_savedMode.BypassChina)
            {
                Logging.Info("绕行 → 中国 IP");
                _directIPs.AddRange(Encoding.UTF8.GetString(Resources.CNIP).Split('\n').Select(IPNetwork.Parse));
            }

            Logging.Info("绕行 → 局域网 IP");
            _directIPs.AddRange(_bypassLanIPs.Select(IPNetwork.Parse));

            switch (_savedMode.Type)
            {
            case 1:
                // 代理规则
                Logging.Info("代理 → 规则 IP");
                _proxyIPs.AddRange(_savedMode.Rule.Select(IPNetwork.Parse));

                //处理 NAT 类型检测,由于协议的原因,无法仅通过域名确定需要代理的 IP,自己记录解析了返回的 IP,仅支持默认检测服务器
                if (Global.Settings.STUN_Server == "stun.stunprotocol.org")
                {
                    try
                    {
                        Logging.Info("代理 → STUN 服务器 IP");
                        _proxyIPs.AddRange(new[]
                        {
                            Dns.GetHostAddresses(Global.Settings.STUN_Server)[0],
                            Dns.GetHostAddresses("stunresponse.coldthunder11.com")[0]
                        }.Select(ip => IPNetwork.Parse(ip.ToString(), 32)));
                    }
                    catch
                    {
                        Logging.Info("NAT 类型测试域名解析失败,将不会被添加到代理列表");
                    }
                }

                if (Global.Settings.TUNTAP.ProxyDNS)
                {
                    Logging.Info("代理 → 自定义 DNS");
                    if (Global.Settings.TUNTAP.UseCustomDNS)
                    {
                        var dns = string.Empty;
                        foreach (var value in Global.Settings.TUNTAP.DNS)
                        {
                            dns += value;
                            dns += ',';
                        }

                        dns = dns.Trim();
                        dns = dns.Substring(0, dns.Length - 1);
                        RouteAction(Action.Create, dns, 32, RouteType.TUNTAP);
                    }
                    else
                    {
                        _proxyIPs.AddRange(new[] { "1.1.1.1", "8.8.8.8", "9.9.9.9", "185.222.222.222" }.Select(ip => IPNetwork.Parse(ip, 32)));
                    }
                }

                break;

            case 2:
                // 绕过规则

                // 将 TUN/TAP 网卡权重放到最高
                Process.Start(new ProcessStartInfo
                {
                    FileName        = "netsh",
                    Arguments       = $"interface ip set interface {Global.TUNTAP.Index} metric=0",
                    WindowStyle     = ProcessWindowStyle.Hidden,
                    UseShellExecute = true,
                    CreateNoWindow  = true
                }
                              );

                Logging.Info("绕行 → 规则 IP");
                _directIPs.AddRange(_savedMode.Rule.Select(IPNetwork.Parse));

                Logging.Info("代理 → 全局");
                if (!RouteAction(Action.Create, IPNetwork.Parse("0.0.0.0", 0), RouteType.TUNTAP))
                {
                    State = State.Stopped;
                    return(false);
                }

                break;
            }

            Logging.Info("设置路由规则");
            RouteAction(Action.Create, _directIPs, RouteType.Gateway);
            RouteAction(Action.Create, _proxyIPs, RouteType.TUNTAP);

            return(true);
        }
 public void AddIngress(IPNetwork network, Protocol protocol, Ports port)
 {
     AddIngress(network, protocol, port, port);
 }
Пример #23
0
        private static async Task ProcessFirewallLogEntry(AzureIpRange ipAddresses, LogParser _logParser, int _hitCounter, FirewallLogEntry firewallLogEntry)
        {
            Regex           extractIpAddress   = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b");
            MatchCollection ipAddressFromRegex = extractIpAddress.Matches(firewallLogEntry.DestinationIP);

            if (ipAddressFromRegex.Count == 0)
            {
                Console.WriteLine($"Error: unable to parse log entry: '{firewallLogEntry.DestinationIP}'");
                return;
            }

            var cleanIpAddress = ipAddressFromRegex[0].Value;
            var hitsPerIp      = new Dictionary <string, AzureServiceTag>();

            bool isAzureIp = false;

            await Task.Run(() =>
            {
                IPAddress ipAdress;
                if (IPAddress.TryParse(cleanIpAddress, out ipAdress))
                {
                    foreach (var serviceType in ipAddresses.values)
                    {
                        foreach (var subnet in serviceType.properties.addressPrefixes)
                        {
                            var subnetInfo = IPNetwork.Parse(subnet);

                            if (subnetInfo.Contains(ipAdress))
                            {
                                isAzureIp = true;

                                hitsPerIp = _logParser.ReportMatchForAzureIp(
                                    cleanIpAddress,
                                    subnet,
                                    serviceType,
                                    firewallLogEntry,
                                    subnetInfo,
                                    hitsPerIp);
                            }
                        }
                    }
                }

                if (isAzureIp)
                {
                    _logParser.ConsolidateResultsForAzureIP(hitsPerIp);
                }

                if (!isAzureIp)
                {
                    _logParser.ReportNonAzureIP(
                        cleanIpAddress,
                        firewallLogEntry);
                }

                if (_options.Verbose && _logParser.TotalHitCount != _hitCounter)
                {
                    throw new Exception($"Inconsistency in stats generation while processing: {JsonConvert.SerializeObject(firewallLogEntry)}");
                }
            }).ConfigureAwait(false);
        }
 public void AddIngress(IPNetwork network, Protocol protocol, Ports beginPort, Ports endPort)
 {
     AddIngress(network.ToString(), protocol, beginPort, endPort);
 }
Пример #25
0
 protected override void BecauseOf()
 {
     m_result = new IPNetwork(0x11223344, 32);
 }
Пример #26
0
        private static bool TryParseIPNetwork(string ip, CidrParseEnum cidrParseEnum, byte cidr, out IPNetwork ipn)
        {
            IPNetwork ipnetwork = null;

            if (cidrParseEnum == CidrParseEnum.Default)
            {
                if (!IPNetwork.TryParse(ip, out ipnetwork))
                {
                    ipn = null;
                    return(false);
                }
            }
            else if (cidrParseEnum == CidrParseEnum.Value)
            {
                if (!IPNetwork.TryParse(ip, cidr, out ipnetwork))
                {
                    if (!IPNetwork.TryParse(ip, out ipnetwork))
                    {
                        ipn = null;
                        return(false);
                    }
                }
            }
            ipn = ipnetwork;
            return(true);
        }
Пример #27
0
        private static void PrintNetwork(ProgramContext ac, IPNetwork ipn) {

            StringWriter sw = new StringWriter();
            if (ac.IPNetwork)   sw.WriteLine("IPNetwork   : {0}", ipn.ToString());
            if (ac.Network)     sw.WriteLine("Network     : {0}", ipn.Network.ToString());
            if (ac.Netmask)     sw.WriteLine("Netmask     : {0}", ipn.Netmask.ToString());
            if (ac.Cidr)        sw.WriteLine("Cidr        : {0}", ipn.Cidr);
            if (ac.Broadcast)   sw.WriteLine("Broadcast   : {0}", ipn.Broadcast.ToString());
            if (ac.FirstUsable) sw.WriteLine("FirstUsable : {0}", ipn.FirstUsable.ToString());
            if (ac.LastUsable)  sw.WriteLine("LastUsable  : {0}", ipn.LastUsable.ToString());
            if (ac.Usable)      sw.WriteLine("Usable      : {0}", ipn.Usable);
            if (ac.Total)       sw.WriteLine("Total       : {0}", ipn.Total);
            Console.Write(sw.ToString());
        }
Пример #28
0
        public void ConfigureServices(IServiceCollection services)
        {
            var redisConnectionString = configuration.GetValue <string>("REDIS_CONNECTIONSTRING", null);
            var dataProtectionPath    = configuration.GetValue <string>("KEY_RING_PATH", null);

            if (!string.IsNullOrEmpty(redisConnectionString))
            {
                services.AddStackExchangeRedisCache(options =>
                {
                    options.Configuration = redisConnectionString;
                    options.InstanceName  = Assembly.GetExecutingAssembly().GetName().Name;
                });
                services.AddDataProtection()
                .SetApplicationName(Assembly.GetExecutingAssembly().GetName().Name)
                .PersistKeysToStackExchangeRedis(ConnectionMultiplexer.Connect(redisConnectionString), "data-protection-keys");
            }
            else
            {
                services.AddDistributedMemoryCache();
                var dpBuilder = services.AddDataProtection()
                                .SetApplicationName(Assembly.GetExecutingAssembly().GetName().Name);

                if (!string.IsNullOrEmpty(dataProtectionPath))
                {
                    dpBuilder.PersistKeysToFileSystem(new DirectoryInfo(dataProtectionPath));
                }
            }

            //Add configuration options
            services.Configure <JwtTokenOptions>(opts => configuration.Bind("auth:jwt", opts));
            services.Configure <JsonOptions>(opts =>
            {
                opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
            });
            services.Configure <ForwardedHeadersOptions>(options =>
            {
                options.ForwardLimit = 2;
                var configvalue      = configuration.GetValue("app:knownNetwork", string.Empty)?.Split('/');
                if (configvalue.Length == 2)
                {
                    var knownNetwork = new IPNetwork(IPAddress.Parse(configvalue[0]), int.Parse(configvalue[1]));
                    options.KnownNetworks.Add(knownNetwork);
                }
            });

            //Add services
            AddOpenApi(services);
            services.AddCors(opts => opts.AddDefaultPolicy(policy =>
            {
                // try to get array of origins from section array
                var corsOrigins = configuration.GetSection("app:cors:origins").GetChildren().Select(c => c.Value).ToArray();
                // try to get array of origins from value
                if (!corsOrigins.Any())
                {
                    corsOrigins = configuration.GetValue("app:cors:origins", string.Empty).Split(',');
                }
                corsOrigins = corsOrigins.Where(o => !string.IsNullOrWhiteSpace(o)).ToArray();
                if (corsOrigins.Any())
                {
                    policy.SetIsOriginAllowedToAllowWildcardSubdomains().WithOrigins(corsOrigins);
                }
            }));
            services.AddHealthChecks()
            .AddCheck("Registrants API ready hc", () => HealthCheckResult.Healthy("API ready"), new[] { HealthCheckReadyTag })
            .AddCheck("Registrants API live hc", () => HealthCheckResult.Healthy("API alive"), new[] { HealthCheckAliveTag });

            services.AddControllers(options =>
            {
                options.Filters.Add(new HttpResponseExceptionFilter());
            }).AddNewtonsoftJson(opts => opts.SerializerSettings.Converters.Add(new StringEnumConverter()));
            services.AddResponseCompression();
            services.AddPortalAuthentication(configuration);
            services.AddAutoMapper((sp, cfg) => { cfg.ConstructServicesUsing(t => sp.GetRequiredService(t)); }, typeof(Startup));
            services.AddSecurityModule();

            services.Configure <MessagingOptions>(configuration.GetSection("backend"));
            services.AddMessaging();
            services.AddTransient <IEvacuationSearchService, EvacuationSearchService>();
        }
Пример #29
0
 protected override void BecauseOf()
 {
     m_result = new IPNetwork(0x11223344, 32);
 }
Пример #30
0
        public static NetInterface[] Get()
        {
            if (!Directory.Exists(netFolder))
            {
                return(new NetInterface[0]);
            }
            var result = Directory.EnumerateDirectories(netFolder, "*", SearchOption.TopDirectoryOnly)
                         .Select(_ => Path.GetFileName(_))
                         .ToArray();

            if (result.Length <= 0)
            {
                return(new NetInterface[0]);
            }
            string[] bondNames = new string[0];
            if (File.Exists(bondingMastersFile))
            {
                bondNames = File.ReadAllText(CommonString.Append(netFolder, "/", bondingMastersFile)).Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            }
            var interfaces = new NetInterface[result.Length];

            for (var i = 0; i < result.Length; i++)
            {
                var interfaceName   = result[i];
                var interfaceFolder = GetSysClassNetpath(interfaceName);

                var interfaceDataFolders = Directory.EnumerateDirectories(interfaceFolder, "*", SearchOption.TopDirectoryOnly).Select(_ => Path.GetFileName(_)).ToArray();
                var interfaceDataFiles   = Directory.EnumerateFiles(interfaceFolder, "*", SearchOption.TopDirectoryOnly).Select(_ => Path.GetFileNameWithoutExtension(_)).ToArray();

                interfaces[i] = new NetInterface();

                if (File.Exists(operstateFile))
                {
                    var operstate = File.ReadAllText(operstateFile);
                    interfaces[i].Active = operstate == "up" ? true : false;
                }

                interfaces[i].Id = interfaceName;

                models.NetworkAdapterType type;
                bool     isInterfaceAggregator;
                string[] lowerInterfaces;
                if (bondNames.Contains(interfaceName))
                {
                    type = models.NetworkAdapterType.Bond;
                    isInterfaceAggregator = true;
                    lowerInterfaces       = GetLowerInterfaces(interfaceDataFiles);
                }
                else if (interfaceDataFolders.Contains(bridgeFolder))
                {
                    type = models.NetworkAdapterType.Bridge;
                    isInterfaceAggregator = true;
                    lowerInterfaces       = GetLowerInterfaces(interfaceDataFiles);
                }
                else if (interfaceDataFolders.Contains(deviceLink) || interfaceDataFiles.Contains(deviceLink))
                {
                    type = models.NetworkAdapterType.Physical;
                    isInterfaceAggregator = false;
                    lowerInterfaces       = new string[0];
                }
                else
                {
                    type = models.NetworkAdapterType.Virtual;
                    isInterfaceAggregator = false;
                    lowerInterfaces       = new string[0];
                }
                interfaces[i].Type = type;
                interfaces[i].InterfaceAggregator = isInterfaceAggregator;
                interfaces[i].LowerInterfaces     = lowerInterfaces;

                var interfaceIpAddr = CommonProcess.Execute(ipFileLocation, CommonString.Append("addr show ", interfaceName)).ToArray();

                interfaces[i].HardwareConfiguration = new NetworkAdapterInfo.HardwareConfiguration()
                {
                    MacAddress = Ip.GetNetworkAdapterMacAddresss(interfaceName),
                    Mtu        = Ip.GetNetworkAdapterMTU(interfaceName),
                    Txqueuelen = Ip.GetNetworkAdapterTxqueuelen(interfaceName),
                    Promisc    = interfaceIpAddr[0].Contains(promistStatus) ? true : false
                };

                var addrData = interfaceIpAddr.Where(_ => _.Contains(inet) && !_.Contains(inet6)).ToArray();
                if (!addrData.Any())
                {
                    continue;
                }
                var primaryAddressData = GetIpAddressAndNetworkRange(addrData[0]);

                interfaces[i].PrimaryAddressConfiguration = new NetworkAdapterInfo.AddressConfiguration()
                {
                    IpAddr       = primaryAddressData.Item1,
                    NetworkRange = primaryAddressData.Item2
                };

                IPNetwork ipnetwork = IPNetwork.Parse(GetNetworkRange(addrData[0]));
                interfaces[i].NetworkClass = ipnetwork.Network.ToString();

                var secondaryAddressConfiguration = new NetworkAdapterInfo.AddressConfiguration[addrData.Length - 1];
                for (var s = 1; s < addrData.Length; s++)
                {
                    var currentData = GetIpAddressAndNetworkRange(addrData[s]);
                    secondaryAddressConfiguration[s - 1] = new NetworkAdapterInfo.AddressConfiguration()
                    {
                        IpAddr       = currentData.Item1,
                        NetworkRange = currentData.Item2
                    };
                }
            }
            return(interfaces);
        }
Пример #31
0
 protected override void BecauseOf()
 {
     m_result = new IPNetwork(new IPAddress(0x11223300), 24);
 }
        public void Test_ipv6_DefaultNetmask()
        {
            var ipnetwork = IPNetwork.Parse("::1");

            Assert.AreEqual(64, ipnetwork.Cidr, "Cidr");
        }