private static bool ResolvByProxy(EagleTunnelArgs e)
        {
            bool result = false;

            if (CreateTunnel(out Tunnel tunnel))
            {
                string req = EagleTunnelHandler.EagleTunnelRequestType.DNS.ToString();
                req += " " + e.Domain;
                bool done = tunnel.WriteR(req);
                if (done)
                {
                    string reply = tunnel.ReadStringR();
                    if (!string.IsNullOrEmpty(reply) && reply != "nok")
                    {
                        if (IPAddress.TryParse(reply, out IPAddress ip))
                        {
                            e.IP   = ip;
                            result = true;
                        }
                    }
                }
                tunnel.Close();
            }
            return(result);
        }
Пример #2
0
        private static bool HandleTCPReq(ByteBuffer request, Tunnel tunnel)
        {
            bool result = false;

            if (request != null && tunnel != null)
            {
                IPAddress ip   = GetIP(request);
                int       port = GetPort(request);
                if (ip != null && port != 0)
                {
                    IPEndPoint      reqIPEP = new IPEndPoint(ip, port);
                    string          reply;
                    EagleTunnelArgs e = new EagleTunnelArgs();
                    e.EndPoint = reqIPEP;
                    e.tunnel   = tunnel;
                    if (EagleTunnelSender.Handle(
                            EagleTunnelHandler.EagleTunnelRequestType.TCP, e))
                    {
                        if (Conf.LocalUser != null)
                        {
                            Conf.LocalUser.AddTunnel(tunnel);
                        }
                        reply = "\u0005\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000";
                    }
                    else
                    {
                        reply = "\u0005\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000";
                    }
                    result = tunnel.WriteL(reply);
                }
            }
            return(result);
        }
Пример #3
0
 private static void DNSReqSender(Tunnel tunnel, EagleTunnelArgs e)
 {
     if (tunnel != null && e != null)
     {
         e.IP = null;
         if (e.Domain != null)
         {
             if (IPAddress.TryParse(e.Domain, out IPAddress ip0))
             {
                 ;
                 // e.Domain is IP but not domain
                 e.IP = ip0;
             }
             else
             {
                 string req = EagleTunnelHandler.EagleTunnelRequestType.DNS.ToString();
                 req += " " + e.Domain;
                 bool done = tunnel.WriteR(req);
                 if (done)
                 {
                     string reply = tunnel.ReadStringR();
                     if (!string.IsNullOrEmpty(reply) && reply != "nok")
                     {
                         if (IPAddress.TryParse(reply, out IPAddress ip1))
                         {
                             e.IP = ip1;
                         }
                     }
                 }
             }
         }
     }
 }
        private static void SendLOCATIONReq(EagleTunnelArgs e)
        {
            string ip2Resolv = e.IP.ToString();

            // local cache resolv firstly
            if (EagleTunnelHandler.insideCache.ContainsKey(ip2Resolv))
            {
                e.EnableProxy = !EagleTunnelHandler.insideCache[ip2Resolv];
                e.Success     = true;
            }
            else
            {
                // req remote
                if (CheckIfInsideByRemote(ip2Resolv, out bool inside))
                {
                    e.EnableProxy = !inside;
                    EagleTunnelHandler.insideCache.TryAdd(ip2Resolv, inside);
                    e.Success = true;
                }
                else
                {
                    EagleTunnelHandler.ips2Resolv.Enqueue(ip2Resolv);
                }
            }
        }
        public static bool Handle(EagleTunnelHandler.EagleTunnelRequestType type, EagleTunnelArgs e)
        {
            bool result = false;

            if (e != null)
            {
                switch (type)
                {
                case EagleTunnelHandler.EagleTunnelRequestType.DNS:
                    SendDNSReq(e);
                    break;

                case EagleTunnelHandler.EagleTunnelRequestType.TCP:
                    result = SendTCPReq(e);
                    break;

                case EagleTunnelHandler.EagleTunnelRequestType.LOCATION:
                    SendLOCATIONReq(e);
                    break;

                case EagleTunnelHandler.EagleTunnelRequestType.Unknown:
                default:
                    break;
                }
            }
            return(result);
        }
