95.5、NAT
说明
- 使用nuget
linker.nat,或源码 https://github.com/snltty/linker/tree/master/src/linker.nat - 以下是简单使用示例
95.4.1 网段映射
网段映射,主要用于组网多局域网网段冲突
LinkerDstMapping mapping = new LinkerDstMapping();
//设置映射列表
mapping.SetDsts(new DstMapInfo[] {
new DstMapInfo {
FakeIP = IPAddress.Parse("192.168.123.0"),
RealIP = IPAddress.Parse("192.168.1.0"),
PrefixLength = 24
}
});
//将TCP/IP包里的目标IP转换为假IP
mapping.ToFakeDst(tcpIpPacket);
//将TCP/IP包里的目标IP转换为原来的真IP
mapping.ToRealDst(tcpIpPacket);
//通过假IP获取到真实的192.168.1.100,这个一般用于端口转发或者代理的,只获取真的去连接就可以
IPAddress realIp = mapping.GetRealDst(IPAddress.Parse("192.168.123.100"));
95.4.2 目标代理
目标代理,类似DNAT,以实现点对网
LinkerDstProxy dstProxy = new LinkerDstProxy();
//代理IP,一般就用虚拟网卡IP,
IPAddress tunIp = IPAddress.Parse("10.18.18.2");
//需要被代理的IP
(IPAddress ip, byte prefix)[] dsts = new [] {
(IPAddress.Parse("192.168.2.0"), 24)
};
//启动代理,当数据包的目标Ip是[192.168.2.0/24]的时候,会被代理到[10.18.18.2:随机端口]
dstProxy.Setup(tunIp,dsts,ref string error);
//收到别人的数据包在写入虚拟网卡之前调用
bool res = dstProxy.Write(tcpIpPacket);
if(res)
{
//true写入虚拟网卡,false就走代理了不需要写入网卡了
}
//在读取虚拟网卡后发送给别人之前调用
dstProxy.Read(tcpIpPacket);
//停止代理
dstProxy.Shutdown();