📜  网络地址转换 (NAT)(1)

📅  最后修改于: 2023-12-03 15:11:43.842000             🧑  作者: Mango

网络地址转换 (NAT)

什么是网络地址转换 (NAT)

网络地址转换 (NAT) 是一种网络通讯协议,它将私有网络地址转换为公共网络地址,从而实现多个计算机共享一个公共 IP 地址的功能,同时保障网络安全。

NAT 的作用

NAT 的主要作用是实现多个设备通过一个公网 IP 访问互联网。在 NAT 中,私有网络中的设备都是使用内部 IP 地址进行通信,而外部网络就直接与 NAT 设备的公共 IP 地址通信。

NAT示意图

在上图中,单个公网 IP 地址可以对应多个内部 IP 地址,从而实现内部多个设备与外部互联网的通信。

NAT 的优点
  1. 私有网络可以共享一个公共 IP 地址,减少了 IP 地址的使用;
  2. 增加了网络安全性,设备不直接暴露在公网中,保障了内部网络的安全性;
  3. 增加了网络的灵活性,可以通过 NAT 对内网进行一定程度的隔离和保护;
  4. 网络设备不需要更改配置,能够自动适应不同的网络环境。
NAT 的缺点
  1. NAT 会引入额外的延迟和数据损失,对于游戏等对网络延迟敏感的应用有影响;
  2. 对于需要外部机器访问内部设备的应用,需要进行端口映射等额外的配置。
NAT 的实现方式

NAT 的实现方式包括静态 NAT 和动态 NAT 两种模式。

静态 NAT

静态 NAT 指的是将内部私有地址和公网地址进行一一映射,这种方式适合需要对内部网络进行固定的访问映射,例如公司内网的 Web 服务器等。

动态 NAT

动态 NAT 则将内部私有地址与公网地址进行动态映射,适用于无法确定内部 IP 地址的变化情况,例如家庭网络等。

NAT 在软件开发中的应用

NAT 在软件开发中广泛应用于网络编程中,例如通过 NAT 对 P2P 网络进行管理,通过 NAT 实现内网的远程访问等。

在开发中,可以使用开源库,例如 miniupnp、libnatpmp 等进行 NAT 配置的操作。

对于 P2P 网络管理,可以使用 libtorrent 等开源库实现对 NAT 环境的检测和自动穿透。

使用 miniupnp 实现 NAT 配置的代码示例:

UPNPUrls urls;
IGDdatas data;
u32 leasetime = 0;
UPNPDev* devlist = upnpDiscover(2000, NULL, NULL, 0, 0, 2, &error);
if (devlist)
{
    char lanaddr[64];
    struct UPNPDev* dev = devlist;
    while (dev)
    {
        int r = UPNP_GetValidIGD(dev, &urls, &data, lanaddr, sizeof(lanaddr));
        if (r == 1)
            break;
        dev = dev->pNext;
    }
    if (dev && UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,
        port, port, lanaddr, 0, "UDP", 0, leasetime))
        printf("add port mapping successful.\n");
}