private void ListenFastTunnelClient() { IListener <object> listener = new AsyncListener <object>(_serverSettings.BindAddr, _serverSettings.BindPort, _logger, null); listener.Listen(ReceiveClient); _logger.LogDebug($"监听客户端 -> {_serverSettings.BindAddr}:{_serverSettings.BindPort}"); }
private void ListenClient() { IListener client_listener = new AsyncListener(ServerSettings.BindAddr, ServerSettings.BindPort, _logger); client_listener.Listen(new ClientDispatcher(this, _logger, ServerSettings)); _logger.LogDebug($"监听客户端 -> {ServerSettings.BindAddr}:{ServerSettings.BindPort}"); }
private void ListenCustomer() { var listener = new AsyncListener <object>(_serverSettings.BindAddr, _serverSettings.ProxyPort_HTTP, _logger, null); listener.Listen(ReceiveCustomer); _logger.LogDebug($"监听HTTP -> {_serverSettings.BindAddr}:{_serverSettings.ProxyPort_HTTP}"); }
private void ListenHttp() { IListener http_listener = new AsyncListener(ServerSettings.BindAddr, ServerSettings.WebProxyPort, _logger); http_listener.Listen(new HttpDispatcher(this, _logger, ServerSettings)); _logger.LogDebug($"监听HTTP -> {ServerSettings.BindAddr}:{ServerSettings.WebProxyPort}"); }
public void Start() { _messageQueue.StartProcessing(); _listener.OnClientConnected += OnClientConnectedCallback; _listener.OnMessageReceived += OnMessageReceivedCallback; _listener.OnConnectionError += OnConnectionError; _listener.Listen(); }
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 AsyncListener <SSHHandlerArg>("0.0.0.0", item.RemotePort, _logger, new SSHHandlerArg { LocalClient = client, SSHConfig = item }); ls.Listen((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, }); }); // 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 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.WebDomain}".Trim(); var info = new WebInfo { Socket = client, WebConfig = item }; _logger.LogDebug($"new domain '{hostName}'"); server.WebList.AddOrUpdate(hostName, info, (key, info) => { 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, info) => { return(info); }); sb.Append($"{Environment.NewLine} http://{www}{(server.ServerSettings.WebHasNginxProxy ? string.Empty : ":" + server.ServerSettings.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}"); } else { // cant use WebDomain _logger.LogDebug($"USE WebDomain IN WWW {www}"); sb.Append($"{Environment.NewLine} cant use {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.IP}:{old.Listener.Port}"); old.Listener.ShutdownAndClose(); server.SSHList.TryRemove(item.RemotePort, out SSHInfo <SSHHandlerArg> _); } var ls = new AsyncListener("0.0.0.0", item.RemotePort, _logger); ls.Listen(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()) }); } }