diff --git a/linker.messenger.example/Program.cs b/linker.messenger.example/Program.cs index e52c0587..03fde440 100644 --- a/linker.messenger.example/Program.cs +++ b/linker.messenger.example/Program.cs @@ -12,7 +12,6 @@ using linker.plugins.tunnel; using linker.tunnel; using linker.tunnel.connection; using linker.tunnel.transport; -using linker.tunnel.wanport; using System.Net; using System.Net.Sockets; using System.Security.Cryptography.X509Certificates; @@ -75,34 +74,22 @@ namespace linker.messenger.example IMessengerSender messengerSender = new MessengerSender(); IMessengerResolver messengerResolver = new MessengerResolver(messengerSender); - - //外网端口相关 - TunnelWanPortTransfer tunnelWanPortTransfer = new TunnelWanPortTransfer(); - tunnelWanPortTransfer.LoadTransports(new List { - new TunnelWanPortProtocolLinkerUdp(), - new TunnelWanPortProtocolLinkerTcp(), - }); //打洞相关 - TunnelTransfer tunnelTransfer = new TunnelTransfer(); + TunnelExcludeIPTransfer tunnelExcludeIPTransfer = new TunnelExcludeIPTransfer(); + //tunnelExcludeIPTransfer.LoadTunnelExcludeIPs(new List()); + TunnelMessengerAdapter tunnelMessengerAdapter = new TunnelMessengerAdapter(messengerSender, tunnelExcludeIPTransfer, serializer, new TunnelMessengerAdapterStore()); + TunnelTransfer tunnelTransfer = new TunnelTransfer(tunnelMessengerAdapter); tunnelTransfer.SetConnectedCallback("default", (connection) => { Console.WriteLine($"打洞成功,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的连接"); connection.BeginReceive(new TunnelConnectionReceiveCallback(), null); }); - //打洞排除IP - TunnelExcludeIPTransfer tunnelExcludeIPTransfer = new TunnelExcludeIPTransfer(); - // - //tunnelExcludeIPTransfer.LoadTunnelExcludeIPs(new List()); - TunnelClientMessenger tunnelClientMessenger = new TunnelClientMessenger(tunnelTransfer, messengerSender, serializer); - TunnelMessengerAdapter tunnelMessengerAdapter = new TunnelMessengerAdapter(messengerSender, - tunnelExcludeIPTransfer, tunnelWanPortTransfer, new TunnelUpnpTransfer(), - tunnelTransfer, serializer, new TunnelMessengerAdapterStore()); + //中继相关 IRelayClientStore relayClientStore = new RelayClientStore(); - RelayClientTransfer relayClientTransfer = new RelayClientTransfer(relayClientStore); - relayClientTransfer.LoadTransports(new List { new RelayClientTransportSelfHost(messengerSender, serializer, relayClientStore) }); + RelayClientTransfer relayClientTransfer = new RelayClientTransfer(messengerSender, serializer, relayClientStore); relayClientTransfer.SetConnectedCallback("default", (connection) => { Console.WriteLine($"中继成功,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的连接"); @@ -121,11 +108,6 @@ namespace linker.messenger.example Console.WriteLine($"输入服务端ip端口:"); publicConfigInfo.Host = Console.ReadLine(); - publicConfigInfo.RouteLevel = NetworkHelper.GetRouteLevel(publicConfigInfo.Host, out List ips); - publicConfigInfo.LocalIps = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray(); - Console.WriteLine($"本地IP : {string.Join(",", publicConfigInfo.LocalIps.Select(c => c.ToString()))}"); - Console.WriteLine($"外网距离 : {publicConfigInfo.RouteLevel}"); - Console.WriteLine($"开始连接服务器"); IPEndPoint server = NetworkHelper.GetEndPoint(publicConfigInfo.Host, 1802); Socket socket = new Socket(server.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); @@ -162,8 +144,9 @@ namespace linker.messenger.example publicConfigInfo.SignConnection?.Disponse(6); return; } - publicConfigInfo.MachineId = signResp.MachineId; + publicConfigInfo.SignConnection.Id = signResp.MachineId; Console.WriteLine($"你的id:{signResp.MachineId}"); + tunnelTransfer.Refresh(); Console.WriteLine($"去连接吗?,1打洞,2中继:"); string connect = Console.ReadLine(); @@ -181,7 +164,7 @@ namespace linker.messenger.example break; case "2": { - tunnelConnection = await relayClientTransfer.ConnectAsync(publicConfigInfo.MachineId, id, "default"); + tunnelConnection = await relayClientTransfer.ConnectAsync(publicConfigInfo.SignConnection.Id, id, "default"); } break; default: @@ -366,10 +349,7 @@ namespace linker.messenger.example public sealed class PublicConfigInfo { - public string MachineId { get; set; } public IConnection SignConnection { get; set; } - public IPAddress[] LocalIps { get; set; } - public int RouteLevel { get; set; } public X509Certificate2 Certificate { get; set; } public List TunnelTransports { get; set; } @@ -434,20 +414,23 @@ namespace linker.messenger.example public sealed class TunnelMessengerAdapterStore : ITunnelMessengerAdapterStore { public IConnection SignConnection => Program.publicConfigInfo.SignConnection; - - public X509Certificate2 Certificate => Program.publicConfigInfo.Certificate; - public List TunnelTransports => Program.publicConfigInfo.TunnelTransports; - public int RouteLevelPlus => 0; + public int PortMapPrivate => 0; + public int PortMapPublic => 0; public TunnelMessengerAdapterStore() { } - public bool SetTunnelTransports(List list) + + public async Task> GetTunnelTransports() { - return true; + return await Task.FromResult(Program.publicConfigInfo.TunnelTransports); + } + public async Task SetTunnelTransports(List list) + { + return await Task.FromResult(true); } } diff --git a/linker.messenger.relay/client/RelayClientTransfer.cs b/linker.messenger.relay/client/RelayClientTransfer.cs index d614acf5..d09b0be8 100644 --- a/linker.messenger.relay/client/RelayClientTransfer.cs +++ b/linker.messenger.relay/client/RelayClientTransfer.cs @@ -17,14 +17,12 @@ namespace linker.messenger.relay.client private Dictionary>> OnConnected { get; } = new Dictionary>>(); private readonly IRelayClientStore relayClientStore; - public RelayClientTransfer(IRelayClientStore relayClientStore) + public RelayClientTransfer(IMessengerSender messengerSender,ISerializer serializer,IRelayClientStore relayClientStore) { this.relayClientStore = relayClientStore; - } - - public void LoadTransports(List list) - { - Transports = list; + Transports = new List { + new RelayClientTransportSelfHost(messengerSender,serializer,relayClientStore), + }; } /// diff --git a/linker.messenger.tunnel/ITunnelExcludeIP.cs b/linker.messenger.tunnel/ITunnelExcludeIP.cs index ce8246cf..eae4f8f3 100644 --- a/linker.messenger.tunnel/ITunnelExcludeIP.cs +++ b/linker.messenger.tunnel/ITunnelExcludeIP.cs @@ -7,16 +7,6 @@ namespace linker.messenger.tunnel /// public interface ITunnelExcludeIP { - public ExcludeIPItem[] Get(); - } - - /// - /// 排除的IP - /// - public sealed partial class ExcludeIPItem - { - public ExcludeIPItem() { } - public IPAddress IPAddress { get; set; } - public byte Mask { get; set; } = 32; + public List Get(); } } diff --git a/linker.messenger.tunnel/TunnelExcludeIPTransfer.cs b/linker.messenger.tunnel/TunnelExcludeIPTransfer.cs index b4bdcd03..ef6ca9cb 100644 --- a/linker.messenger.tunnel/TunnelExcludeIPTransfer.cs +++ b/linker.messenger.tunnel/TunnelExcludeIPTransfer.cs @@ -1,4 +1,6 @@ -namespace linker.messenger.tunnel +using System.Net; + +namespace linker.messenger.tunnel { /// /// 打洞排除IP @@ -24,7 +26,7 @@ /// 获取所有实现类的排除IP /// /// - public List Get() + public List Get() { return excludeIPs.SelectMany(c => c.Get()).ToList(); } diff --git a/linker.messenger.tunnel/TunnelMessenger.cs b/linker.messenger.tunnel/TunnelMessenger.cs index 1e6b9ea7..ad7f05bf 100644 --- a/linker.messenger.tunnel/TunnelMessenger.cs +++ b/linker.messenger.tunnel/TunnelMessenger.cs @@ -14,7 +14,7 @@ namespace linker.messenger.tunnel private readonly IMessengerSender messengerSender; private readonly ISerializer serializer; - public TunnelClientMessenger(TunnelTransfer tunnel, IMessengerSender messengerSender, ISerializer serializer) + public TunnelClientMessenger(TunnelTransfer tunnel, IMessengerSender messengerSender, ISerializer serializer) { this.tunnel = tunnel; this.messengerSender = messengerSender; @@ -29,7 +29,7 @@ namespace linker.messenger.tunnel tunnelTransportInfo.Local = tunnelTransportInfo.Remote; tunnelTransportInfo.Remote = local; - tunnel.OnBegin(tunnelTransportInfo); + _ = tunnel.OnBegin(tunnelTransportInfo); connection.Write(Helper.TrueArray); } diff --git a/linker.messenger.tunnel/TunnelMessengerAdapter.cs b/linker.messenger.tunnel/TunnelMessengerAdapter.cs index 1ccaae3d..17237ea8 100644 --- a/linker.messenger.tunnel/TunnelMessengerAdapter.cs +++ b/linker.messenger.tunnel/TunnelMessengerAdapter.cs @@ -1,12 +1,10 @@ using linker.tunnel.transport; using linker.libs; using System.Net; -using linker.tunnel.wanport; using linker.tunnel; using linker.messenger; using linker.messenger.tunnel; using System.Security.Cryptography.X509Certificates; -using linker.libs.extends; namespace linker.plugins.tunnel { @@ -21,118 +19,81 @@ namespace linker.plugins.tunnel public IConnection SignConnection { get; } /// - /// 调整的网络层级 + /// 配置的额外网络层级 /// - public int RouteLevelPlus { get; } + public int RouteLevelPlus { get; } /// - /// ssl + /// 加密密钥 /// public X509Certificate2 Certificate { get; } + /// - /// 打洞协议列表,按照这个列表去打洞 + /// 端口映射内外端口 /// - public List TunnelTransports { get; } + public int PortMapPrivate { get; } /// - /// 保存打洞协议列表,因为可能会有新的打洞协议 + /// 端口映射外网端口 + /// + public int PortMapPublic { get; } + + /// + /// 获取打洞协议列表 /// - /// /// - public bool SetTunnelTransports(List list); + public Task> GetTunnelTransports(); + /// + /// 保存打洞协议列表 + /// + /// + public Task SetTunnelTransports(List list); } /// /// 打洞信标适配 /// - public class TunnelMessengerAdapter + public class TunnelMessengerAdapter: ITunnelMessengerAdapter { + public string MachineId => tunnelMessengerAdapterStore.SignConnection?.Id ?? string.Empty; + public int RouteLevelPlus => tunnelMessengerAdapterStore.RouteLevelPlus; + public IPEndPoint ServerHost => tunnelMessengerAdapterStore.SignConnection?.Address ?? null; + public X509Certificate2 Certificate => tunnelMessengerAdapterStore.Certificate; + public int PortMapPrivate => tunnelMessengerAdapterStore.PortMapPrivate; + public int PortMapPublic => tunnelMessengerAdapterStore.PortMapPublic; + + private readonly IMessengerSender messengerSender; private readonly TunnelExcludeIPTransfer excludeIPTransfer; - private readonly TunnelWanPortTransfer tunnelWanPortTransfer; - private readonly TunnelUpnpTransfer tunnelUpnpTransfer; - private readonly TunnelTransfer tunnelTransfer; - - - private readonly TransportTcpPortMap transportTcpPortMap; - private readonly TransportUdpPortMap transportUdpPortMap; - private readonly ISerializer serializer; private readonly ITunnelMessengerAdapterStore tunnelMessengerAdapterStore; - public TunnelMessengerAdapter(IMessengerSender messengerSender, TunnelExcludeIPTransfer excludeIPTransfer, TunnelWanPortTransfer tunnelWanPortTransfer, TunnelUpnpTransfer tunnelUpnpTransfer, TunnelTransfer tunnelTransfer, ISerializer serializer,ITunnelMessengerAdapterStore tunnelMessengerAdapterStore) + public TunnelMessengerAdapter(IMessengerSender messengerSender, TunnelExcludeIPTransfer excludeIPTransfer, ISerializer serializer, ITunnelMessengerAdapterStore tunnelMessengerAdapterStore) { this.messengerSender = messengerSender; this.excludeIPTransfer = excludeIPTransfer; - - this.tunnelWanPortTransfer = tunnelWanPortTransfer; - this.tunnelUpnpTransfer = tunnelUpnpTransfer; - this.tunnelTransfer = tunnelTransfer; - this.serializer = serializer; - this.tunnelMessengerAdapterStore = tunnelMessengerAdapterStore; - - //加载外网端口 - tunnelWanPortTransfer.LoadTransports(new List - { - new TunnelWanPortProtocolLinkerUdp(), - new TunnelWanPortProtocolLinkerTcp(), - }); - - tunnelTransfer.LocalIP = () => tunnelMessengerAdapterStore.SignConnection?.LocalAddress.Address ?? IPAddress.Any; ; - tunnelTransfer.ServerHost = () => tunnelMessengerAdapterStore.SignConnection?.Address ?? null; - tunnelTransfer.Certificate = () => tunnelMessengerAdapterStore.Certificate; - tunnelTransfer.GetTunnelTransports = () => tunnelMessengerAdapterStore.TunnelTransports; - tunnelTransfer.SetTunnelTransports = (transports, update) => tunnelMessengerAdapterStore.SetTunnelTransports(transports); - tunnelTransfer.GetLocalConfig = GetLocalConfig; - tunnelTransfer.GetRemoteWanPort = GetRemoteWanPort; - tunnelTransfer.SendConnectBegin = SendConnectBegin; - tunnelTransfer.SendConnectFail = SendConnectFail; - tunnelTransfer.SendConnectSuccess = SendConnectSuccess; - //加载打洞协议 - transportTcpPortMap = new TransportTcpPortMap(); - transportUdpPortMap = new TransportUdpPortMap(); - tunnelTransfer.LoadTransports(tunnelWanPortTransfer, tunnelUpnpTransfer, new List { - new TunnelTransportTcpNutssb(), - new TransportMsQuic(), - new TransportTcpP2PNAT(), - transportTcpPortMap, - transportUdpPortMap, - new TransportUdp(), - }); } - private readonly NetworkInfo network = new NetworkInfo(); - private NetworkInfo GetLocalConfig() + public async Task> GetExcludeIps() { - var excludeips = excludeIPTransfer.Get(); - - NetworkInfo networkInfo = new NetworkInfo { LocalIps= network.LocalIps, MachineId= network.MachineId, RouteLevel=network.RouteLevel+ tunnelMessengerAdapterStore.RouteLevelPlus }; - networkInfo.LocalIps = networkInfo.LocalIps.Where(c => - { - if (c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) - { - uint ip = NetworkHelper.IP2Value(c); - foreach (var item in excludeips) - { - uint maskValue = NetworkHelper.PrefixLength2Value(item.Mask); - uint ip1 = NetworkHelper.IP2Value(item.IPAddress); - if ((ip & maskValue) == (ip1 & maskValue)) - { - return false; - } - } - } - return true; - }).ToArray(); - - return networkInfo; + return await Task.FromResult(excludeIPTransfer.Get()); } - private async Task GetRemoteWanPort(TunnelWanPortProtocolInfo info) + public async Task> GetTunnelTransports() + { + return await tunnelMessengerAdapterStore.GetTunnelTransports(); + } + + public async Task SetTunnelTransports(List list) + { + return await tunnelMessengerAdapterStore.SetTunnelTransports(list); + } + + public async Task GetRemoteWanPort(TunnelWanPortProtocolInfo info) { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { @@ -146,7 +107,8 @@ namespace linker.plugins.tunnel } return null; } - private async Task SendConnectBegin(TunnelTransportInfo tunnelTransportInfo) + + public async Task SendConnectBegin(TunnelTransportInfo tunnelTransportInfo) { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { @@ -156,7 +118,7 @@ namespace linker.plugins.tunnel }).ConfigureAwait(false); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); } - private async Task SendConnectFail(TunnelTransportInfo tunnelTransportInfo) + public async Task SendConnectFail(TunnelTransportInfo tunnelTransportInfo) { await messengerSender.SendOnly(new MessageRequestWrap { @@ -166,7 +128,7 @@ namespace linker.plugins.tunnel }).ConfigureAwait(false); return true; } - private async Task SendConnectSuccess(TunnelTransportInfo tunnelTransportInfo) + public async Task SendConnectSuccess(TunnelTransportInfo tunnelTransportInfo) { await messengerSender.SendOnly(new MessageRequestWrap { @@ -177,40 +139,5 @@ namespace linker.plugins.tunnel return true; } - public void RefreshNetwork() - { - TimerHelper.Async(() => - { - network.RouteLevel = NetworkHelper.GetRouteLevel(tunnelMessengerAdapterStore.SignConnection.Address.ToString(), out List ips); - network.LocalIps = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray(); - network.MachineId = tunnelMessengerAdapterStore.SignConnection.Id; - }); - } - /// - /// 刷新端口映射,一般来说,端口发生变化,或者网络发生变化就刷新一下 - /// - /// - /// - public void RefreshPortMap(int publicPort, int privatePort) - { - if (privatePort > 0) - { - tunnelUpnpTransfer.SetMap(privatePort, publicPort); - _ = transportTcpPortMap.Listen(privatePort); - _ = transportUdpPortMap.Listen(privatePort); - } - else - { - if (tunnelMessengerAdapterStore.SignConnection != null && tunnelMessengerAdapterStore.SignConnection.Connected) - { - int ip = tunnelMessengerAdapterStore.SignConnection.LocalAddress.Address.GetAddressBytes()[3]; - tunnelUpnpTransfer.SetMap(18180 + ip); - - _ = transportTcpPortMap.Listen(18180 + ip); - _ = transportUdpPortMap.Listen(18180 + ip); - } - } - - } } } diff --git a/linker.tunnel/ITunnelMessengerAdapter.cs b/linker.tunnel/ITunnelMessengerAdapter.cs new file mode 100644 index 00000000..370b2d75 --- /dev/null +++ b/linker.tunnel/ITunnelMessengerAdapter.cs @@ -0,0 +1,70 @@ +using linker.tunnel.transport; +using System.Net; +using System.Security.Cryptography.X509Certificates; + +namespace linker.tunnel +{ + public interface ITunnelMessengerAdapter + { + /// + /// 连接id + /// + public string MachineId { get; } + /// + /// 配置的额外网络层级 + /// + public int RouteLevelPlus { get; } + /// + /// 服务器地址 + /// + public IPEndPoint ServerHost { get; } + /// + /// 加密密钥 + /// + public X509Certificate2 Certificate { get; } + + /// + /// 端口映射内外端口 + /// + public int PortMapPrivate { get; } + /// + /// 端口映射外网端口 + /// + public int PortMapPublic { get; } + + /// + /// 获取远端的外网信息,比如你是A,你要获取B的信息,可以在B调用 TunnelTransfer.GetWanPort() 发送回来 + /// + public Task GetRemoteWanPort(TunnelWanPortProtocolInfo info); + + /// + /// 发送开始打洞 + /// + public Task SendConnectBegin(TunnelTransportInfo info); + /// + /// 发送打洞失败 + /// + public Task SendConnectFail(TunnelTransportInfo info); + /// + /// 发送打洞成功 + /// + public Task SendConnectSuccess(TunnelTransportInfo info); + + /// + /// 获取打洞排除IP + /// + /// + public Task> GetExcludeIps(); + + /// + /// 获取打洞协议列表 + /// + /// + public Task> GetTunnelTransports(); + /// + /// 保存打洞协议列表 + /// + /// + public Task SetTunnelTransports(List list); + } +} diff --git a/linker.tunnel/TunnelTransfer.cs b/linker.tunnel/TunnelTransfer.cs index d6ca7060..cd54f119 100644 --- a/linker.tunnel/TunnelTransfer.cs +++ b/linker.tunnel/TunnelTransfer.cs @@ -6,93 +6,49 @@ using System.Collections.Concurrent; using System.Net.Sockets; using System.Net; using linker.tunnel.wanport; -using System.Security.Cryptography.X509Certificates; namespace linker.tunnel { public sealed class TunnelTransfer { - - /// - /// 本机局域网IP,当然你也可以使用0.0.0.0,但是使用局域网IP会提高打洞成功率 - /// - public Func LocalIP { get; set; } = () => IPAddress.Any; - /// - /// 服务器地址 - /// - public Func ServerHost { get; set; } = () => new IPEndPoint(IPAddress.Any, 0); - /// - /// ssl加密证书,没有证书则无法加密通信 - /// - public Func Certificate { get; set; } = () => null; - /// - /// 获取打洞协议列表 - /// - /// - public Func> GetTunnelTransports { get; set; } = () => new List(); - /// - /// 保存打洞协议列表 - /// - /// - public Action, bool> SetTunnelTransports { get; set; } = (list, update) => { }; - - /// - /// 获取本地网络信息 - /// - /// - public Func GetLocalConfig { get; set; } = () => new NetworkInfo(); - - /// - /// 获取远端的外网信息,比如你是A,你要获取B的信息,可以在B调用 TunnelTransfer.GetWanPort() 发送回来 - /// - public Func> GetRemoteWanPort { get; set; } = async (info) => { return await Task.FromResult(new TunnelTransportWanPortInfo()); }; - - /// - /// 发送开始打洞 - /// - public Func> SendConnectBegin { get; set; } = async (info) => { return await Task.FromResult(false); }; - /// - /// 发送打洞失败 - /// - public Func> SendConnectFail { get; set; } = async (info) => { return await Task.FromResult(false); }; - /// - /// 发送打洞成功 - /// - public Func> SendConnectSuccess { get; set; } = async (info) => { return await Task.FromResult(false); }; - + private readonly NetworkInfo networkInfo = new NetworkInfo(); private List transports; private TunnelWanPortTransfer tunnelWanPortTransfer; - private TunnelUpnpTransfer TunnelUpnpTransfer; + private TunnelUpnpTransfer tunnelUpnpTransfer; private ConcurrentDictionary connectingDic = new ConcurrentDictionary(); private uint flowid = 1; private Dictionary>> OnConnected { get; } = new Dictionary>>(); - public TunnelTransfer() - { - } - /// - /// 装载打洞协议 - /// - /// - public void LoadTransports(TunnelWanPortTransfer tunnelWanPortTransfer, TunnelUpnpTransfer TunnelUpnpTransfer, List transports) + private readonly ITunnelMessengerAdapter tunnelMessengerAdapter; + public TunnelTransfer(ITunnelMessengerAdapter tunnelMessengerAdapter) { - this.tunnelWanPortTransfer = tunnelWanPortTransfer; - this.transports = transports; - this.TunnelUpnpTransfer = TunnelUpnpTransfer; + this.tunnelMessengerAdapter = tunnelMessengerAdapter; + + TransportUdpPortMap transportUdpPortMap = new TransportUdpPortMap(tunnelMessengerAdapter); + TransportTcpPortMap transportTcpPortMap = new TransportTcpPortMap(tunnelMessengerAdapter); + this.tunnelUpnpTransfer = new TunnelUpnpTransfer(transportUdpPortMap, transportTcpPortMap); + tunnelWanPortTransfer = new TunnelWanPortTransfer(); + transports = new List { + new TransportUdp(tunnelMessengerAdapter), + new TransportTcpP2PNAT(tunnelMessengerAdapter), + new TransportTcpNutssb(tunnelMessengerAdapter), + transportUdpPortMap, + transportTcpPortMap, + new TransportMsQuic(tunnelMessengerAdapter) + }; foreach (var item in transports) { - item.OnSendConnectBegin = SendConnectBegin; - item.OnSendConnectFail = SendConnectFail; - item.OnSendConnectSuccess = SendConnectSuccess; item.OnConnected = _OnConnected; - item.SetSSL(Certificate()); } - - var transportItems = GetTunnelTransports().ToList(); + _ = RebuildTransports(); + } + private async Task RebuildTransports() + { + var transportItems = (await tunnelMessengerAdapter.GetTunnelTransports()).ToList(); //有新的协议 var newTransportNames = transports.Select(c => c.Name).Except(transportItems.Select(c => c.Name)); if (newTransportNames.Any()) @@ -143,10 +99,60 @@ namespace linker.tunnel } } - SetTunnelTransports(transportItems, true); + await tunnelMessengerAdapter.SetTunnelTransports(transportItems); LoggerHelper.Instance.Info($"load tunnel transport:{string.Join(",", transports.Select(c => c.Name))}"); } + /// + /// 刷新一下网络信息,比如路由级别,本机IP等 + /// + public void Refresh() + { + RefreshNetwork(); + } + private void RefreshNetwork() + { + TimerHelper.Async(async () => + { + networkInfo.RouteLevel = NetworkHelper.GetRouteLevel(tunnelMessengerAdapter.ServerHost.ToString(), out List ips); + networkInfo.LocalIps = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray(); + networkInfo.MachineId = tunnelMessengerAdapter.MachineId; + networkInfo.LocalIp = await GetLocalIP(tunnelMessengerAdapter.ServerHost); + + if (tunnelMessengerAdapter.PortMapPrivate > 0) + { + tunnelUpnpTransfer.SetMap(tunnelMessengerAdapter.PortMapPrivate, tunnelMessengerAdapter.PortMapPublic); + } + else + { + if (networkInfo.LocalIp.Equals(IPAddress.Any) == false) + { + int ip = networkInfo.LocalIp.GetAddressBytes()[3]; + tunnelUpnpTransfer.SetMap(18180 + ip); + } + } + + async Task GetLocalIP(IPEndPoint server) + { + var socket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + try + { + await socket.ConnectAsync(server); + return (socket.LocalEndPoint as IPEndPoint).Address; + } + catch (Exception) + { + } + finally + { + socket.SafeClose(); + } + return IPAddress.Any; + } + }); + } + + /// /// 设置成功打洞回调 /// @@ -200,9 +206,11 @@ namespace linker.tunnel try { - foreach (TunnelTransportItemInfo transportItem in GetTunnelTransports().OrderBy(c => c.Order).Where(c => c.Disabled == false)) + var _transports = await tunnelMessengerAdapter.GetTunnelTransports(); + foreach (TunnelTransportItemInfo transportItem in _transports.OrderBy(c => c.Order).Where(c => c.Disabled == false)) { ITunnelTransport transport = transports.FirstOrDefault(c => c.Name == transportItem.Name); + transport.SetSSL(tunnelMessengerAdapter.Certificate); //找不到这个打洞协议,或者是不支持的协议 if (transport == null || (transport.ProtocolType & denyProtocols) == transport.ProtocolType) { @@ -228,7 +236,7 @@ namespace linker.tunnel //获取自己的外网ip Task localInfo = GetLocalInfo(wanPortProtocol); //获取对方的外网ip - Task remoteInfo = GetRemoteWanPort(new TunnelWanPortProtocolInfo + Task remoteInfo = tunnelMessengerAdapter.GetRemoteWanPort(new TunnelWanPortProtocolInfo { MachineId = remoteMachineId, ProtocolType = wanPortProtocol @@ -307,7 +315,7 @@ namespace linker.tunnel /// 收到对方开始连接的消息 /// /// - public void OnBegin(TunnelTransportInfo tunnelTransportInfo) + public async Task OnBegin(TunnelTransportInfo tunnelTransportInfo) { if (connectingDic.TryAdd(tunnelTransportInfo.Remote.MachineId, true) == false) { @@ -315,13 +323,15 @@ namespace linker.tunnel } try { - ITunnelTransport _transports = transports.FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.ProtocolType == tunnelTransportInfo.TransportType); - TunnelTransportItemInfo item = GetTunnelTransports().FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.Disabled == false); - if (_transports != null && item != null) + var _transports = await tunnelMessengerAdapter.GetTunnelTransports(); + ITunnelTransport transport = transports.FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.ProtocolType == tunnelTransportInfo.TransportType); + TunnelTransportItemInfo item = _transports.FirstOrDefault(c => c.Name == tunnelTransportInfo.TransportName && c.Disabled == false); + if (transport != null && item != null) { + transport.SetSSL(tunnelMessengerAdapter.Certificate); OnConnectBegin(tunnelTransportInfo); ParseRemoteEndPoint(tunnelTransportInfo); - _transports.OnBegin(tunnelTransportInfo).ContinueWith((result) => + _ = transport.OnBegin(tunnelTransportInfo).ContinueWith((result) => { connectingDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out _); }); @@ -329,7 +339,7 @@ namespace linker.tunnel else { connectingDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out _); - _ = SendConnectFail(tunnelTransportInfo); + _ = tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo); } } catch (Exception ex) @@ -370,30 +380,39 @@ namespace linker.tunnel { return await GetLocalInfo(_info.ProtocolType).ConfigureAwait(false); } - /// /// 获取自己的外网IP /// /// private async Task GetLocalInfo(TunnelWanPortProtocolType tunnelWanPortProtocolType) { - var config = GetLocalConfig(); - if (string.IsNullOrWhiteSpace(config.MachineId)) + if (tunnelMessengerAdapter.ServerHost == null || string.IsNullOrWhiteSpace(tunnelMessengerAdapter.MachineId)) return null; + + var excludeips = await tunnelMessengerAdapter.GetExcludeIps(); + NetworkInfo network = new NetworkInfo + { + LocalIps = networkInfo.LocalIps.Where(c => excludeips.Contains(c) == false).ToArray(), + RouteLevel = networkInfo.RouteLevel + tunnelMessengerAdapter.RouteLevelPlus, + MachineId = tunnelMessengerAdapter.MachineId, + LocalIp = networkInfo.LocalIp, + }; + if (string.IsNullOrWhiteSpace(network.MachineId)) { return null; } - TunnelWanPortEndPoint ip = await tunnelWanPortTransfer.GetWanPortAsync(ServerHost(), LocalIP(), tunnelWanPortProtocolType).ConfigureAwait(false); + Console.WriteLine(network.ToJson()); + TunnelWanPortEndPoint ip = await tunnelWanPortTransfer.GetWanPortAsync(tunnelMessengerAdapter.ServerHost, network.LocalIp, tunnelWanPortProtocolType).ConfigureAwait(false); if (ip != null) { - MapInfo portMapInfo = TunnelUpnpTransfer.PortMap ?? new MapInfo { PrivatePort = 0, PublicPort = 0 }; - + MapInfo portMapInfo = tunnelUpnpTransfer.PortMap ?? new MapInfo { PrivatePort = 0, PublicPort = 0 }; + return new TunnelTransportWanPortInfo { Local = ip.Local, Remote = ip.Remote, - LocalIps = config.LocalIps, - RouteLevel = config.RouteLevel, - MachineId = config.MachineId, + LocalIps = network.LocalIps, + RouteLevel = network.RouteLevel, + MachineId = network.MachineId, PortMapLan = portMapInfo.PrivatePort, PortMapWan = portMapInfo.PublicPort, }; @@ -401,6 +420,7 @@ namespace linker.tunnel return null; } + private void OnConnecting(TunnelTransportInfo tunnelTransportInfo) { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) @@ -411,7 +431,6 @@ namespace linker.tunnel if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Info($"tunnel connecting from {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName}"); } - /// /// 连接成功 /// diff --git a/linker.tunnel/TunnelUpnpTransfer.cs b/linker.tunnel/TunnelUpnpTransfer.cs index 2b054b2a..09c08b63 100644 --- a/linker.tunnel/TunnelUpnpTransfer.cs +++ b/linker.tunnel/TunnelUpnpTransfer.cs @@ -1,4 +1,5 @@ using linker.libs; +using linker.tunnel.transport; using Mono.Nat; using System.Collections.Concurrent; @@ -18,11 +19,17 @@ namespace linker.tunnel public MapInfo PortMap => MapInfo1 ?? MapInfo; - public TunnelUpnpTransfer() + private readonly TransportUdpPortMap transportUdpPortMap; + private readonly TransportTcpPortMap transportTcpPortMap; + public TunnelUpnpTransfer(TransportUdpPortMap transportUdpPortMap,TransportTcpPortMap transportTcpPortMap) { + this.transportUdpPortMap = transportUdpPortMap; + this.transportTcpPortMap = transportTcpPortMap; + NatUtility.DeviceFound += DeviceFound; NatUtility.StartDiscovery(); LoopDiscovery(); + } private void LoopDiscovery() @@ -105,6 +112,9 @@ namespace linker.tunnel { MapInfo = new MapInfo { PrivatePort = privatePort, PublicPort = privatePort }; AddMap(); + + _ = transportTcpPortMap.Listen(privatePort); + _ = transportUdpPortMap.Listen(privatePort); } /// /// 设置端口映射,内网端口和外网端口不一样 @@ -114,6 +124,9 @@ namespace linker.tunnel public void SetMap(int privatePort, int publicPort) { MapInfo1 = new MapInfo { PrivatePort = privatePort, PublicPort = publicPort }; + + _ = transportTcpPortMap.Listen(privatePort); + _ = transportUdpPortMap.Listen(privatePort); } } diff --git a/linker.tunnel/transport/ITunnelTransport.cs b/linker.tunnel/transport/ITunnelTransport.cs index 1df53ebe..84e19247 100644 --- a/linker.tunnel/transport/ITunnelTransport.cs +++ b/linker.tunnel/transport/ITunnelTransport.cs @@ -45,18 +45,6 @@ namespace linker.tunnel.transport /// public byte Order { get; } - /// - /// 发送连接开始信息 - /// - public Func> OnSendConnectBegin { get; set; } - /// - /// 发送连接失败消息 - /// - public Func OnSendConnectFail { get; set; } - /// - /// 发送连接成功消息 - /// - public Func OnSendConnectSuccess { get; set; } /// /// 收到连接 /// @@ -236,6 +224,10 @@ namespace linker.tunnel.transport /// public IPAddress[] LocalIps { get; set; } = Array.Empty(); /// + /// 本机网卡IP + /// + public IPAddress LocalIp { get; set; } = IPAddress.Any; + /// /// 本机与外网的距离,通过多少网关,可以通过NetworkHelper.GetRouteLevel 获取 /// public int RouteLevel { get; set; } diff --git a/linker.tunnel/transport/TransportMsQuic.cs b/linker.tunnel/transport/TransportMsQuic.cs index 5f338d95..a270dcb9 100644 --- a/linker.tunnel/transport/TransportMsQuic.cs +++ b/linker.tunnel/transport/TransportMsQuic.cs @@ -35,22 +35,20 @@ namespace linker.tunnel.transport public byte Order => 255; - public Func> OnSendConnectBegin { get; set; } = async (info) => { return await Task.FromResult(false); }; - public Func OnSendConnectFail { get; set; } = async (info) => { await Task.CompletedTask; }; - public Func OnSendConnectSuccess { get; set; } = async (info) => { await Task.CompletedTask; }; public Action OnConnected { get; set; } = (state) => { }; - private ConcurrentDictionary stateDic = new ConcurrentDictionary(); private byte[] authBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.ttl"); private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end"); private IPEndPoint quicListenEP = null; - - public TransportMsQuic() + private readonly ITunnelMessengerAdapter tunnelMessengerAdapter; + public TransportMsQuic(ITunnelMessengerAdapter tunnelMessengerAdapter) { + this.tunnelMessengerAdapter = tunnelMessengerAdapter; _ = QuicListen(); + } private X509Certificate2 certificate; @@ -71,13 +69,13 @@ namespace linker.tunnel.transport if (QuicListener.IsSupported == false) { LoggerHelper.Instance.Warning($"msquic not supported, need win11+,or linux"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return null; } if (certificate == null) { LoggerHelper.Instance.Warning($"msquic need ssl"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return null; } } @@ -85,7 +83,7 @@ namespace linker.tunnel.transport if (tunnelTransportInfo.Direction == TunnelDirection.Forward) { //正向连接 - if (await OnSendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) { return null; } @@ -93,7 +91,7 @@ namespace linker.tunnel.transport ITunnelConnection connection = await ConnectForward(tunnelTransportInfo).ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } @@ -104,19 +102,19 @@ namespace linker.tunnel.transport _ = ListenRemoteConnect(tunnelTransportInfo.BufferSize, tunnelTransportInfo1.Local.Local, quicListenEP, tunnelTransportInfo1); await Task.Delay(50).ConfigureAwait(false); BindAndTTL(tunnelTransportInfo1); - if (await OnSendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) { return null; } ITunnelConnection connection = await WaitReverse(tunnelTransportInfo1).ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return null; } /// @@ -131,13 +129,13 @@ namespace linker.tunnel.transport if (QuicListener.IsSupported == false) { LoggerHelper.Instance.Warning($"msquic not supported, need win11+,or linux"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } if (certificate == null) { LoggerHelper.Instance.Warning($"msquic need ssl"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } } @@ -154,11 +152,11 @@ namespace linker.tunnel.transport if (connection != null) { OnConnected(connection); - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); } else { - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); } } } diff --git a/linker.tunnel/transport/TransportTcpNutssb.cs b/linker.tunnel/transport/TransportTcpNutssb.cs index 8bb00438..a815eb6b 100644 --- a/linker.tunnel/transport/TransportTcpNutssb.cs +++ b/linker.tunnel/transport/TransportTcpNutssb.cs @@ -20,7 +20,7 @@ namespace linker.tunnel.transport /// B 收到通知,开始监听连接,并且以低TTL方式尝试连接A,这时候A肯定收不到 /// A 正常去连接 B,能连接成功则通道可用 /// - public sealed class TunnelTransportTcpNutssb : ITunnelTransport + public sealed class TransportTcpNutssb : ITunnelTransport { public string Name => "TcpNutssb"; public string Label => "TCP、低TTL"; @@ -36,26 +36,15 @@ namespace linker.tunnel.transport public byte Order => 2; - - /// - /// 发送开始连接消息 - /// - public Func> OnSendConnectBegin { get; set; } = async (info) => { return await Task.FromResult(false); }; - /// - /// 发送连接失败消息 - /// - public Func OnSendConnectFail { get; set; } = async (info) => { await Task.CompletedTask; }; - /// - /// 发送连接成功消息 - /// - public Func OnSendConnectSuccess { get; set; } = async (info) => { await Task.CompletedTask; }; /// /// 连接成功 /// public Action OnConnected { get; set; } = (state) => { }; - public TunnelTransportTcpNutssb() + private readonly ITunnelMessengerAdapter tunnelMessengerAdapter; + public TransportTcpNutssb(ITunnelMessengerAdapter tunnelMessengerAdapter) { + this.tunnelMessengerAdapter = tunnelMessengerAdapter; } private X509Certificate2 certificate; public void SetSSL(X509Certificate2 certificate) @@ -73,7 +62,7 @@ namespace linker.tunnel.transport if (tunnelTransportInfo.Direction == TunnelDirection.Forward) { //正向连接 - if (await OnSendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) { return null; } @@ -81,7 +70,7 @@ namespace linker.tunnel.transport ITunnelConnection connection = await ConnectForward(tunnelTransportInfo).ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } @@ -91,7 +80,7 @@ namespace linker.tunnel.transport TunnelTransportInfo tunnelTransportInfo1 = tunnelTransportInfo.ToJsonFormat().DeJson(); _ = StartListen(tunnelTransportInfo1.Local.Local, tunnelTransportInfo1); BindAndTTL(tunnelTransportInfo1); - if (await OnSendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) { return null; } @@ -99,13 +88,13 @@ namespace linker.tunnel.transport ITunnelConnection connection = await WaitReverse(tunnelTransportInfo1).ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return null; } /// @@ -117,7 +106,7 @@ namespace linker.tunnel.transport if (tunnelTransportInfo.SSL && certificate == null) { LoggerHelper.Instance.Error($"{Name}->ssl Certificate not found"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } //正向连接,也就是它要连接我,那我就监听 @@ -137,11 +126,11 @@ namespace linker.tunnel.transport if (connection != null) { OnConnected(connection); - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); } else { - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); } } } diff --git a/linker.tunnel/transport/TransportTcpP2PNAT.cs b/linker.tunnel/transport/TransportTcpP2PNAT.cs index e73b0357..7726e277 100644 --- a/linker.tunnel/transport/TransportTcpP2PNAT.cs +++ b/linker.tunnel/transport/TransportTcpP2PNAT.cs @@ -34,18 +34,6 @@ namespace linker.tunnel.transport public byte Order => 1; - /// - /// 发送开始连接消息 - /// - public Func> OnSendConnectBegin { get; set; } = async (info) => { return await Task.FromResult(false); }; - /// - /// 发送连接失败消息 - /// - public Func OnSendConnectFail { get; set; } = async (info) => { await Task.CompletedTask; }; - /// - /// 发送连接成功消息 - /// - public Func OnSendConnectSuccess { get; set; } = async (info) => { await Task.CompletedTask; }; /// /// 连接成功 /// @@ -55,8 +43,10 @@ namespace linker.tunnel.transport private byte[] authBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.ttl"); private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end"); - public TransportTcpP2PNAT() + private readonly ITunnelMessengerAdapter tunnelMessengerAdapter; + public TransportTcpP2PNAT(ITunnelMessengerAdapter tunnelMessengerAdapter) { + this.tunnelMessengerAdapter = tunnelMessengerAdapter; } private X509Certificate2 certificate; @@ -72,7 +62,7 @@ namespace linker.tunnel.transport /// public async Task ConnectAsync(TunnelTransportInfo tunnelTransportInfo) { - if (await OnSendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) { return null; } @@ -83,11 +73,11 @@ namespace linker.tunnel.transport ITunnelConnection connection = await ConnectForward(tunnelTransportInfo, TunnelMode.Client).ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return null; } /// @@ -99,18 +89,18 @@ namespace linker.tunnel.transport if (tunnelTransportInfo.SSL && certificate == null) { LoggerHelper.Instance.Error($"{Name}->ssl Certificate not found"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } ITunnelConnection connection = await ConnectForward(tunnelTransportInfo, TunnelMode.Server).ConfigureAwait(false); if (connection != null) { OnConnected(connection); - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); } else { - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); } } diff --git a/linker.tunnel/transport/TransportTcpPortMap.cs b/linker.tunnel/transport/TransportTcpPortMap.cs index 312d03c5..803e090b 100644 --- a/linker.tunnel/transport/TransportTcpPortMap.cs +++ b/linker.tunnel/transport/TransportTcpPortMap.cs @@ -36,16 +36,15 @@ namespace linker.tunnel.transport public byte Order => 4; - public Func> OnSendConnectBegin { get; set; } = async (info) => { return await Task.FromResult(false); }; - public Func OnSendConnectFail { get; set; } = async (info) => { await Task.CompletedTask; }; - public Func OnSendConnectSuccess { get; set; } = async (info) => { await Task.CompletedTask; }; public Action OnConnected { get; set; } = (state) => { }; private readonly ConcurrentDictionary> distDic = new ConcurrentDictionary>(); - - public TransportTcpPortMap() + + private readonly ITunnelMessengerAdapter tunnelMessengerAdapter; + public TransportTcpPortMap(ITunnelMessengerAdapter tunnelMessengerAdapter) { + this.tunnelMessengerAdapter = tunnelMessengerAdapter; } private X509Certificate2 certificate; public void SetSSL(X509Certificate2 certificate) @@ -147,7 +146,7 @@ namespace linker.tunnel.transport return null; } //正向连接 - if (await OnSendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) { return null; } @@ -155,7 +154,7 @@ namespace linker.tunnel.transport ITunnelConnection connection = await ConnectForward(tunnelTransportInfo).ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } @@ -171,20 +170,20 @@ namespace linker.tunnel.transport TunnelTransportInfo tunnelTransportInfo1 = tunnelTransportInfo.ToJsonFormat().DeJson(); //等待对方连接,如果连接成功,我会收到一个socket,并且创建一个连接对象,失败的话会超时,那就是null var task = WaitConnect(tunnelTransportInfo1); - if (await OnSendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) { return null; } ITunnelConnection connection = await task.ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return null; } public async Task OnBegin(TunnelTransportInfo tunnelTransportInfo) @@ -192,7 +191,7 @@ namespace linker.tunnel.transport if (tunnelTransportInfo.SSL && certificate == null) { LoggerHelper.Instance.Error($"{Name}->ssl Certificate not found"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } //正向连接,等他来连 @@ -202,7 +201,7 @@ namespace linker.tunnel.transport { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Error($"OnBegin WaitConnect 【{Name}】{tunnelTransportInfo.Local.MachineName} port mapping not configured"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } _ = WaitConnect(tunnelTransportInfo).ContinueWith((result) => @@ -217,7 +216,7 @@ namespace linker.tunnel.transport { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Error($"OnBegin ConnectForward 【{Name}】{tunnelTransportInfo.Remote.MachineName} port mapping not configured"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } @@ -225,11 +224,11 @@ namespace linker.tunnel.transport if (connection != null) { OnConnected(connection); - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); } else { - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); } } } diff --git a/linker.tunnel/transport/TransportUdp.cs b/linker.tunnel/transport/TransportUdp.cs index 9e4163ab..abda2e45 100644 --- a/linker.tunnel/transport/TransportUdp.cs +++ b/linker.tunnel/transport/TransportUdp.cs @@ -40,9 +40,6 @@ namespace linker.tunnel.transport public byte Order => 3; - public Func> OnSendConnectBegin { get; set; } = async (info) => { return await Task.FromResult(false); }; - public Func OnSendConnectFail { get; set; } = async (info) => { await Task.CompletedTask; }; - public Func OnSendConnectSuccess { get; set; } = async (info) => { await Task.CompletedTask; }; public Action OnConnected { get; set; } = (state) => { }; @@ -50,8 +47,10 @@ namespace linker.tunnel.transport private byte[] authBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.ttl"); private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end"); - public TransportUdp() + private readonly ITunnelMessengerAdapter tunnelMessengerAdapter; + public TransportUdp(ITunnelMessengerAdapter tunnelMessengerAdapter) { + this.tunnelMessengerAdapter = tunnelMessengerAdapter; } public void SetSSL(X509Certificate2 certificate) { @@ -67,7 +66,7 @@ namespace linker.tunnel.transport if (tunnelTransportInfo.Direction == TunnelDirection.Forward) { //正向连接 - if (await OnSendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) { return null; } @@ -75,7 +74,7 @@ namespace linker.tunnel.transport ITunnelConnection connection = await ConnectForward(tunnelTransportInfo).ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } @@ -86,19 +85,19 @@ namespace linker.tunnel.transport _ = BindListen(tunnelTransportInfo1.Local.Local, tunnelTransportInfo1); await Task.Delay(50).ConfigureAwait(false); BindAndTTL(tunnelTransportInfo1); - if (await OnSendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) { return null; } ITunnelConnection connection = await WaitReverse(tunnelTransportInfo1).ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return null; } @@ -125,11 +124,11 @@ namespace linker.tunnel.transport if (connection != null) { OnConnected(connection); - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); } else { - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); } } } diff --git a/linker.tunnel/transport/TransportUdpPortMap.cs b/linker.tunnel/transport/TransportUdpPortMap.cs index 05e790e3..41d34f3d 100644 --- a/linker.tunnel/transport/TransportUdpPortMap.cs +++ b/linker.tunnel/transport/TransportUdpPortMap.cs @@ -34,9 +34,6 @@ namespace linker.tunnel.transport public byte Order => 5; - public Func> OnSendConnectBegin { get; set; } = async (info) => { return await Task.FromResult(false); }; - public Func OnSendConnectFail { get; set; } = async (info) => { await Task.CompletedTask; }; - public Func OnSendConnectSuccess { get; set; } = async (info) => { await Task.CompletedTask; }; public Action OnConnected { get; set; } = (state) => { }; @@ -46,9 +43,11 @@ namespace linker.tunnel.transport private readonly ConcurrentDictionary> distDic = new ConcurrentDictionary>(); private readonly ConcurrentDictionary connectionsDic = new ConcurrentDictionary(new IPEndPointComparer()); - - public TransportUdpPortMap() + + private readonly ITunnelMessengerAdapter tunnelMessengerAdapter; + public TransportUdpPortMap(ITunnelMessengerAdapter tunnelMessengerAdapter) { + this.tunnelMessengerAdapter = tunnelMessengerAdapter; CleanTask(); } private X509Certificate2 certificate; @@ -156,7 +155,7 @@ namespace linker.tunnel.transport return null; } //正向连接 - if (await OnSendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo).ConfigureAwait(false) == false) { return null; } @@ -164,7 +163,7 @@ namespace linker.tunnel.transport ITunnelConnection connection = await ConnectForward(tunnelTransportInfo).ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } @@ -180,20 +179,20 @@ namespace linker.tunnel.transport TunnelTransportInfo tunnelTransportInfo1 = tunnelTransportInfo.ToJsonFormat().DeJson(); //等待对方连接,如果连接成功,我会收到一个socket,并且创建一个连接对象,失败的话会超时,那就是null var task = WaitConnect(tunnelTransportInfo1); - if (await OnSendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) + if (await tunnelMessengerAdapter.SendConnectBegin(tunnelTransportInfo1).ConfigureAwait(false) == false) { return null; } ITunnelConnection connection = await task.ConfigureAwait(false); if (connection != null) { - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); return connection; } } - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return null; } public async Task OnBegin(TunnelTransportInfo tunnelTransportInfo) @@ -201,7 +200,7 @@ namespace linker.tunnel.transport if (tunnelTransportInfo.SSL && certificate == null) { LoggerHelper.Instance.Error($"{Name}->ssl Certificate not found"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } //正向连接,等他来连 @@ -211,7 +210,7 @@ namespace linker.tunnel.transport { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Error($"OnBegin WaitConnect 【{Name}】{tunnelTransportInfo.Local.MachineName} port mapping not configured"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } _ = WaitConnect(tunnelTransportInfo).ContinueWith((result) => @@ -226,7 +225,7 @@ namespace linker.tunnel.transport { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Error($"OnBegin ConnectForward 【{Name}】{tunnelTransportInfo.Remote.MachineName} port mapping not configured"); - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); return; } @@ -234,11 +233,11 @@ namespace linker.tunnel.transport if (connection != null) { OnConnected(connection); - await OnSendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectSuccess(tunnelTransportInfo).ConfigureAwait(false); } else { - await OnSendConnectFail(tunnelTransportInfo).ConfigureAwait(false); + await tunnelMessengerAdapter.SendConnectFail(tunnelTransportInfo).ConfigureAwait(false); } } } diff --git a/linker.tunnel/wanport/TunnelWanPortProtocolLinker.cs b/linker.tunnel/wanport/TunnelWanPortProtocolLinker.cs index 42dafb79..0534f4a6 100644 --- a/linker.tunnel/wanport/TunnelWanPortProtocolLinker.cs +++ b/linker.tunnel/wanport/TunnelWanPortProtocolLinker.cs @@ -26,6 +26,7 @@ namespace linker.tunnel.wanport UdpClient udpClient = new UdpClient(AddressFamily.InterNetwork); udpClient.Client.ReuseBind(new IPEndPoint(localIP, 0)); udpClient.Client.WindowsUdpBug(); + udpClient.Connect(server); byte[] buffer = ArrayPool.Shared.Rent(1024); try diff --git a/linker.tunnel/wanport/TunnelWanPortTransfer.cs b/linker.tunnel/wanport/TunnelWanPortTransfer.cs index f2685adc..460fe2c3 100644 --- a/linker.tunnel/wanport/TunnelWanPortTransfer.cs +++ b/linker.tunnel/wanport/TunnelWanPortTransfer.cs @@ -1,5 +1,7 @@ using linker.libs; +using linker.libs.extends; using System.Net; +using System.Net.Sockets; namespace linker.tunnel.wanport { @@ -8,7 +10,10 @@ namespace linker.tunnel.wanport /// public sealed class TunnelWanPortTransfer { - private List tunnelWanPorts = new List(); + private List tunnelWanPorts = new List { + new TunnelWanPortProtocolLinkerUdp(), + new TunnelWanPortProtocolLinkerTcp() + }; public List Protocols => tunnelWanPorts.Select(p => p.ProtocolType).ToList(); @@ -16,17 +21,6 @@ namespace linker.tunnel.wanport { } - /// - /// 加载所有外网端口协议 - /// - /// - public void LoadTransports(List tunnelWanPorts) - { - this.tunnelWanPorts = tunnelWanPorts; - LoggerHelper.Instance.Info($"load tunnel wanport compacts:{string.Join(",", tunnelWanPorts.Select(c => c.Name))}"); - } - - /// /// 获取外网端口 /// @@ -51,5 +45,6 @@ namespace linker.tunnel.wanport } return null; } + } } diff --git a/linker/plugins/client/ClientConfigTransfer.cs b/linker/plugins/client/ClientConfigTransfer.cs index fc5dcc51..2e337f17 100644 --- a/linker/plugins/client/ClientConfigTransfer.cs +++ b/linker/plugins/client/ClientConfigTransfer.cs @@ -1,4 +1,5 @@ using linker.config; +using System.Security.Cryptography.X509Certificates; namespace linker.plugins.client { @@ -6,15 +7,21 @@ namespace linker.plugins.client { public ClientServerInfo Server => config.Data.Client.Servers[0]; public ClientGroupInfo Group => config.Data.Client.Groups[0]; - public ClientCertificateInfo SSL => config.Data.Client.SSL; public string Id => config.Data.Client.Id; public string Name => config.Data.Client.Name; + public X509Certificate2 Certificate { get; private set; } + private readonly FileConfig config; public ClientConfigTransfer(FileConfig config) { this.config = config; + string path = Path.GetFullPath(config.Data.Client.SSL.File); + if (File.Exists(path)) + { + Certificate = new X509Certificate2(path, config.Data.Client.SSL.Password, X509KeyStorageFlags.Exportable); + } } public void SetName(string newName) diff --git a/linker/plugins/messenger/MessengerStartup.cs b/linker/plugins/messenger/MessengerStartup.cs index 38a87098..49455b3f 100644 --- a/linker/plugins/messenger/MessengerStartup.cs +++ b/linker/plugins/messenger/MessengerStartup.cs @@ -48,7 +48,7 @@ namespace linker.plugins.messenger IMessengerResolver messengerResolver = serviceProvider.GetService(); ClientConfigTransfer clientConfigTransfer = serviceProvider.GetService(); - messengerResolver.Initialize(clientConfigTransfer.SSL.File, clientConfigTransfer.SSL.Password); + messengerResolver.Initialize(clientConfigTransfer.Certificate); MessengerResolverTypesLoader messengerResolverTypesLoader = serviceProvider.GetService(); diff --git a/linker/plugins/relay/RelayStartup.cs b/linker/plugins/relay/RelayStartup.cs index d96d0605..af1a34fa 100644 --- a/linker/plugins/relay/RelayStartup.cs +++ b/linker/plugins/relay/RelayStartup.cs @@ -30,7 +30,6 @@ namespace linker.plugins.relay public void AddClient(ServiceCollection serviceCollection, FileConfig config) { - serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); diff --git a/linker/plugins/relay/client/PlusRelayClientStore.cs b/linker/plugins/relay/client/PlusRelayClientStore.cs index dfefceab..2604bd33 100644 --- a/linker/plugins/relay/client/PlusRelayClientStore.cs +++ b/linker/plugins/relay/client/PlusRelayClientStore.cs @@ -1,5 +1,4 @@ -using linker.libs; -using linker.messenger; +using linker.messenger; using linker.messenger.relay.client; using linker.messenger.relay.client.transport; using linker.plugins.client; @@ -8,15 +7,11 @@ using System.Security.Cryptography.X509Certificates; namespace linker.plugins.relay.client { - public sealed class PlusRelayClientTransportSelfHost : RelayClientTransportSelfHost - { - public PlusRelayClientTransportSelfHost(IMessengerSender messengerSender,ISerializer serializer, IRelayClientStore relayClientStore) :base(messengerSender, serializer, relayClientStore) { } - } public sealed class PlusRelayClientStore : IRelayClientStore { public byte Flag => (byte)(ResolverType.Relay); - public X509Certificate2 Certificate => certificate; + public X509Certificate2 Certificate => clientConfigTransfer.Certificate; public IConnection SigninConnection => clientSignInState.Connection; @@ -32,16 +27,12 @@ namespace linker.plugins.relay.client private readonly X509Certificate2 certificate = null; private readonly RelayClientConfigTransfer relayClientConfigTransfer; private readonly ClientSignInState clientSignInState; + private readonly ClientConfigTransfer clientConfigTransfer; public PlusRelayClientStore(RelayClientConfigTransfer relayClientConfigTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer) { this.relayClientConfigTransfer = relayClientConfigTransfer; this.clientSignInState = clientSignInState; - - string path = Path.GetFullPath(clientConfigTransfer.SSL.File); - if (File.Exists(path)) - { - certificate = new X509Certificate2(path, clientConfigTransfer.SSL.Password, X509KeyStorageFlags.Exportable); - } + this.clientConfigTransfer = clientConfigTransfer; } } } diff --git a/linker/plugins/relay/client/RelayClientTypesLoader.cs b/linker/plugins/relay/client/RelayClientTypesLoader.cs index f78fa978..7bf66dd3 100644 --- a/linker/plugins/relay/client/RelayClientTypesLoader.cs +++ b/linker/plugins/relay/client/RelayClientTypesLoader.cs @@ -1,6 +1,5 @@ using linker.libs; using linker.messenger.relay.client; -using linker.messenger.relay.client.transport; using Microsoft.Extensions.DependencyInjection; namespace linker.plugins.relay.client { @@ -8,11 +7,7 @@ namespace linker.plugins.relay.client { public RelayClientTypesLoader(RelayClientTransfer relayTransfer, ServiceProvider serviceProvider) { - var types = GetSourceGeneratorTypes(); - var transports = types.Select(c => (IRelayClientTransport)serviceProvider.GetService(c)).Where(c => c != null).ToList(); - relayTransfer.LoadTransports(transports); - - LoggerHelper.Instance.Info($"load relay transport:{string.Join(",", transports.Select(c => c.GetType().Name))}"); + LoggerHelper.Instance.Info($"load relay transport:{string.Join(",", relayTransfer.Transports.Select(c => c.GetType().Name))}"); } } } diff --git a/linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs b/linker/plugins/tunnel/PlusTunnelMessengerAdapterStore.cs similarity index 62% rename from linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs rename to linker/plugins/tunnel/PlusTunnelMessengerAdapterStore.cs index 12684dd9..6a0daf9e 100644 --- a/linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs +++ b/linker/plugins/tunnel/PlusTunnelMessengerAdapterStore.cs @@ -2,19 +2,10 @@ using linker.plugins.client; using linker.messenger; using System.Security.Cryptography.X509Certificates; +using linker.tunnel; namespace linker.plugins.tunnel { - public sealed class PlusTunnelMessengerAdapter - { - public PlusTunnelMessengerAdapter(ClientSignInState clientSignInState,TunnelConfigTransfer tunnelConfigTransfer, TunnelMessengerAdapter tunnelMessengerAdapter) - { - - clientSignInState.NetworkEnabledHandle += (times) => tunnelMessengerAdapter.RefreshPortMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan); - clientSignInState.NetworkEnabledHandle += (times) => tunnelMessengerAdapter.RefreshNetwork(); - tunnelConfigTransfer.OnChanged += () => tunnelMessengerAdapter.RefreshPortMap(tunnelConfigTransfer.PortMapLan, tunnelConfigTransfer.PortMapWan); - } - } public sealed class PlusTunnelMessengerAdapterStore : ITunnelMessengerAdapterStore { public IConnection SignConnection => clientSignInState.Connection; @@ -22,22 +13,31 @@ namespace linker.plugins.tunnel public List TunnelTransports => tunnelConfigTransfer.Transports; public int RouteLevelPlus => tunnelConfigTransfer.RouteLevelPlus; + public int PortMapPrivate => tunnelConfigTransfer.PortMapLan; + public int PortMapPublic => tunnelConfigTransfer.PortMapWan; + private readonly ClientSignInState clientSignInState; private readonly ClientConfigTransfer clientConfigTransfer; private readonly TunnelConfigTransfer tunnelConfigTransfer; - public PlusTunnelMessengerAdapterStore(ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer) + public PlusTunnelMessengerAdapterStore(ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer,TunnelTransfer tunnelTransfer) { this.clientSignInState = clientSignInState; this.clientConfigTransfer = clientConfigTransfer; this.tunnelConfigTransfer = tunnelConfigTransfer; - + clientSignInState.NetworkEnabledHandle += (times) => tunnelTransfer.Refresh(); + tunnelConfigTransfer.OnChanged += () => tunnelTransfer.Refresh(); } - - public bool SetTunnelTransports(List list) + public async Task SetTunnelTransports(List list) { tunnelConfigTransfer.SetTransports(list); - return true; + return await Task.FromResult(true); } + + public async Task> GetTunnelTransports() + { + return await Task.FromResult(tunnelConfigTransfer.Transports); + } + } } diff --git a/linker/plugins/tunnel/TunnelConfigTransfer.cs b/linker/plugins/tunnel/TunnelConfigTransfer.cs index 2bde9553..430e5d41 100644 --- a/linker/plugins/tunnel/TunnelConfigTransfer.cs +++ b/linker/plugins/tunnel/TunnelConfigTransfer.cs @@ -24,31 +24,23 @@ namespace linker.plugins.tunnel public int PortMapLan => running.Data.Tunnel.PortMapLan; public int PortMapWan => running.Data.Tunnel.PortMapWan; public List Transports => config.Data.Client.Tunnel.Transports; - public X509Certificate2 Certificate { get; private set; } + public X509Certificate2 Certificate => clientConfigTransfer.Certificate; private readonly FileConfig config; private readonly RunningConfig running; private readonly ClientSignInState clientSignInState; private readonly IMessengerSender messengerSender; - private readonly TunnelUpnpTransfer upnpTransfer; private readonly ClientConfigTransfer clientConfigTransfer; public Action OnChanged { get; set; } = () => { }; - public TunnelConfigTransfer(FileConfig config, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelUpnpTransfer upnpTransfer, ClientConfigTransfer clientConfigTransfer) + public TunnelConfigTransfer(FileConfig config, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer) { this.config = config; this.running = running; this.clientSignInState = clientSignInState; this.messengerSender = messengerSender; - this.upnpTransfer = upnpTransfer; this.clientConfigTransfer = clientConfigTransfer; - - string path = Path.GetFullPath(clientConfigTransfer.SSL.File); - if (File.Exists(path)) - { - Certificate = new X509Certificate2(path, clientConfigTransfer.SSL.Password, X509KeyStorageFlags.Exportable); - } clientSignInState.NetworkEnabledHandle += (times) => { TimerHelper.Async(RefreshRouteLevel); @@ -77,11 +69,11 @@ namespace linker.plugins.tunnel /// 修改自己的网关层级信息 /// /// - public void OnLocalRouteLevel(TunnelTransportRouteLevelInfo tunnelTransportFileConfigInfo) + public void OnLocalRouteLevel(TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo) { - running.Data.Tunnel.RouteLevelPlus = tunnelTransportFileConfigInfo.RouteLevelPlus; - running.Data.Tunnel.PortMapWan = tunnelTransportFileConfigInfo.PortMapWan; - running.Data.Tunnel.PortMapLan = tunnelTransportFileConfigInfo.PortMapLan; + running.Data.Tunnel.RouteLevelPlus = tunnelTransportRouteLevelInfo.RouteLevelPlus; + running.Data.Tunnel.PortMapWan = tunnelTransportRouteLevelInfo.PortMapWan; + running.Data.Tunnel.PortMapLan = tunnelTransportRouteLevelInfo.PortMapLan; running.Data.Update(); OnChanged(); } diff --git a/linker/plugins/tunnel/TunnelStartup.cs b/linker/plugins/tunnel/TunnelStartup.cs index 73c588a2..741f7d98 100644 --- a/linker/plugins/tunnel/TunnelStartup.cs +++ b/linker/plugins/tunnel/TunnelStartup.cs @@ -1,7 +1,6 @@ using linker.config; using linker.startup; using linker.tunnel; -using linker.libs; using MemoryPack; using Microsoft.Extensions.DependencyInjection; using linker.tunnel.wanport; @@ -26,13 +25,14 @@ namespace linker.plugins.tunnel public void AddClient(ServiceCollection serviceCollection, FileConfig config) { - - //外网端口协议 - serviceCollection.AddSingleton(); //打洞协议 serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + //命令接口 + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); //序列化扩展 MemoryPackFormatterProvider.Register(new TunnelTransportWanPortInfoFormatter()); @@ -41,18 +41,10 @@ namespace linker.plugins.tunnel MemoryPackFormatterProvider.Register(new TunnelWanPortProtocolInfoFormatter()); - //命令接口 - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); - //管理接口 serviceCollection.AddSingleton(); } @@ -77,7 +69,6 @@ namespace linker.plugins.tunnel TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService(); ITunnelMessengerAdapterStore tunnelAdapter = serviceProvider.GetService(); - PlusTunnelMessengerAdapter plusTunnelMessengerAdapter = serviceProvider.GetService(); } public void UseServer(ServiceProvider serviceProvider, FileConfig config) diff --git a/linker/plugins/tuntap/ExcludeIP.cs b/linker/plugins/tuntap/ExcludeIP.cs index 1a89a50f..2d2e483d 100644 --- a/linker/plugins/tuntap/ExcludeIP.cs +++ b/linker/plugins/tuntap/ExcludeIP.cs @@ -11,10 +11,10 @@ namespace linker.plugins.tuntap { this.tuntapConfigTransfer = tuntapConfigTransfer; } - public ExcludeIPItem[] Get() + public List Get() { //网卡IP不参与打洞 - return new ExcludeIPItem[] { new ExcludeIPItem { IPAddress = tuntapConfigTransfer.IP, Mask = 32 } }; + return new List { tuntapConfigTransfer.IP }; } } diff --git a/version.txt b/version.txt index 8cd1d041..aca36cec 100644 --- a/version.txt +++ b/version.txt @@ -1,5 +1,5 @@ v1.6.4 -2024-12-21 18:36:44 +2024-12-22 16:19:16 1. 优化UI,显示网络计算IP数 2. 修复内网穿透不停止直接删除导致的无法再次添加的问题 3. 优化网卡的端口转发