Esempio n. 1
0
        public static Socks5Response FromRequest(Socks5Request request, byte response, bool resolveRemote)
        {
            var resp = new Socks5Response
            {
                Version  = request.Version,
                Response = response,
                RSV      = request.RSV,
                Remote   = resolveRemote? request.Remote.Resolve() : request.Remote
            };

            return(resp);
        }
Esempio n. 2
0
        public static Socks5Response FromRequest(Socks5Request request, IPEndPoint bindedEndPoint)
        {
            var resp = new Socks5Response
            {
                Version  = request.Version,
                Response = SocksResponse.SUCCESS,
                RSV      = request.RSV,
                Remote   = new SocksRemote()
                {
                    AddressType = bindedEndPoint.AddressFamily == AddressFamily.InterNetworkV6 ? SocksAddressType.IPV6 : SocksAddressType.IPV4,
                    Address     = AddressUtils.GetVaildLocalIpAddress(bindedEndPoint),
                    Port        = (ushort)bindedEndPoint.Port,
                }
            };

            return(resp);
        }
Esempio n. 3
0
        private async Task <HostData> ProcessRequest()
        {
            _request = await ReadRequest();

            if (_request.Command == SocksCommand.CONNECT)
            {
                _target = new HostData()
                {
                    Address = _request.Remote.Address, Port = _request.Remote.Port
                };
                Logger.LogInformation($"Connecting to {_target}, {Id}");
                return(_target);
            }
            else if (_request.Command == SocksCommand.UDP)
            {
                Logger.LogInformation($"Configing udp relay, {Id}");
                _target = new HostData()
                {
                    Address = _request.Remote.Address,
                    Port    = _request.Remote.Port,
                    Type    = RemoteType.Udp
                };
                BindUdp(_target);
                return(_target);
            }

            var resp = Socks5Response.FromRequest(_request, SocksResponse.CANNOT_CONNECT, _supportPrivoxy);
            var data = resp.ToBytes();

            await WriteAsync(data);
            await FlushAsync();

            _pipe.Reader.Complete();

            throw new SocksException("Command not supported");
        }
Esempio n. 4
0
        public override async Task <bool> ProcessSharkData(BlockData block)
        {
            if (block.Type == BlockType.CONNECTED)
            {
                Socks5Response resp;
                if (_target.Type == RemoteType.Tcp)
                {
                    resp = Socks5Response.FromRequest(_request, SocksResponse.SUCCESS, _supportPrivoxy);
                    var data = resp.ToBytes();

                    await WriteAsync(data);
                    await FlushAsync();

                    Logger.LogInformation($"{_target} connected, {Id}");

#pragma warning disable CS4014
                    ProcessData();
#pragma warning restore CS4014
                }
                else if (_target.Type == RemoteType.Udp)
                {
                    resp = Socks5Response.FromRequest(_request, _udp.Client.LocalEndPoint as IPEndPoint);
                    var data = resp.ToBytes();
                    await WriteAsync(data);

                    StopTcp();
                    _pipe.Reader.Complete();
                    Logger.LogInformation($"Udp relay started, {Id}");
                }
            }
            else if (block.Type == BlockType.CONNECT_FAILED)
            {
                var resp = Socks5Response.FromRequest(_request, SocksResponse.CANNOT_CONNECT, _supportPrivoxy);
                var data = resp.ToBytes();
                await WriteAsync(data);
                await FlushAsync();

                _pipe.Reader.Complete();

                Logger.LogWarning($"Connect to {_target} failed, {Id}");

                return(false);
            }
            else if (block.Type == BlockType.DATA)
            {
                if (_target.IsUdp)
                {
                    block.Data.CopyTo(new Memory <byte>(_udpBuffer, 3, block.Data.Length));

                    _udpBuffer[0] = _udpBuffer[1] = _udpBuffer[2] = 0;
                    await _udp.SendAsync(_udpBuffer, block.Data.Length + 3, _lastEndpoint);
                }
                else
                {
                    await WriteAsync(block.Data);
                    await FlushAsync();
                }
            }

            return(!_socksFailed);
        }