你可以可以直接nuget使用 linker.tun
1、P/Invoke 一些api
C#
internal static class LinuxAPI
{
    [DllImport("libc.so.6", EntryPoint = "ioctl", SetLastError = true)]
    internal static extern int Ioctl(SafeHandle device, uint request, byte[] dat);
    internal static int Ioctl(string name, SafeHandle device, uint request)
    {
        byte[] ifreqFREG0 = Encoding.ASCII.GetBytes(name);
        Array.Resize(ref ifreqFREG0, 16);
        byte[] ifreqFREG1 = { 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        byte[] ifreq = BytesPlusBytes(ifreqFREG0, ifreqFREG1);
        return LinuxAPI.Ioctl(device, request, ifreq);
    }
    internal static byte[] BytesPlusBytes(byte[] A, byte[] B)
    {
        byte[] ret = new byte[A.Length + B.Length - 1 + 1];
        int k = 0;
        for (var i = 0; i <= A.Length - 1; i++)
            ret[i] = A[i];
        k = A.Length;
        for (var i = k; i <= ret.Length - 1; i++)
            ret[i] = B[i - k];
        return ret;
    }
}2、创建tun网卡
C#
//创建
ip tuntap add mode tun dev linker
//设置IP
ip addr add 10.18.18.2/24 dev linker
//启用
ip link set dev linker up
//设置MTU
ip link set dev linker mtu 14003、打开网卡
C#
 SafeFileHandle safeFileHandle = File.OpenHandle("/dev/net/tun", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite, FileOptions.Asynchronous);
 if (safeFileHandle.IsInvalid)
 {
     safeFileHandle?.Dispose();
     return false;
 }
 int ioctl = LinuxAPI.Ioctl("linker", safeFileHandle, 1074025674);
 if (ioctl != 0)
 {
     safeFileHandle?.Dispose();
     return false;
 }
 
 FileStream fs = new FileStream(safeFileHandle, FileAccess.ReadWrite, 1500);4、从网卡读取数据
C#
byte[] buffer = new byte[2 * 1024];
int length = fs.Read(buffer.AsSpan());5、将数据写入网卡
C#
					 ReadOnlyMemory<byte> buffer;//你的数据包
 
 fs.Write(buffer.Span);
 fs.Flush();