public ClientJsonData(DnmpNode client, MainClient mainClient)
 {
     Id                = client.Id;
     ParentId          = client.ParentId;
     PublicIpPort      = client.EndPoint.ToString();
     InternalIp        = mainClient.TapMessageInterface.GetIpFromId(client.Id).ToString();
     InternalDomain    = DomainNameUtil.GetDomain(client.GetDnmpNodeData().DomainName, mainClient.Config.TapConfig.DnsFormat);
     Flags             = client.Flags;
     BytesReceived     = client.BytesReceived;
     BytesSent         = client.BytesSent;
     DataBytesReceived = client.DataBytesReceived;
     DataBytesSent     = client.DataBytesSent;
     Ping              = client.Flags.HasFlag(ClientFlags.SymmetricKeyExchangeDone)
         ? client.DirectPing
         : client.RedirectPing.Ping;
 }
Example #2
0
        public static IPAddress[] GetMailExchangeServer(string domain)
        {
            IPHostEntry entry = DomainNameUtil.GetIPHostEntryForMailExchange(domain);

            if (entry.AddressList.Length > 0)
            {
                return(entry.AddressList);
            }
            else if (entry.Aliases.Length > 0)
            {
                return(System.Net.Dns.GetHostAddresses(entry.Aliases[0]));
            }
            else
            {
                return(null);
            }
        }
        public async Task StartAsyncReadData(CancellationToken cancellationToken)
        {
            logger.Info("TAP started");
            while (!cancellationToken.IsCancellationRequested)
            {
                try
                {
                    var buffer = new byte[4096];

                    var readBytes = await tapStream.ReadAsync(buffer, 0, 4096, cancellationToken);

                    if (readBytes <= 0)
                    {
                        continue;
                    }
                    var p = EthernetPacket.Parse(buffer.Take(readBytes).ToArray());
                    if (p.DestinationAddress.GetAddressBytes().Take(3).SequenceEqual(new byte[] { 0x01, 0x00, 0x5E }))
                    {
                        continue;
                    }
                    // ReSharper disable once SwitchStatementMissingSomeCases
                    switch (p.Type)
                    {
                    case EthernetPacket.PacketType.IpV4:
                    {
                        var intId = GetIdFromPhysicalAddress(p.DestinationAddress);
                        if (intId >= 0)
                        {
                            if (HostExists((ushort)intId) || intId == selfId)
                            {
                                await Send(p.Payload, (ushort)intId);
                            }
                            continue;
                        }

                        var ipPacket = (IPv4Packet)p.PayloadPacket;

                        switch (intId)
                        {
                        case -ipMacPoolShift:
                        {
                            if (ipPacket.PayloadPacket is UdpPacket udpPacket &&
                                udpPacket.PayloadPacket is DhcpPacket dhcpPacket)
                            {
                                if (dhcpPacket.Op != 1)
                                {
                                    continue;
                                }

                                var dhcpMessageType =
                                    dhcpPacket.Options.ContainsKey(53) &&
                                    dhcpPacket.Options[53].Length > 0
                                                        ? dhcpPacket.Options[53][0]
                                                        : -1;
                                DhcpPacket answerDhcpPacket;

                                switch (dhcpMessageType)
                                {
                                case 1:                     // DHCPDISCOVER
                                    answerDhcpPacket = new DhcpPacket
                                    {
                                        Xid                   = dhcpPacket.Xid,
                                        YourIpAddress         = GetIpFromId(selfId),
                                        ServerIpAddress       = GetIpFromId(-1),
                                        ClientHardwareAddress = dhcpPacket.ClientHardwareAddress,
                                        Options               =
                                            new Dictionary <byte, byte[]>
                                        {
                                            { 53, new byte[] { 2 } },
                                            { 1, new byte[] { 255, 255, 0, 0 } },
                                            {
                                                51,
                                                BitConverter.GetBytes(30 * 60).Reverse().ToArray()
                                            },
                                            { 54, GetIpFromId(-1).GetAddressBytes() },
                                            { 6, GetIpFromId(-1).GetAddressBytes() }
                                        }
                                    };
                                    break;

                                case 3:                     // DHCPREQUEST
                                    answerDhcpPacket = new DhcpPacket
                                    {
                                        Xid                   = dhcpPacket.Xid,
                                        YourIpAddress         = GetIpFromId(selfId),
                                        ServerIpAddress       = GetIpFromId(-1),
                                        ClientHardwareAddress = dhcpPacket.ClientHardwareAddress,
                                        Options               =
                                            new Dictionary <byte, byte[]>
                                        {
                                            { 53, new byte[] { 5 } },
                                            { 1, new byte[] { 255, 255, 0, 0 } },
                                            {
                                                51,
                                                BitConverter.GetBytes(30 * 60).Reverse().ToArray()
                                            },
                                            { 54, GetIpFromId(-1).GetAddressBytes() },
                                            { 6, GetIpFromId(-1).GetAddressBytes() }
                                        }
                                    };
                                    break;

                                default:
                                    continue;
                                }

                                var answerIpV4Packet = new IPv4Packet(GetIpFromId(-1),
                                                                      IPAddress.Broadcast);
                                answerIpV4Packet.SetPayloadPacket(new UdpPacket(67, 68,
                                                                                answerDhcpPacket, answerIpV4Packet));
                                var answerEthernetPacket = new EthernetPacket(
                                    GetPhysicalAddressFromId(-1),
                                    p.SourceAddress, answerIpV4Packet, EthernetPacket.PacketType.IpV4);
                                var answerData = answerEthernetPacket.ToBytes();
                                await tapStream.WriteAsync(answerData, 0, answerData.Length,
                                                           cancellationToken);

                                continue;
                            }

                            await Broadcast(p.Payload);
                        }
                            continue;

                        case -1:
                        {
                            if (ipPacket.PayloadPacket is UdpPacket udpPacket &&
                                udpPacket.PayloadPacket is DnsPacket dnsPacket)
                            {
                                if (dnsPacket.Queries.Count == 1 && dnsPacket.Queries[0].Type == 1 &&
                                    dnsPacket.Queries[0].Class == 1 && DomainNameUtil.GetName(string.Join(".", dnsPacket.Queries[0].Labels), dnsFormat) != null)
                                {
                                    var name = DomainNameUtil.GetName(string.Join(".", dnsPacket.Queries[0].Labels), dnsFormat);
                                    if (string.IsNullOrEmpty(name))
                                    {
                                        continue;
                                    }
                                    if (name == selfName)
                                    {
                                        await DnsReply(dnsPacket.TransactionId, dnsPacket.Queries[0].Labels, selfId, udpPacket.SourcePort);
                                    }
                                    else
                                    {
                                        var clientId = GetNodes().FirstOrDefault(x =>
                                                                                 x.GetDnmpNodeData().DomainName == name)?.Id;
                                        if (clientId != null)
                                        {
                                            await DnsReply(dnsPacket.TransactionId, dnsPacket.Queries[0].Labels, clientId.Value, udpPacket.SourcePort);
                                        }
                                    }
                                }
                            }
                        }
                            continue;
                        }
                    }
                    break;

                    case EthernetPacket.PacketType.Arp:
                    {
                        var arpPacket = (ArpPacket)p.PayloadPacket;
                        var targetIp  = new IPAddress(arpPacket.TargetProtocolAddress);
                        if (!targetIp.GetAddressBytes().Take(2).SequenceEqual(tapIpPrefix))
                        {
                            continue;
                        }
                        var targetId = GetIdFromPhysicalAddress(GetPhysicalAddressFromIp(targetIp));
                        if (targetId == -ipMacPoolShift)
                        {
                            continue;
                        }
                        if (!HostExists((ushort)targetId) && targetId != -1)
                        {
                            break;
                        }
                        var answerArpPacket = new ArpPacket
                        {
                            TargetHardwareAddress = arpPacket.SenderHardwareAddress,
                            TargetProtocolAddress = arpPacket.SenderProtocolAddress,
                            SenderHardwareAddress = GetPhysicalAddressFromIp(targetIp).GetAddressBytes(),
                            SenderProtocolAddress = arpPacket.TargetProtocolAddress,
                            Operation             = ArpPacket.OperationType.Response,
                            HardwareType          = 0x0001,
                            ProtocolType          = 0x0800
                        };
                        var answerEthernetPacket = new EthernetPacket(GetPhysicalAddressFromIp(targetIp),
                                                                      new PhysicalAddress(arpPacket.SenderHardwareAddress), answerArpPacket,
                                                                      EthernetPacket.PacketType.Arp);
                        var answerData = answerEthernetPacket.ToBytes();
                        await tapStream.WriteAsync(answerData, 0, answerData.Length, cancellationToken);
                    }
                    break;

                    default:
                        continue;
                    }
                }
                catch (TaskCanceledException)
                {
                    return;
                }
                catch (Exception e)
                {
                    logger.Error(e, "Exception in processing packet from TAP-Windows");
                }
            }
        }