Пример #6
0
        public static IPAddress GetIP(ByteBuffer request)
        {
            IPAddress ip;
            int       destype = request[3];
            string    ip_str;

            switch (destype)
            {
            case 1:
                ip_str  = request[4].ToString();
                ip_str += '.' + request[5].ToString();
                ip_str += '.' + request[6].ToString();
                ip_str += '.' + request[7].ToString();
                if (IPAddress.TryParse(ip_str, out IPAddress ipa0))
                {
                    ip = ipa0;
                }
                else
                {
                    ip = null;
                }
                break;

            case 3:
                int    len       = request[4];
                char[] hostChars = new char[len];
                for (int i = 0; i < len; ++i)
                {
                    hostChars[i] = (char)request[5 + i];
                }
                string host = new string (hostChars);
                // if host is real ip but not domain name
                if (IPAddress.TryParse(host, out IPAddress ipa))
                {
                    ip = ipa;
                }
                else
                {
                    EagleTunnelArgs e = new EagleTunnelArgs();
                    e.Domain = host;
                    EagleTunnelSender.Handle(
                        EagleTunnelHandler.EagleTunnelRequestType.DNS, e);
                    ip = e.IP;
                }
                break;

            default:
                ip = null;
                break;
            }
            return(ip);
        }
        private static bool SendTCPReq(EagleTunnelArgs e)
        {
            bool result = false;

            if (e != null && e.EndPoint != null)
            {
                if (e.EnableProxy)
                {
                    result = ConnectByProxy(e);
                }
                else
                {
                    result = DirectConnect(e);
                }
            }
            return(result);
        }
        private static Tunnel HandleTCPReq(byte[] request, Socket socket2Client)
        {
            Tunnel result = null;

            if (request != null && socket2Client != null)
            {
                IPAddress ip   = GetIP(request);
                int       port = GetPort(request);
                if (ip != null && port != 0)
                {
                    IPEndPoint      reqIPEP = new IPEndPoint(ip, port);
                    string          reply;
                    EagleTunnelArgs e = new EagleTunnelArgs();
                    e.EndPoint = reqIPEP;
                    result     = EagleTunnelSender.Handle(
                        EagleTunnelHandler.EagleTunnelRequestType.TCP, e);
                    if (result != null)
                    {
                        reply = "\u0005\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000";
                    }
                    else
                    {
                        reply = "\u0005\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000";
                    }
                    byte[] buffer = Encoding.ASCII.GetBytes(reply);
                    int    written;
                    try {
                        written = socket2Client.Send(buffer);
                    } catch { written = 0; }
                    if (result != null)
                    {
                        if (written > 0)
                        {
                            result.SocketL = socket2Client;
                        }
                        else
                        {
                            result.Close();
                            result = null;
                        }
                    }
                }
            }
            return(result);
        }
        private static bool ResolvDomain(EagleTunnelArgs e)
        {
            bool result;

            if (e.EnableProxy)
            {
                result = ResolvByProxy(e);
            }
            else
            {
                result = ResolvByLocal(e);
                if (!result)
                {
                    result = ResolvByProxy(e);
                }
            }
            return(result);
        }
Пример #10
0
        public static Tunnel Handle(
            string firstMsg, System.Net.Sockets.Socket socket2Client)
        {
            Tunnel result = null;

            if (firstMsg != null && socket2Client != null)
            {
                if (HTTPReqArgs.TryParse(firstMsg, out HTTPReqArgs e0))
                {
                    IPEndPoint      reqEP = HTTPReqArgs.GetIPEndPoint(e0);
                    EagleTunnelArgs e1    = new EagleTunnelArgs();
                    e1.EndPoint = reqEP;
                    Tunnel tunnel = EagleTunnelSender.Handle(
                        EagleTunnelHandler.EagleTunnelRequestType.TCP, e1);
                    if (tunnel != null)
                    {
                        tunnel.SocketL = socket2Client;
                        bool done;
                        if (e0.HTTP_Request_Type == HTTPRequestType.CONNECT)
                        {
                            // HTTPS: reply web client;
                            string re443 = "HTTP/1.1 200 Connection Established\r\n\r\n";
                            done = tunnel.WriteL(re443);
                        }
                        else
                        {
                            // HTTP: relay new request to web server
                            string newReq = HTTPReqArgs.CreateNewRequest(firstMsg);
                            done = tunnel.WriteR(newReq);
                        }
                        if (done)
                        {
                            result = tunnel;
                        }
                        else
                        {
                            tunnel.Close();
                        }
                    }
                }
            }
            return(result);
        }
