This commit is contained in:
snltty
2024-08-04 11:21:19 +08:00
parent 067569ff7c
commit 1f90049809
8 changed files with 110 additions and 18 deletions

View File

@@ -2,50 +2,144 @@
namespace linker.tun namespace linker.tun
{ {
/// <summary>
/// 设备接口
/// </summary>
public interface ILinkerTunDevice public interface ILinkerTunDevice
{ {
/// <summary>
/// 设备名
/// </summary>
public string Name { get; } public string Name { get; }
/// <summary>
/// 是否正在运行
/// </summary>
public bool Running { get; } public bool Running { get; }
/// <summary>
/// 启动
/// </summary>
/// <param name="address"></param>
/// <param name="gateway"></param>
/// <param name="prefixLength"></param>
/// <param name="error"></param>
/// <returns></returns>
public bool SetUp(IPAddress address, IPAddress gateway, byte prefixLength, out string error); public bool SetUp(IPAddress address, IPAddress gateway, byte prefixLength, out string error);
/// <summary>
/// 关闭
/// </summary>
public void Shutdown(); public void Shutdown();
/// <summary>
/// 设置MTU
/// </summary>
/// <param name="value"></param>
public void SetMtu(int value); public void SetMtu(int value);
/// <summary>
/// 设置NAT转发
/// </summary>
public void SetNat(); public void SetNat();
/// <summary>
/// 移除NAT转发
/// </summary>
public void RemoveNat(); public void RemoveNat();
/// <summary>
/// 添加路由
/// </summary>
/// <param name="ips"></param>
/// <param name="ip"></param>
public void AddRoute(LinkerTunDeviceRouteItem[] ips, IPAddress ip); public void AddRoute(LinkerTunDeviceRouteItem[] ips, IPAddress ip);
/// <summary>
/// 删除路由
/// </summary>
/// <param name="ip"></param>
public void DelRoute(LinkerTunDeviceRouteItem[] ip); public void DelRoute(LinkerTunDeviceRouteItem[] ip);
/// <summary>
/// 读取数据包
/// </summary>
/// <returns></returns>
public ReadOnlyMemory<byte> Read(); public ReadOnlyMemory<byte> Read();
/// <summary>
/// 写入数据包
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
public bool Write(ReadOnlyMemory<byte> buffer); public bool Write(ReadOnlyMemory<byte> buffer);
} }
/// <summary>
/// 网卡读取数据回调
/// </summary>
public interface ILinkerTunDeviceCallback public interface ILinkerTunDeviceCallback
{ {
/// <summary>
/// 回调
/// </summary>
/// <param name="packet"></param>
/// <returns></returns>
public Task Callback(LinkerTunDevicPacket packet); public Task Callback(LinkerTunDevicPacket packet);
} }
/// <summary>
/// 数据包
/// </summary>
public struct LinkerTunDevicPacket public struct LinkerTunDevicPacket
{ {
/// <summary>
/// 协议版本4或者6
/// </summary>
public byte Version; public byte Version;
/// <summary>
/// 源IP
/// </summary>
public ReadOnlyMemory<byte> SourceIPAddress; public ReadOnlyMemory<byte> SourceIPAddress;
/// <summary>
/// 目标IP
/// </summary>
public ReadOnlyMemory<byte> DistIPAddress; public ReadOnlyMemory<byte> DistIPAddress;
/// <summary>
/// 带4字节头的包
/// </summary>
public ReadOnlyMemory<byte> Packet; public ReadOnlyMemory<byte> Packet;
/// <summary>
/// 原始IP包
/// </summary>
public ReadOnlyMemory<byte> IPPacket; public ReadOnlyMemory<byte> IPPacket;
} }
/// <summary>
/// 添加路由项
/// </summary>
public sealed class LinkerTunDeviceRouteItem public sealed class LinkerTunDeviceRouteItem
{ {
/// <summary>
/// IP
/// </summary>
public IPAddress Address { get; set; } public IPAddress Address { get; set; }
public byte Mask { get; set; } /// <summary>
/// 掩码
/// </summary>
public byte PrefixLength { get; set; }
} }
/// <summary>
/// 设备状态
/// </summary>
public enum LinkerTunDeviceStatus public enum LinkerTunDeviceStatus
{ {
/// <summary>
/// 无
/// </summary>
Normal = 0, Normal = 0,
Starting = 1, /// <summary>
/// 正在操作
/// </summary>
Operating = 1,
/// <summary>
/// 运行中
/// </summary>
Running = 2 Running = 2
} }
} }

View File

@@ -150,10 +150,10 @@ namespace linker.tun
{ {
string[] commands = ips.Select(item => string[] commands = ips.Select(item =>
{ {
uint maskValue = NetworkHelper.MaskValue(item.Mask); uint maskValue = NetworkHelper.MaskValue(item.PrefixLength);
IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, maskValue); IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, maskValue);
return $"ip route add {_ip}/{item.Mask} via {ip} dev {Name} metric 1 "; return $"ip route add {_ip}/{item.PrefixLength} via {ip} dev {Name} metric 1 ";
}).ToArray(); }).ToArray();
if (commands.Length > 0) if (commands.Length > 0)
{ {
@@ -164,9 +164,9 @@ namespace linker.tun
{ {
string[] commands = ip.Select(item => string[] commands = ip.Select(item =>
{ {
uint maskValue = NetworkHelper.MaskValue(item.Mask); uint maskValue = NetworkHelper.MaskValue(item.PrefixLength);
IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, maskValue); IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, maskValue);
return $"ip route del {_ip}/{item.Mask}"; return $"ip route del {_ip}/{item.PrefixLength}";
}).ToArray(); }).ToArray();
CommandHelper.Linux(string.Empty, commands); CommandHelper.Linux(string.Empty, commands);
} }

