---
sidebar_position: 101
---

# 98.101、单独使用应用层SNAT


:::tip[说明]


### 1、使用

有效解决win7/8，win server2008/2012无法使用`NetNat`的问题

如果你使用的是`linker.tun`类库，已经集成应用层SNAT，使用`LinkerTunDeviceAdapter.SetSystemNat`使用系统NAT和`LinkerTunDeviceAdapter.SetAppNat`使用应用层SNAT即可


去<a href="https://reqrypt.org/windivert.html">windivert</a>下载抓包驱动，放置合适的`WinDivert.dll`和`WinDivert.sys`到程序根目录，然后 nuget 安装 `linker.snat`，然后编写代码

```c#

internal class Program
{
    static void Main(string[] args)
    {
        //初始化
        LinkerSrcNat linkerSrcNat = new LinkerSrcNat();
        bool result = linkerSrcNat.Setup(new SetupInfo{
            //虚拟网卡IP
            Src = IPAddress.Parse("10.18.18.2"),
            //仅访问192.168.1.0/24时NAT
            Dsts = new AddrInfo[]{ 
                new AddrInfo(IPAddress.Parse("192.168.1.0"),24)  
            },
            //本机局域网IP，用于替换为源IP
            InterfaceIp = IPAddress.Parse("192.168.1.2") 
        },out string error);

        //在将TCP/IP数据包写入网卡前增加一个操作
        if(linkerSrcNat.Inject(packet) == false)
        {
            //不需要NAT或者NAT失败，这里可以继续把数据包写入虚拟网卡
        }

        //关闭
        linkerSrcNat.Shutdown();
        Console.ReadLine();
    }
}

```

### 1、原理图

![Docusaurus Plushie](./img/snat.jpg)
:::