Пример #11
0
        private static bool CheckEnableProxy(IPAddress ip)
        {
            bool result = true;

            if (ip != null)
            {
                EagleTunnelArgs e = new EagleTunnelArgs();
                e.IP = ip;
                EagleTunnelSender.Handle(
                    EagleTunnelHandler.EagleTunnelRequestType.LOCATION,
                    e
                    );
                if (e.Success)
                {
                    result = e.EnableProxy;
                }
            }
            return(result);
        }
Пример #12
0
        public static Tunnel Handle(EagleTunnelHandler.EagleTunnelRequestType type, EagleTunnelArgs e)
        {
            Tunnel result = null;

            if (type != EagleTunnelHandler.EagleTunnelRequestType.Unknown &&
                e != null)
            {
                IPEndPoint ipeOfServer   = Conf.GetRemoteIPEndPoint();
                Socket     socket2Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try {
                    socket2Server.Connect(ipeOfServer);
                } catch { socket2Server = null; }
                Tunnel tunnel = CheckVersion(socket2Server);
                if (tunnel != null)
                {
                    bool done = CheckUser(tunnel);
                    if (done)
                    {
                        switch (type)
                        {
                        case EagleTunnelHandler.EagleTunnelRequestType.DNS:
                            DNSReqSender(tunnel, e);
                            done = false;     // no need to continue;
                            break;

                        case EagleTunnelHandler.EagleTunnelRequestType.TCP:
                            done = TCPReqSender(tunnel, e);
                            break;
                        }
                    }
                    if (done)
                    {
                        result = tunnel;
                    }
                    else
                    {
                        tunnel.Close();
                    }
                }
            }
            return(result);
        }
 private static void SendDNSReq(EagleTunnelArgs e)
 {
     if (e != null)
     {
         if (e.Domain != null)
         {
             if (Conf.hosts.ContainsKey(e.Domain))
             {
                 e.IP      = Conf.hosts[e.Domain];
                 e.Success = true;
             }
             else
             {
                 if (EagleTunnelHandler.dnsCaches.ContainsKey(e.Domain))
                 {
                     if (!EagleTunnelHandler.dnsCaches[e.Domain].IsDead)
                     {
                         e.IP      = EagleTunnelHandler.dnsCaches[e.Domain].IP;
                         e.Success = true;
                     }
                     else
                     {
                         if (ResolvDomain(e))
                         {
                             EagleTunnelHandler.dnsCaches[e.Domain].IP = e.IP;
                             e.Success = true;
                         }
                     }
                 }
                 else
                 {
                     if (ResolvDomain(e))
                     {
                         DnsCache cache = new DnsCache(e.Domain, e.IP, Conf.DnsCacheTtl);
                         EagleTunnelHandler.dnsCaches.TryAdd(e.Domain, cache);
                         e.Success = true;
                     }
                 }
             }
         }
     }
 }
