[英]C# UDP client reading multicast IP (local interface), and sending unicast UDP to VPN
I have a VPN client that works fine for sending unicast UDP packets over the VPN pipe but does not do that for multicast IP (UDP) packets (OpenVPN). 我有一个VPN客户端,可以通过VPN管道发送单播UDP数据包,但不支持多播IP(UDP)数据包(OpenVPN)。 So I thought I could write this little shim that would take the IP (port 3000) multicast and send them over the VPN as unicast.
所以我想我可以编写这个带有IP(端口3000)多播的小垫片,并通过VPN作为单播发送它们。
I see the multicast packets arriving, but I see nothing arriving on the VPN side (WireShark is not helping, since unlike IpConfig /all) it does not see the VPN interface.). 我看到组播数据包到了,但我看不到任何东西到达VPN端(WireShark没有帮助,因为不像IpConfig / all)它没有看到VPN接口。)。
I think my issue might be I am not really clear on the difference between BIND and CONNECT, and which interface (vpn or local) I should be binding the UDPClient to. 我认为我的问题可能是我不清楚BIND和CONNECT之间的区别,以及我应该将UDPClient绑定到哪个接口(vpn或local)。
The command line is: 命令行是:
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();
}
}
}
The ipconfig /all reads as follows (when OpenVPN client is running) 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:\>
Added sender.Ttl = 64; 添加了sender.Ttl = 64; sender.AllowNatTraversal(true);
sender.AllowNatTraversal(真); also ran the RawCap on the client with the VPN interface selected.
还在客户端上运行了RawCap并选择了VPN接口。 The Dump of packets does not show of the multicast packets that I am converting to unicast and trying to send to 129.168.0.15 coming to that interface.
数据包转储未显示我正在转换为单播并尝试发送到129.168.0.15的多播数据包到达该接口。
just some other stuff. 只是其他一些东西。 (see wireshark display of the .pccap file from RawCap.
(请参阅来自RawCap的.pccap文件的wireshark显示。
I suspect you don't have anything listening to the other end of your unicast. 我怀疑你没有任何东西听你单播的另一端。
Unicast is the term used to describe communication where a piece of information is sent from one point to another point.
单播是用于描述通信的术语,其中一条信息从一个点发送到另一个点。 In this case there is just one sender, and one receiver .
在这种情况下,只有一个发送者和一个接收者 。
I added an additional listener to listen to the send endpoint and everything works and will print out the sent message. 我添加了一个额外的监听器来监听发送端点,一切正常,并将打印出已发送的消息。
Additional listener run on the computer with the ip: 198.168.0.15 使用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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.