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) { var hostMap = HostMap.Instance(); 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, host.IndexOf('.') >= 0 ? _config.dnsServer : null); if (ipAddress != null) { DnsUtil.DnsBuffer.Set(host, new IPAddress(ipAddress.GetAddressBytes())); if (host.IndexOf('.') >= 0) { if (IPSubnet.IsLan(ipAddress)) // assume that it is polution 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) { var hostMap = HostMap.Instance(); 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 Connect() { try { IPAddress ipAddress = null; var _targetPort = 0; { if (_firstPacket[0] == 1) { var addr = new byte[4]; Array.Copy(_firstPacket, 1, addr, 0, addr.Length); ipAddress = new IPAddress(addr); _targetPort = (_firstPacket[5] << 8) | _firstPacket[6]; _remote_host = ipAddress.ToString(); Logging.Info((_local_proxy ? "Local proxy" : "Direct") + " connect " + _remote_host + ":" + _targetPort); } else if (_firstPacket[0] == 4) { var addr = new byte[16]; Array.Copy(_firstPacket, 1, addr, 0, addr.Length); ipAddress = new IPAddress(addr); _targetPort = (_firstPacket[17] << 8) | _firstPacket[18]; _remote_host = ipAddress.ToString(); Logging.Info((_local_proxy ? "Local proxy" : "Direct") + " connect " + _remote_host + ":" + _targetPort); } else if (_firstPacket[0] == 3) { int len = _firstPacket[1]; var addr = new byte[len]; Array.Copy(_firstPacket, 2, addr, 0, addr.Length); _remote_host = Encoding.UTF8.GetString(_firstPacket, 2, len); _targetPort = (_firstPacket[len + 2] << 8) | _firstPacket[len + 3]; Logging.Info((_local_proxy ? "Local proxy" : "Direct") + " connect " + _remote_host + ":" + _targetPort); //if (!_local_proxy) { if (!IPAddress.TryParse(_remote_host, out ipAddress)) { if (_config.proxyRuleMode == ProxyRuleMode.UserCustom) { var hostMap = HostMap.Instance(); if (hostMap.GetHost(_remote_host, out var host_addr)) { if (!string.IsNullOrEmpty(host_addr)) { var lower_host_addr = host_addr.ToLower(); if (lower_host_addr.StartsWith("reject")) { Close(); return; } if (lower_host_addr.IndexOf('.') >= 0 || lower_host_addr.IndexOf(':') >= 0) { if (!IPAddress.TryParse(lower_host_addr, out ipAddress)) { // } } } } } if (ipAddress == null) { ipAddress = DnsUtil.LocalDnsBuffer.Get(_remote_host); } } if (ipAddress == null) { ipAddress = DnsUtil.QueryDns(_remote_host, _remote_host.IndexOf('.') >= 0 ? _config.localDnsServer : null); } if (ipAddress != null) { DnsUtil.LocalDnsBuffer.Set(_remote_host, new IPAddress(ipAddress.GetAddressBytes())); DnsUtil.LocalDnsBuffer.Sweep(); } else { if (!_local_proxy) { throw new SocketException((int)SocketError.HostNotFound); } } } } _remote_port = _targetPort; } if (ipAddress != null && _config.proxyRuleMode == ProxyRuleMode.UserCustom) { var hostMap = HostMap.Instance(); if (hostMap.GetIP(ipAddress, out var host_addr)) { var lower_host_addr = host_addr.ToLower(); if (lower_host_addr.StartsWith("reject") ) { Close(); return; } } } if (_local_proxy) { IPAddress.TryParse(_config.proxyHost, out ipAddress); _targetPort = _config.proxyPort; } // ProxyAuth recv only socks5 head, so don't need to save anything else var remoteEP = new IPEndPoint(ipAddress ?? throw new InvalidOperationException(), _targetPort); _remote = new ProxySocketTun(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _remote.GetSocket().NoDelay = true; // Connect to the remote endpoint. _remote.BeginConnect(remoteEP, ConnectCallback, null); } catch (Exception e) { Logging.LogUsefulException(e); Close(); } }