Клиент C # UDP, читающий многоадресный IP (локальный интерфейс) и отправляющий одноадресный UDP в VPN

У меня есть VPN-клиент, который отлично работает для отправки одноадресных UDP-пакетов по VPN-каналу, но не делает этого для многоадресных IP-пакетов (UDP) (OpenVPN). Итак, я подумал, что могу написать эту небольшую прокладку, которая будет принимать многоадресную рассылку IP (порт 3000) и отправлять их через VPN как одноадресную.

Я вижу приходящие многоадресные пакеты, но ничего не вижу на стороне VPN (WireShark не помогает, поскольку в отличие от IpConfig / all) он не видит интерфейс VPN.).

Я думаю, что моя проблема может заключаться в том, что я не совсем понимаю разницу между BIND и CONNECT, и к какому интерфейсу (vpn или локальному) я должен привязать UDPClient.

Командная строка:

239.0.0.0 198.168.0.15 10.4.30.239 172.27.225.77
arg[0] = multicast from address
arg[1] = unicast to address
arg[2] = local physical ethernet assigned address
arg[3] = virtual address of computer on VPN network (client)

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;

namespace MUTunnel
{
    public class EchoBot
    {
        protected UdpClient sender;
        protected UdpClient listener;

        protected const int listenPort = 3000;
        protected const int outPort = 3000;

        protected IPEndPoint inPoint;
        protected IPEndPoint outPoint;
        protected IPAddress listenAddress;
        protected IPAddress sendAddress;
        protected IPAddress localAddress;
        protected IPAddress vpnAddress;

        public EchoBot(string from, string to, string local, string vpn)
        {
            bool parsed = IPAddress.TryParse(from, out listenAddress);
            parsed = IPAddress.TryParse(to, out sendAddress) && parsed;
            parsed = IPAddress.TryParse(local, out localAddress) && parsed;
            parsed = IPAddress.TryParse(vpn, out vpnAddress) && parsed;
            if (!parsed)
            {
                System.Console.WriteLine("Usage: MUTunnel <source multicast IP> <dest unicast IP> <local host IP address> <vpn IP address>");
                Environment.Exit(1);
            }
            listener = new UdpClient();
            listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            inPoint = new IPEndPoint(localAddress, listenPort);
            listener.Client.Bind(inPoint);
            listener.JoinMulticastGroup(listenAddress);

            sender = new UdpClient();
            sender.Ttl = 64;
            sender.AllowNatTraversal(true);
            //outPoint = new IPEndPoint(sendAddress, outPort);
            sender.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            sender.Connect(sendAddress, outPort);
        }

        public void send(byte[] bytes)
        {
            sender.Send(bytes, bytes.Length);
        }
        public void loop()
        {
            bool done = false;
            try
            {
                while (!done)
                {
                    byte[] bytes = listener.Receive(ref inPoint);
                    Console.WriteLine("Received Multicast from  {0} : length {1}\n", listenAddress.ToString(), bytes.Length);
                    this.send(bytes);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            finally
            {
                listener.Close();
                sender.Close();
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 4)
            {
                System.Console.WriteLine("Usage: MUTunnel <source multicast IP> <dest unicast IP> <local host IP address> <vpn IP address>");
                Environment.Exit(1);
            }
            EchoBot echoBot = new EchoBot(args[0], args[1], args[2], args[3]);
            Console.WriteLine("MUTunnel Waiting for messsages...");
            echoBot.loop();
        }
    }
}

Ipconfig / all читается следующим образом (когда запущен клиент OpenVPN)

P:\>ipconfig /all

Windows IP Configuration

   Host Name . . . . . . . . . . . . : YSG4206
   Primary Dns Suffix  . . . . . . . : draper.com
   Node Type . . . . . . . . . . . . : Hybrid
   IP Routing Enabled. . . . . . . . : No
   WINS Proxy Enabled. . . . . . . . : No
   DNS Suffix Search List. . . . . . : draper.com

Ethernet adapter Ethernet 3:

   Connection-specific DNS Suffix  . : draper.com
   Description . . . . . . . . . . . : Killer E2200 Gigabit Ethernet Controller
   Physical Address. . . . . . . . . : F8-B1-56-FF-8B-36
   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   IPv4 Address. . . . . . . . . . . : 10.4.30.239(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.254.0
   Lease Obtained. . . . . . . . . . : Monday, June 18, 2018 5:28:03 PM
   Lease Expires . . . . . . . . . . : Thursday, June 21, 2018 8:46:50 PM
   Default Gateway . . . . . . . . . : 10.4.31.254
   DHCP Server . . . . . . . . . . . : 140.102.100.111
   DNS Servers . . . . . . . . . . . : 10.10.20.11
                                       10.10.20.12
   NetBIOS over Tcpip. . . . . . . . : Enabled

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : TAP Adapter OAS NDIS 6.0
   Physical Address. . . . . . . . . : 00-FF-91-E7-8A-38
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   IPv4 Address. . . . . . . . . . . : 172.27.225.77(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :
   NetBIOS over Tcpip. . . . . . . . : Enabled

P:\>

Обновлять

Добавлен sender.Ttl = 64; sender.AllowNatTraversal (истина); также запустил RawCap на клиенте с выбранным интерфейсом VPN. Дамп пакетов не показывает многоадресные пакеты, которые я конвертирую в одноадресную рассылку и пытаюсь отправить на 129.168.0.15, приходящие на этот интерфейс.

просто еще кое-что. (см. отображение файла .pccap с помощью wirehark из RawCap.

введите описание изображения здесь


person Dr.YSG    schedule 11.06.2018    source источник
comment
Bind локально, Connect удаленно. Ваше использование bind / connect кажется нормальным. Вы читаете vpnaddress, но никогда не используете его ни для чего?   -  person N.D.C.    schedule 11.06.2018
comment
@NickDechiara, да. Я попытался привязать его к локальному адресу VPN (как сообщает IPConifg), но это вызывает ошибку. Я видел, как другие просто подключали UDP-клиент, и, похоже, это работало для них. Но у меня есть два интерфейса.   -  person Dr.YSG    schedule 11.06.2018
comment
Вы действительно видите свое сообщение "Получено многоадресное сообщение от ..."? В Windows, я думаю, вы можете привязать слушателя только к любому адресу (0.0.0.0) и получить многоадресную рассылку, любую другую ОС, которую вы можете выбрать вместо привязки с многоадресным адресом, чтобы избежать несвязанного трафика.   -  person lossleader    schedule 17.06.2018
comment
да. Я вижу сообщение "Получено многоадресное сообщение от ...". Да, содержание вполне ожидаемо. Wireshark не видит интерфейс VPN на клиенте, поэтому я не могу сказать, уходит ли одноадресная передача UDP. Я действительно вижу, что на VPN-сервер ничего не приходит (по крайней мере, tcpdump его не видит).   -  person Dr.YSG    schedule 18.06.2018
comment
sender.Ttl = 16; выглядит немного строгим; что произойдет, если вы увеличите его, например к 255? Я имею в виду, похоже, что у вас проблемы с таинственным исчезновением пакетов, и задача .Ttl состоит в том, чтобы указать, сколько переходов может занять пакет, прежде чем его можно будет просто отбросить. 16 переходов - это необычно мало (по крайней мере, в соответствии с приведенной в Википедии рекомендацией начинать со значения по умолчанию 64), и, предположительно, использование VPN добавляет больше переходов в путь.   -  person Nat    schedule 19.06.2018
comment
Я всего в двух прыжках.   -  person Dr.YSG    schedule 19.06.2018
comment
Посмотрите на использование [RawCap] [1] для захвата трафика VPN. Он захватывает на другом уровне в сетевом стеке и захватывает трафик localhost. Это также должно позволить вам захватывать трафик VPN. [1]: netresec.com/?page=RawCap   -  person John Taylor    schedule 20.06.2018
comment
Адрес, используемый в sender.Connect(sendAddress, outPort);, должен быть адресом назначения VPN. Не уверен, что ваш 172.27.225.77 адрес отправителя или адрес получателя   -  person JPelletier    schedule 20.06.2018
comment
Согласно документации UDCClient (): протокол UDP не требует установления соединения, метод Connect не блокируется. Вы уверены, что подключаетесь?   -  person Jake1164    schedule 20.06.2018
comment
Как показано выше, физический интерфейс - это сеть 10.4, а 172.27.225.77 - это шлюз openvpn. OpenVPN передает данные TCP без проблем.   -  person Dr.YSG    schedule 20.06.2018
comment
Да udp без установления соединения. Но api просит подключить (). Ошибок нет, но нет хорошего способа узнать, сделал ли он что-нибудь.   -  person Dr.YSG    schedule 20.06.2018
comment
Вы пробовали протестировать локальную сеть, чтобы убедиться, что одноадресное обновление работает, прежде чем переносить его через VPN?   -  person Jake1164    schedule 20.06.2018
comment
@ Dr.YSG здесь снимок в темноте, но попробуйте написать это без использования Connect (например, удалите эту строку и измените функцию send, чтобы использовать IP и порт напрямую). Я некоторое время обдумывал это и думаю, что это первое, что я бы попробовал.   -  person N.D.C.    schedule 21.06.2018
comment
Если я попытаюсь выполнить .send (), когда я не подключаюсь, я получаю сообщение об ошибке: + e {Операция не разрешена для неподключенных сокетов.} System.Exception {System.InvalidOperationException}   -  person Dr.YSG    schedule 21.06.2018
comment
Если вы закомментируете connect (), вам нужно будет использовать перегруженный метод Send (Byte [], Int32, IPEndPoint). msdn.microsoft.com/en-us/library /82dxxas0(v=vs.110).aspx   -  person Jake1164    schedule 21.06.2018
comment
Хорошо, теперь я могу отправлять сообщения без подключения. Я вижу, что теперь многоадресная рассылка сообщает о двух приемах (раньше получалось одно каждые 5 секунд, теперь - 2 при 5-секундном такте). RawCAP все еще говорит, что ничего не выходит. И другой конец VPN тоже ничего не показывает. (tcpdump eni любой udp)   -  person Dr.YSG    schedule 21.06.2018


Ответы (1)


Я подозреваю, что вы ничего не слушаете на другом конце вашей одноадресной передачи.

Одноадресная передача - это термин, используемый для описания связи, при которой часть информации отправляется из одной точки в другую. В этом случае есть только один отправитель, и один получатель.

Я добавил дополнительный слушатель для прослушивания конечной точки отправки, и все работает и распечатает отправленное сообщение.

Дополнительный слушатель запускается на компьютере с ip: 198.168.0.15

IPAddress localAddress = IPAddress.Parse("198.168.0.15");
const int listenPort = 3000;

var listener = new UdpClient();
listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
var inPoint = new IPEndPoint(localAddress, listenPort);

listener.Client.Bind(inPoint);

while (true)
{
    byte[] bytes = listener.Receive(ref inPoint);
    Console.WriteLine("Received Message from  {0} : message {1}\n", localAddress.ToString(),Encoding.ASCII.GetString(bytes));
    Thread.Sleep(1000);
}
person Jake1164    schedule 20.06.2018
comment
У меня есть слушатель. Я также должен видеть, что пакеты прибывают к цели через дамп TCP (поскольку это компьютер Centos). Слушатель работает для всего трафика, исходящего из частного облака. Что я пытаюсь сделать, так это заставить его работать для вещей, поступающих через VPN. - person Dr.YSG; 20.06.2018
comment
Можете ли вы пропинговать этот компьютер с CentOS через vpn? Можете ли вы подключиться к этому компьютеру через vpn по этому IP-адресу? - person Jake1164; 21.06.2018
comment
Вы также пробовали включить sender.AllowNatTraversal = true; msdn.microsoft .com / ru-ru / library / - person Jake1164; 21.06.2018
comment
Вы уверены, что это не проблема конфигурации сети / VPN? serverfault.com/questions/608517/ - person Jake1164; 21.06.2018
comment
Не уверен, что это не ошибка конфигурации VPN. Но посмотрите мои последние дополнения к заметке (я добавил sender.AllowNatTransversal. А также результаты RawCAP - person Dr.YSG; 21.06.2018
comment
Можете ли вы выполнить ping или ssh на этой машине centos (через vpn)? - person Jake1164; 21.06.2018
comment
Да, я могу пинговать, также OpenVPN отлично работает для подключения ко всем машинам за пределами сервера OpenVPN (AS), которые находятся в этой подсети внутри облака (по крайней мере, для TCP и одноадресного UDP, которые я использую из программ, отличных от показанный выше, который пытается отправить многоадресную рассылку). - person Dr.YSG; 21.06.2018