У меня есть 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.
Bind
локально,Connect
удаленно. Ваше использование bind / connect кажется нормальным. Вы читаете vpnaddress, но никогда не используете его ни для чего? - person N.D.C.   schedule 11.06.2018sender.Ttl = 16;
выглядит немного строгим; что произойдет, если вы увеличите его, например к255
? Я имею в виду, похоже, что у вас проблемы с таинственным исчезновением пакетов, и задача.Ttl
состоит в том, чтобы указать, сколько переходов может занять пакет, прежде чем его можно будет просто отбросить. 16 переходов - это необычно мало (по крайней мере, в соответствии с приведенной в Википедии рекомендацией начинать со значения по умолчанию 64), и, предположительно, использование VPN добавляет больше переходов в путь. - person Nat   schedule 19.06.2018sender.Connect(sendAddress, outPort);
, должен быть адресом назначения VPN. Не уверен, что ваш172.27.225.77
адрес отправителя или адрес получателя - person JPelletier   schedule 20.06.2018Connect
(например, удалите эту строку и измените функциюsend
, чтобы использовать IP и порт напрямую). Я некоторое время обдумывал это и думаю, что это первое, что я бы попробовал. - person N.D.C.   schedule 21.06.2018