一、原理
NAT的工作原理就是重写重写通过路由器的数据包的识别信息。这种情况常发生在数据传输的两个方向上。在这种最基本的形式中,NAT需要重写往一个方向传输的数据包的源IP地址,重写往另一个方向传输的数据包的目的IP地址。这允许传出的数据包的源IP地址变为NAT路由器面向Internet的网络接口地址,而不是原始主机的接口地址。因此,在互联网上的主机看来,数据包是来自于具备全局路由IP的NAT路由器,而不是位于NAT内部的私有地址的主机。
二、移植
我的实际项目中,是ppp和eth之间数据包的转发,具体参考了rtthread组件中的NAT源码,但是并没有具体的详细使用说明,下面记录我的详细移植过程,其实还可以参考一下esp官方的SDK,里面实现了NAPT,完整的嵌入到LWIP协议栈中。
1、rtconfig.h中添加宏定义
#define LWIP_USING_NAT
2、nat初始化
ip_nat_init()放在lwip_init()最后执行;
ip_nat_init();//void lwip_init(void)
3、添加参数配置
ip_nat_start()我是放在ppp_netdev_refresh()最后,ppp拨号成功后配置;
void ip_nat_start(void)
{
ip_nat_entry_t nat_entry;
err_t ret = 0;
struct netif *out_if_ppp;
struct netif *in_if_eth0;
out_if_ppp = netif_find("pp1");//net dev是pp,1表示add net dev时的序号,如果不加1,find会失败
in_if_eth0 = netif_find("e00");//net dev是e0,第二个0表示add net dev时的序号,如果不加0,find会失败
nat_entry.out_if = out_if_ppp;
nat_entry.in_if = in_if_eth0;
IP4_ADDR(&nat_entry.source_net, 198, 120, 0, 210);//local ip
IP4_ADDR(&nat_entry.source_netmask, 255, 255, 255, 0);
IP4_ADDR(&nat_entry.dest_net, 123, 123, 123, 0);//dest ip
IP4_ADDR(&nat_entry.dest_netmask, 255, 255<