View File

@@ -60,8 +60,8 @@ namespace linker.tun
{ {
string[] commands = ips.Select(item => string[] commands = ips.Select(item =>
{ {
IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, item.Mask); IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, item.PrefixLength);
return $"route add -net {_ip}/{item.Mask} {ip}"; return $"route add -net {_ip}/{item.PrefixLength} {ip}";
}).ToArray(); }).ToArray();
if (commands.Length > 0) if (commands.Length > 0)
{ {
@@ -72,8 +72,8 @@ namespace linker.tun
{ {
string[] commands = ip.Select(item => string[] commands = ip.Select(item =>
{ {
IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, item.Mask); IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, item.PrefixLength);
return $"route delete -net {_ip}/{item.Mask}"; return $"route delete -net {_ip}/{item.PrefixLength}";
}).ToArray(); }).ToArray();
if (commands.Length > 0) if (commands.Length > 0)
{ {

View File

@@ -23,7 +23,7 @@ namespace linker.tun
if (linkerTunDevice == null) return LinkerTunDeviceStatus.Normal; if (linkerTunDevice == null) return LinkerTunDeviceStatus.Normal;
return operating == 1 return operating == 1
? LinkerTunDeviceStatus.Starting ? LinkerTunDeviceStatus.Operating
: linkerTunDevice.Running : linkerTunDevice.Running
? LinkerTunDeviceStatus.Running ? LinkerTunDeviceStatus.Running
: LinkerTunDeviceStatus.Normal; : LinkerTunDeviceStatus.Normal;

View File

@@ -125,7 +125,7 @@ namespace linker.tun
{ {
string[] commands = ips.Select(item => string[] commands = ips.Select(item =>
{ {
uint maskValue = NetworkHelper.MaskValue(item.Mask); uint maskValue = NetworkHelper.MaskValue(item.PrefixLength);
IPAddress mask = NetworkHelper.GetMaskIp(maskValue); IPAddress mask = NetworkHelper.GetMaskIp(maskValue);
IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, maskValue); IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, maskValue);
@@ -141,7 +141,7 @@ namespace linker.tun
{ {
string[] commands = ip.Select(item => string[] commands = ip.Select(item =>
{ {
uint maskValue = NetworkHelper.MaskValue(item.Mask); uint maskValue = NetworkHelper.MaskValue(item.PrefixLength);
IPAddress mask = NetworkHelper.GetMaskIp(maskValue); IPAddress mask = NetworkHelper.GetMaskIp(maskValue);
IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, maskValue); IPAddress _ip = NetworkHelper.ToNetworkIp(item.Address, maskValue);
return $"route delete {_ip}"; return $"route delete {_ip}";

View File

@@ -73,7 +73,6 @@ export default {
currentDom.value.handleValidate().then((json)=>{ currentDom.value.handleValidate().then((json)=>{
step.value.json = Object.assign(step.value.json,json.json); step.value.json = Object.assign(step.value.json,json.json);
step.value.form = Object.assign(step.value.form,json.form); step.value.form = Object.assign(step.value.form,json.form);
console.log(step.value);
step.value.step ++; step.value.step ++;
}).catch(()=>{ }).catch(()=>{
}); });

View File

@@ -51,7 +51,6 @@ export default {
const globalData = injectGlobalData(); const globalData = injectGlobalData();
const tuntap = useTuntap(); const tuntap = useTuntap();
console.log(tuntap);
const ruleFormRef = ref(null); const ruleFormRef = ref(null);
const state = reactive({ const state = reactive({
show: true, show: true,

View File

@@ -280,7 +280,7 @@ namespace linker.plugins.tuntap
{ {
List<TuntapVeaLanIPAddressList> ipsList = ParseIPs(tuntapInfos.Values.ToList()); List<TuntapVeaLanIPAddressList> ipsList = ParseIPs(tuntapInfos.Values.ToList());
TuntapVeaLanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray(); TuntapVeaLanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray();
linkerTunDeviceAdapter.DelRoute(ipsList.SelectMany(c => c.IPS).Select(c => new LinkerTunDeviceRouteItem { Address = c.OriginIPAddress, Mask = c.MaskLength }).ToArray()); linkerTunDeviceAdapter.DelRoute(ipsList.SelectMany(c => c.IPS).Select(c => new LinkerTunDeviceRouteItem { Address = c.OriginIPAddress, PrefixLength = c.MaskLength }).ToArray());
} }
/// <summary> /// <summary>
/// 添加路由 /// 添加路由
@@ -289,7 +289,7 @@ namespace linker.plugins.tuntap
{ {
List<TuntapVeaLanIPAddressList> ipsList = ParseIPs(tuntapInfos.Values.ToList()); List<TuntapVeaLanIPAddressList> ipsList = ParseIPs(tuntapInfos.Values.ToList());
TuntapVeaLanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray(); TuntapVeaLanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray();
linkerTunDeviceAdapter.AddRoute(ipsList.SelectMany(c => c.IPS).Select(c => new LinkerTunDeviceRouteItem { Address = c.OriginIPAddress, Mask = c.MaskLength }).ToArray(), runningConfig.Data.Tuntap.IP); linkerTunDeviceAdapter.AddRoute(ipsList.SelectMany(c => c.IPS).Select(c => new LinkerTunDeviceRouteItem { Address = c.OriginIPAddress, PrefixLength = c.MaskLength }).ToArray(), runningConfig.Data.Tuntap.IP);
tuntapProxy.SetIPs(ipsList); tuntapProxy.SetIPs(ipsList);
foreach (var item in tuntapInfos.Values) foreach (var item in tuntapInfos.Values)