Пример #14
0
        private static bool TCPReqSender(Tunnel tunnel, EagleTunnelArgs e)
        {
            bool result = false;

            if (tunnel != null && e != null)
            {
                if (e.EndPoint != null)
                {
                    string req = EagleTunnelHandler.EagleTunnelRequestType.TCP.ToString();
                    req += ' ' + e.EndPoint.Address.ToString();
                    req += ' ' + e.EndPoint.Port.ToString();
                    bool done = tunnel.WriteR(req);
                    if (done)
                    {
                        string reply = tunnel.ReadStringR();
                        result = reply == "ok";
                    }
                }
            }
            return(result);
        }
        // public static string CreateNewRequest (string oldRequest) {
        //     string newReq = "";
        //     string[] lines = oldRequest.Replace ("\r\n", "\n").Split ('\n');
        //     string[] args = lines[0].Split (' ');
        //     if (args.Length >= 2) {
        //         string des = args[1];
        //         Uri uri = new Uri (des);
        //         if (uri.HostNameType != UriHostNameType.Unknown) {
        //             string line = args[0];
        //             line += ' ' + uri.AbsolutePath;
        //             newReq = line;
        //             if (args.Length >= 3) {
        //                 newReq += ' ' + args[2];
        //                 for (int i = 1; i < lines.Length; ++i) {
        //                     line = lines[i];
        //                     newReq += "\r\n" + line;
        //                 }
        //             }
        //         }
        //     }
        //     return newReq;
        // }

        public static IPEndPoint GetIPEndPoint(HTTPReqArgs e0)
        {
            IPEndPoint result = null;

            if (e0 != null)
            {
                if (e0.Host != null & e0.Port != 0)
                {
                    // resolv ip of domain name by EagleTunnel Sender
                    EagleTunnelArgs e1 = new EagleTunnelArgs();
                    e1.Domain = e0.Host;
                    EagleTunnelSender.Handle(
                        EagleTunnelHandler.EagleTunnelRequestType.DNS, e1);
                    if (e1.IP != null)
                    {
                        // resolv successfully
                        result = new IPEndPoint(e1.IP, e0.Port);
                    }
                }
            }
            return(result);
        }
        private static bool ConnectByProxy(EagleTunnelArgs e)
        {
            bool succeed = false;

            if (e.tunnel != null)
            {
                Tunnel tunnel = e.tunnel;
                if (Connect2Relayer(tunnel))
                {
                    string req = EagleTunnelHandler.EagleTunnelRequestType.TCP.ToString();
                    req += ' ' + e.EndPoint.Address.ToString();
                    req += ' ' + e.EndPoint.Port.ToString();
                    bool done = tunnel.WriteR(req);
                    if (done)
                    {
                        string reply = tunnel.ReadStringR();
                        succeed = reply == "ok";
                    }
                }
            }
            return(succeed);
        }
        private static bool DirectConnect(EagleTunnelArgs e)
        {
            bool   result        = false;
            Socket socket2Server = new Socket(AddressFamily.InterNetwork,
                                              SocketType.Stream,
                                              ProtocolType.Tcp);

            try
            {
                socket2Server.Connect(e.EndPoint);
            }
            catch (SocketException)
            {
                socket2Server.Close();
            }
            if (socket2Server.Connected)
            {
                e.tunnel.SocketR = socket2Server;
                result           = true;
            }
            return(result);
        }
        public static bool Handle(string firstMsg, Tunnel tunnel)
        {
            bool result = false;

            if (firstMsg != null && tunnel != null)
            {
                if (HTTPReqArgs.TryParse(firstMsg, out HTTPReqArgs e0))
                {
                    IPEndPoint      reqEP = HTTPReqArgs.GetIPEndPoint(e0);
                    EagleTunnelArgs e1    = new EagleTunnelArgs();
                    e1.EndPoint = reqEP;
                    e1.tunnel   = tunnel;
                    if (EagleTunnelSender.Handle(
                            EagleTunnelHandler.EagleTunnelRequestType.TCP, e1))
                    {
                        if (Conf.LocalUser != null)
                        {
                            Conf.LocalUser.AddTunnel(tunnel);
                        }
                        if (e0.HTTP_Request_Type == HTTPRequestType.CONNECT)
                        {
                            // HTTPS: reply web client;
                            string re443 = "HTTP/1.1 200 Connection Established\r\n\r\n";
                            result = tunnel.WriteL(re443);
                        }
                        else
                        {
                            // HTTP: relay new request to web server
                            string newReq = HTTPReqArgs.CreateNewRequest(firstMsg);
                            result = tunnel.WriteR(newReq);
                        }
                    }
                }
            }
            return(result);
        }
        private static bool ResolvByLocal(EagleTunnelArgs e)
        {
            bool        result = false;
            IPHostEntry iphe;

            try
            {
                iphe = Dns.GetHostEntry(e.Domain);
            }
            catch { iphe = null; }
            if (iphe != null)
            {
                foreach (IPAddress tmp in iphe.AddressList)
                {
                    if (tmp.AddressFamily == AddressFamily.InterNetwork)
                    {
                        e.IP   = tmp;
                        result = true;
                        break;
                    }
                }
            }
            return(result);
        }