private int IsHandle(byte[] firstPacket, int length) { if (length >= 7 && _config.ProxyRuleMode != ProxyRuleMode.Disable) { IPAddress ipAddress = null; if (firstPacket[0] == 1) { var addr = new byte[4]; Array.Copy(firstPacket, 1, addr, 0, addr.Length); ipAddress = new IPAddress(addr); } else if (firstPacket[0] == 3) { int len = firstPacket[1]; var addr = new byte[len]; if (length >= len + 2) { Array.Copy(firstPacket, 2, addr, 0, addr.Length); var host = Encoding.UTF8.GetString(firstPacket, 2, len); if (IPAddress.TryParse(host, out ipAddress)) { //pass } else { if ((_config.ProxyRuleMode == ProxyRuleMode.BypassLanAndChina || _config.ProxyRuleMode == ProxyRuleMode.BypassLanAndNotChina) && _IPRange != null || _config.ProxyRuleMode == ProxyRuleMode.UserCustom) { if (!IPAddress.TryParse(host, out ipAddress)) { if (_config.ProxyRuleMode == ProxyRuleMode.UserCustom) { if (HostMap.GetHost(host, out var host_addr)) { if (!string.IsNullOrEmpty(host_addr)) { var lower_host_addr = host_addr.ToLower(); if (lower_host_addr.StartsWith("reject") || lower_host_addr.StartsWith("direct") ) { return(CONNECT_DIRECT); } if (lower_host_addr.StartsWith("localproxy")) { return(CONNECT_LOCALPROXY); } if (lower_host_addr.StartsWith("remoteproxy")) { return(CONNECT_REMOTEPROXY); } if (lower_host_addr.IndexOf('.') >= 0 || lower_host_addr.IndexOf(':') >= 0) { if (!IPAddress.TryParse(lower_host_addr, out ipAddress)) { // } } } } } if (ipAddress == null) { ipAddress = DnsUtil.DnsBuffer.Get(host); } } if (ipAddress == null) { ipAddress = DnsUtil.QueryDns(host); if (ipAddress != null) { DnsUtil.DnsBuffer.Set(host, new IPAddress(ipAddress.GetAddressBytes())); if (host.IndexOf('.') >= 0 && IPSubnet.IsLan(ipAddress)) { // assume that it is pollution if return LAN address return(CONNECT_REMOTEPROXY); } } else { Logging.Log(LogLevel.Debug, "DNS query fail: " + host); } } } } } } else if (firstPacket[0] == 4) { var addr = new byte[16]; Array.Copy(firstPacket, 1, addr, 0, addr.Length); ipAddress = new IPAddress(addr); } if (ipAddress != null) { if (_config.ProxyRuleMode == ProxyRuleMode.UserCustom) { if (HostMap.GetIP(ipAddress, out var host_addr)) { var lower_host_addr = host_addr.ToLower(); if (lower_host_addr.StartsWith("reject") || lower_host_addr.StartsWith("direct") ) { return(CONNECT_DIRECT); } if (lower_host_addr.StartsWith("localproxy")) { return(CONNECT_LOCALPROXY); } if (lower_host_addr.StartsWith("remoteproxy")) { return(CONNECT_REMOTEPROXY); } } } else { if (IPSubnet.IsLan(ipAddress)) { return(CONNECT_DIRECT); } if ((_config.ProxyRuleMode == ProxyRuleMode.BypassLanAndChina || _config.ProxyRuleMode == ProxyRuleMode.BypassLanAndNotChina) && _IPRange != null && ipAddress.AddressFamily == AddressFamily.InterNetwork ) { if (_IPRange.IsInIPRange(ipAddress)) { return(CONNECT_LOCALPROXY); } DnsUtil.DnsBuffer.Sweep(); } } } } return(CONNECT_REMOTEPROXY); }
private void AcceptCallback(IAsyncResult ar) { if (_stop) { return; } var listener = (Socket)ar.AsyncState; try { var conn = listener.EndAccept(ar); var localPort = ((IPEndPoint)conn.LocalEndPoint).Port; if ((_authUser ?? string.Empty).Length == 0 && !IPSubnet.IsLan(conn) && !(_config.GetPortMapCache().ContainsKey(localPort) || _config.GetPortMapCache()[localPort].type == PortMapType.Forward)) { conn.Shutdown(SocketShutdown.Both); conn.Close(); } else { var buf = new byte[4096]; object[] state = { conn, buf }; if (!_config.GetPortMapCache().ContainsKey(localPort) || _config.GetPortMapCache()[localPort].type != PortMapType.Forward) { conn.BeginReceive(buf, 0, buf.Length, 0, ReceiveCallback, state); } else { if (_services.Any(service => service.Handle(buf, 0, conn))) { return; } // no service found for this // shouldn't happen conn.Shutdown(SocketShutdown.Both); conn.Close(); } } } catch (ObjectDisposedException) { } catch (Exception e) { Console.WriteLine(e); } finally { try { listener.BeginAccept(AcceptCallback, listener); } catch (ObjectDisposedException) { // do nothing } catch (Exception e) { Logging.LogUsefulException(e); } } }