예제 #1
0
 protected override void ProcessRecord()
 {
     if (!string.IsNullOrEmpty(SubnetMask))
     {
         WriteObject(new RouteConfig()
         {
             NetworkAddress = new AddressConfig(NetworkAddress, SubnetMask),
             DefaultGateway = DefaultGateway,
         }, true);
     }
     else if (string.IsNullOrEmpty(SubnetMask) && PrefixLength != null)
     {
         WriteObject(new RouteConfig()
         {
             NetworkAddress = new AddressConfig(NetworkAddress, (int)PrefixLength),
             DefaultGateway = DefaultGateway,
         }, true);
     }
     else if (NetworkAddress.Contains("/"))
     {
         WriteObject(new RouteConfig()
         {
             NetworkAddress = new AddressConfig(NetworkAddress),
             DefaultGateway = DefaultGateway,
         }, true);
     }
 }
        public bool IsMatching(EndPoint ep)
        {
            switch (_type)
            {
            case NetProxyBypassItemType.IpAddress:
                if (ep is IPEndPoint ipep1)
                {
                    return(_ipAddress.Equals(ipep1.Address));
                }

                return(false);

            case NetProxyBypassItemType.NetworkAddress:
                if (ep is IPEndPoint ipep2)
                {
                    return(_networkAddress.Contains(ipep2.Address));
                }

                return(false);

            case NetProxyBypassItemType.DomainName:
                if (ep is DomainEndPoint dep)
                {
                    string matchDomainName = dep.Address;

                    if (_domainName.Length == matchDomainName.Length)
                    {
                        return(_domainName.Equals(matchDomainName, StringComparison.OrdinalIgnoreCase));
                    }
                    else
                    {
                        return(matchDomainName.EndsWith("." + _domainName, StringComparison.OrdinalIgnoreCase));
                    }
                }

                return(false);

            default:
                throw new NotSupportedException("NetProxyBypassItemType not supported.");
            }
        }
예제 #3
0
        public Task <DnsDatagram> ProcessRequestAsync(DnsDatagram request, IPEndPoint remoteEP, DnsTransportProtocol protocol, bool isRecursionAllowed, string zoneName, uint appRecordTtl, string appRecordData)
        {
            dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData);
            dynamic jsonCname         = null;

            foreach (dynamic jsonProperty in jsonAppRecordData)
            {
                string name = jsonProperty.Name;

                if ((name == "public") || (name == "private"))
                {
                    continue;
                }

                NetworkAddress networkAddress = NetworkAddress.Parse(name);
                if (networkAddress.Contains(remoteEP.Address))
                {
                    jsonCname = jsonProperty.Value;
                    break;
                }
            }

            if (jsonCname is null)
            {
                if (NetUtilities.IsPrivateIP(remoteEP.Address))
                {
                    jsonCname = jsonAppRecordData.@private;
                }
                else
                {
                    jsonCname = jsonAppRecordData.@public;
                }

                if (jsonCname is null)
                {
                    return(Task.FromResult <DnsDatagram>(null));
                }
            }

            string cname = jsonCname.Value;

            if (string.IsNullOrEmpty(cname))
            {
                return(Task.FromResult <DnsDatagram>(null));
            }

            DnsQuestionRecord question = request.Question[0];
            IReadOnlyList <DnsResourceRecord> answers;

            if (question.Name.Equals(zoneName, StringComparison.OrdinalIgnoreCase)) //check for zone apex
            {
                answers = new DnsResourceRecord[] { new DnsResourceRecord(question.Name, DnsResourceRecordType.ANAME, DnsClass.IN, appRecordTtl, new DnsANAMERecordData(cname)) }
            }
            ;                                                                                                                                                                      //use ANAME
            else
            {
                answers = new DnsResourceRecord[] { new DnsResourceRecord(question.Name, DnsResourceRecordType.CNAME, DnsClass.IN, appRecordTtl, new DnsCNAMERecordData(cname)) }
            };

            return(Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers)));
        }
예제 #4
0
        public Task <DnsDatagram> ProcessRequestAsync(DnsDatagram request, IPEndPoint remoteEP, DnsTransportProtocol protocol, bool isRecursionAllowed, string zoneName, uint appRecordTtl, string appRecordData)
        {
            DnsQuestionRecord question = request.Question[0];

            switch (question.Type)
            {
            case DnsResourceRecordType.A:
            case DnsResourceRecordType.AAAA:
                dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData);
                dynamic jsonAddresses     = null;

                foreach (dynamic jsonProperty in jsonAppRecordData)
                {
                    string name = jsonProperty.Name;

                    if ((name == "public") || (name == "private"))
                    {
                        continue;
                    }

                    NetworkAddress networkAddress = NetworkAddress.Parse(name);
                    if (networkAddress.Contains(remoteEP.Address))
                    {
                        jsonAddresses = jsonProperty.Value;
                        break;
                    }
                }

                if (jsonAddresses is null)
                {
                    if (NetUtilities.IsPrivateIP(remoteEP.Address))
                    {
                        jsonAddresses = jsonAppRecordData.@private;
                    }
                    else
                    {
                        jsonAddresses = jsonAppRecordData.@public;
                    }

                    if (jsonAddresses is null)
                    {
                        return(Task.FromResult <DnsDatagram>(null));
                    }
                }

                List <DnsResourceRecord> answers = new List <DnsResourceRecord>();

                switch (question.Type)
                {
                case DnsResourceRecordType.A:
                    foreach (dynamic jsonAddress in jsonAddresses)
                    {
                        IPAddress address = IPAddress.Parse(jsonAddress.Value);

                        if (address.AddressFamily == AddressFamily.InterNetwork)
                        {
                            answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecordData(address)));
                        }
                    }
                    break;

                case DnsResourceRecordType.AAAA:
                    foreach (dynamic jsonAddress in jsonAddresses)
                    {
                        IPAddress address = IPAddress.Parse(jsonAddress.Value);

                        if (address.AddressFamily == AddressFamily.InterNetworkV6)
                        {
                            answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecordData(address)));
                        }
                    }
                    break;
                }

                if (answers.Count == 0)
                {
                    return(Task.FromResult <DnsDatagram>(null));
                }

                if (answers.Count > 1)
                {
                    answers.Shuffle();
                }

                return(Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers)));

            default:
                return(Task.FromResult <DnsDatagram>(null));
            }
        }