public bool Authentication(FastTunnelServer server, LogInMassage requet) { if (string.IsNullOrEmpty(server.ServerSettings.Token)) { return(true); } return(server.ServerSettings.Token.Equals(requet.Token)); }
public void HandleLogin(FastTunnelServer server, Socket client, LogInMassage requet) { bool hasTunnel = false; var filters = FastTunnelGlobal.GetFilters(typeof(IFastTunnelAuthenticationFilter)); if (filters.Count() > 0) { foreach (IFastTunnelAuthenticationFilter item in filters) { var result = item.Authentication(server, requet); if (!result) { client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Error, "认证失败") }); return; } } } var sb = new StringBuilder($"{Environment.NewLine}=====隧道已建立成功,可通过以下方式访问内网服务====={Environment.NewLine}"); if (requet.Webs != null && requet.Webs.Count() > 0) { hasTunnel = true; foreach (var item in requet.Webs) { var hostName = $"{item.SubDomain}.{server.ServerSettings.WebDomain}".Trim(); var info = new WebInfo { Socket = client, WebConfig = item }; _logger.LogDebug($"new domain '{hostName}'"); server.WebList.AddOrUpdate(hostName, info, (key, oldInfo) => { return(info); }); sb.Append($"{Environment.NewLine} http://{hostName}{(server.ServerSettings.WebHasNginxProxy ? string.Empty : ":" + server.ServerSettings.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}"); if (item.WWW != null) { foreach (var www in item.WWW) { if (!www.EndsWith(server.ServerSettings.WebDomain)) { server.WebList.AddOrUpdate(www, info, (key, oldInfo) => { return(info); }); sb.Append($"{Environment.NewLine} http://{www}{(server.ServerSettings.WebHasNginxProxy ? string.Empty : ":" + server.ServerSettings.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}"); } else { // can`t use WebDomain _logger.LogError($"Invalid WebDomain IN WWW {www}"); } } } } } if (requet.SSH != null && requet.SSH.Count() > 0) { hasTunnel = true; foreach (var item in requet.SSH) { try { if (item.RemotePort.Equals(server.ServerSettings.BindPort)) { _logger.LogError($"RemotePort can not be same with BindPort: {item.RemotePort}"); continue; } if (item.RemotePort.Equals(server.ServerSettings.WebProxyPort)) { _logger.LogError($"RemotePort can not be same with ProxyPort_HTTP: {item.RemotePort}"); continue; } SSHInfo <SSHHandlerArg> old; if (server.SSHList.TryGetValue(item.RemotePort, out old)) { _logger.LogDebug($"Remove Listener {old.Listener.ListenIp}:{old.Listener.ListenPort}"); old.Listener.Stop(); server.SSHList.TryRemove(item.RemotePort, out SSHInfo <SSHHandlerArg> _); } var ls = new PortProxyListener("0.0.0.0", item.RemotePort, _logger); ls.Start(new SSHDispatcher(server, client, item)); // listen success server.SSHList.TryAdd(item.RemotePort, new SSHInfo <SSHHandlerArg> { Listener = ls, Socket = client, SSHConfig = item }); _logger.LogDebug($"SSH proxy success: {item.RemotePort} => {item.LocalIp}:{item.LocalPort}"); sb.Append($"{Environment.NewLine} {server.ServerSettings.WebDomain}:{item.RemotePort} => {item.LocalIp}:{item.LocalPort}"); } catch (Exception ex) { _logger.LogError($"SSH proxy error: {item.RemotePort} => {item.LocalIp}:{item.LocalPort}"); _logger.LogError(ex.Message); client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, ex.Message) }); continue; } } } if (!hasTunnel) { client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, TunnelResource.NoTunnel) }); } else { sb.Append($"{Environment.NewLine}{Environment.NewLine}===================================================="); client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, sb.ToString()) }); } }
public void HandleLogin(FastTunnelServer server, Socket client, LogInMassage requet) { bool hasTunnel = false; var sb = new StringBuilder($"{Environment.NewLine}=====隧道已建立成功,可通过以下方式访问内网服务====={Environment.NewLine}"); if (requet.Webs != null && requet.Webs.Count() > 0) { hasTunnel = true; foreach (var item in requet.Webs) { var hostName = $"{item.SubDomain}.{server._serverSettings.Domain}".Trim(); if (server.WebList.ContainsKey(hostName)) { _logger.LogDebug($"renew domain '{hostName}'"); server.WebList.Remove(hostName); server.WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item }); } else { _logger.LogDebug($"new domain '{hostName}'"); server.WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item }); } sb.Append($"{Environment.NewLine} http://{hostName}{(server._serverSettings.HasNginxProxy ? string.Empty : ":" + server._serverSettings.ProxyPort_HTTP)} => {item.LocalIp}:{item.LocalPort}"); } } if (requet.SSH != null && requet.SSH.Count() > 0) { hasTunnel = true; foreach (var item in requet.SSH) { try { if (item.RemotePort.Equals(server._serverSettings.BindPort)) { _logger.LogError($"RemotePort can not be same with BindPort: {item.RemotePort}"); continue; } if (item.RemotePort.Equals(server._serverSettings.ProxyPort_HTTP)) { _logger.LogError($"RemotePort can not be same with ProxyPort_HTTP: {item.RemotePort}"); continue; } SSHInfo <SSHHandlerArg> old; if (server.SSHList.TryGetValue(item.RemotePort, out old)) { _logger.LogDebug($"Remove Listener {old.Listener.IP}:{old.Listener.Port}"); old.Listener.ShutdownAndClose(); server.SSHList.Remove(item.RemotePort); } var ls = new Listener <SSHHandlerArg>("0.0.0.0", item.RemotePort, _logger, (client, local) => { var msgid = Guid.NewGuid().ToString(); local.LocalClient.Send(new Message <NewSSHRequest> { MessageType = MessageType.S_NewSSH, Content = new NewSSHRequest { MsgId = msgid, SSHConfig = local.SSHConfig } }); server.newRequest.Add(msgid, new NewRequest { CustomerClient = client, }); } , new SSHHandlerArg { LocalClient = client, SSHConfig = item }); ls.Listen(); // listen success server.SSHList.Add(item.RemotePort, new SSHInfo <SSHHandlerArg> { Listener = ls, Socket = client, SSHConfig = item }); _logger.LogDebug($"SSH proxy success: {item.RemotePort} => {item.LocalIp}:{item.LocalPort}"); sb.Append($"{Environment.NewLine} {server._serverSettings.Domain}:{item.RemotePort} => {item.LocalIp}:{item.LocalPort}"); } catch (Exception ex) { _logger.LogError($"SSH proxy error: {item.RemotePort} => {item.LocalIp}:{item.LocalPort}"); _logger.LogError(ex.Message); client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, ex.Message) }); continue; } } } if (!hasTunnel) { client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, TunnelResource.NoTunnel) }); } else { sb.Append($"{Environment.NewLine}{Environment.NewLine}===================================================="); client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, sb.ToString()) }); } }
public virtual bool Authentication(FastTunnelServer server, LogInMassage requet) { return(true); }
public bool Authentication(FastTunnelServer server, LogInMassage requet) { return(!string.IsNullOrEmpty(requet.AuthInfo) && requet.AuthInfo.Equals("ODadoNDONODHSoDMFMsdpapdoNDSHDoadpwPDNoWAHDoNfa")); }
public void HandleLogin(FastTunnelServer server, Socket client, LogInMassage requet) { if (requet.Webs != null && requet.Webs.Count() > 0) { foreach (var item in requet.Webs) { var hostName = $"{item.SubDomain}.{server._serverSettings.Domain}".Trim(); if (server.WebList.ContainsKey(hostName)) { _logger.LogDebug($"renew domain '{hostName}'"); server.WebList.Remove(hostName); server.WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item }); } else { _logger.LogDebug($"new domain '{hostName}'"); server.WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item }); } client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, $"TunnelForWeb is OK: you can visit {item.LocalIp}:{item.LocalPort} from http://{hostName}:{server._serverSettings.ProxyPort_HTTP}") }); } client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, "web隧道已建立完毕") }); } if (requet.SSH != null && requet.SSH.Count() > 0) { foreach (var item in requet.SSH) { try { if (item.RemotePort.Equals(server._serverSettings.BindPort)) { _logger.LogError($"RemotePort can not be same with BindPort: {item.RemotePort}"); continue; } if (item.RemotePort.Equals(server._serverSettings.ProxyPort_HTTP)) { _logger.LogError($"RemotePort can not be same with ProxyPort_HTTP: {item.RemotePort}"); continue; } SSHInfo <SSHHandlerArg> old; if (server.SSHList.TryGetValue(item.RemotePort, out old)) { _logger.LogDebug($"Remove Listener {old.Listener.IP}:{old.Listener.Port}"); old.Listener.ShutdownAndClose(); server.SSHList.Remove(item.RemotePort); } var ls = new Listener <SSHHandlerArg>("0.0.0.0", item.RemotePort, _logger, (client, local) => { var msgid = Guid.NewGuid().ToString(); local.LocalClient.Send(new Message <NewSSHRequest> { MessageType = MessageType.S_NewSSH, Content = new NewSSHRequest { MsgId = msgid, SSHConfig = local.SSHConfig } }); server.newRequest.Add(msgid, new NewRequest { CustomerClient = client, }); } , new SSHHandlerArg { LocalClient = client, SSHConfig = item }); ls.Listen(); // listen success server.SSHList.Add(item.RemotePort, new SSHInfo <SSHHandlerArg> { Listener = ls, Socket = client, SSHConfig = item }); _logger.LogDebug($"SSH proxy success: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}"); client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, $"TunnelForSSH is OK: [ServerAddr]:{item.RemotePort}->{item.LocalIp}:{item.LocalPort}") }); } catch (Exception ex) { _logger.LogError($"SSH proxy error: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}"); _logger.LogError(ex.Message); client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, ex.Message) }); continue; } } client.Send(new Message <LogMassage> { MessageType = MessageType.Log, Content = new LogMassage(LogMsgType.Info, "远程桌面隧道已建立完毕") }); } }