前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >learning NAT-ED : self-twice-nat功能(2)

learning NAT-ED : self-twice-nat功能(2)

作者头像
dpdk-vpp源码解读
发布2024-06-17 13:30:25
1060
发布2024-06-17 13:30:25
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

Self-Twice-nat:基本等同于常规的双向NAT,但存在几点细微差别。此特性允许同一主机上的客户端与服务通过NAT设备相互通信,特点是外部地址与本地地址相同。值得注意的是,自我双向NAT的静态映射只能由外部网络发起以建立会话连接。

外部地址和本地地址相同,通过文档中NAT转换关系来看就是外部报文使用Src ip 10.0.0.2 必须等于转换后Dst ip 10.0.0.2。

代码语言:javascript
复制
outside to inside translation:
      src address: 10.0.0.2 -> 192.168.160.101
      dst address: 10.0.0.1 -> 10.0.0.2
inside to outside translation:
     src address: 10.0.0.2 -> 10.0.0.1
     dst address: 192.168.160.101 -> 10.0.0.2

在nat44-ed-out2in节点处理逻辑中,当接收到外部报文携带src ip 10.0.0.2请求内部报文192.168.160.101地址时,会命中静态ed-flowhash表,调用函数create_session_for_static_mapping_ed()创建会话表完成out2in和in2out hash表。下面是网络拓扑图及vpp相关配置。

网络拓扑图如下:

代码语言:javascript
复制
+--------------------------+
| 10.0.0.2/24 (local host) |
+--------------------------+
            |
+-------------------------------------------+
| 10.0.0.1/24 (eth0) (nat inside & outside) |
|       nat44 address 192.168.160.101       |
+-------------------------------------------+

VPP 相关配置命令如下:

代码语言:javascript
复制
creat tap id 1 host-ns inside host-ip4-addr 10.0.0.2/24 host-ip4-gw 10.0.0.1 host-if-name tap1

set interface state tap1 up
set interface ip address tap1 10.0.0.1/24

nat44 plugin enable sessions 1000
set interface nat44 in tap1

set interface nat44 out tap1

nat44 add address 192.168.160.101
nat44 add address 10.0.0.1 twice-nat
nat44 add static mapping tcp local 10.0.0.2 5201 external 192.168.160.101 5201 self-twice-nat

上图最后一个命令行配置完静态mapping表之后,会在ed-flow-hash中生成2条静态mapping表,其中288对应in2out方向,875对应out2in方向。

代码语言:javascript
复制
dpdk-vpp源码分析: show nat44 hash tables detail
Hash table 'ed-flow-hash'
[288]: heap offset 46730184, len 1, refcnt 2, linear 0
    0: local 10.0.0.2:5201 remote 0.0.0.0:0 proto TCP fib 0 thread-index 0 session-index 0
[875]: heap offset 46791232, len 1, refcnt 2, linear 0
    0: local 0.0.0.0:0 remote 192.168.160.101:5201 proto TCP fib 0 thread-index 0 session-index 0
    2 active elements 2 active buckets
    0 free lists
    0 linear search buckets
    heap: 1 chunk(s) allocated
          bytes: used 104k, scrap 0

ed-flow-hash表利用了vppinfra库中的bihash数据结构实现。其核心作用在于高效地管理和查找网络流量的会话(session)信息,以便执行NAT(网络地址转换)过程。重构之后的NAT模块,ed-flow-hash表不仅承担了NAT会话的动态创建、识别和跟踪,还承担了静态mapping表创建、识别。和旧版本实现差异性比较大。

NAT需要识别出每个独特的通信会话,这通常基于六元组(源IP、源端口、目的IP、目的端口和协议类型、以及vrf id)来定义。ed-flow-hash通过计算这些要素的哈希值,快速定位到相应的会话条目,实现对每个会话状态的跟踪和管理。

接下来,我们在命令空间inside中开启iperf3客户端,然后再另外一个创建开启iper3 客户端,客户端连接服务器地址是NAT静态NAT表中配置外部地址192.168.160.101。下图是运行后的结果,符合self-twice-nat NAT映射关系。

self-twice-nat 和twice-nat业务转发流程是一样的,本文就不再展示,下面我们通过show nat44 sessions命令行查询了生成的NAT会话。

代码语言:javascript
复制
dpdk-vpp源码分析: show nat44 sessions
NAT44 ED sessions:
-------- thread 0 vpp_main: 2 sessions --------
    i2o 10.0.0.2 proto TCP port 5201 fib 0
    o2i 192.168.160.101 proto TCP port 5201 fib 0
       external host o2i 10.0.0.2:54244 i2o 10.0.0.1:11570
       i2o flow: match: saddr 10.0.0.2 sport 5201 daddr 10.0.0.1 dport 11570 proto TCP fib_idx 0 
       rewrite: saddr 192.168.160.101 sport 5201 daddr 10.0.0.2 dport 54244 
       o2i flow: match: saddr 10.0.0.2 sport 54244 daddr 192.168.160.101 dport 5201 proto TCP fib_idx 0 
       rewrite: saddr 10.0.0.1 sport 11570 daddr 10.0.0.2 dport 5201 txfib 0 
       index 1
       last heard 617.91
       timeout in 88.84
       total pkts 345611, total bytes 440997189
       static translation
       twice-nat

至此,我们介绍自我双向NAT(Self-Twice-NAT)配置,并通过iperf3打流验证了功能的NAT映射关系逻辑。其特点在于它允许内部网络中的设备既是客户端也是服务器,同时使用相同的公网IP地址进行通信。这种情况下,NAT设备需要智能地管理会话,确保内部主机间的通信不会因为地址转换而中断。以下是几个应用此功能的典型场景:

应用场景1:家庭办公/小型企业网络

想象一个小型企业或家庭办公室,其中部署了一台多功能网络设备,这台设备同时作为路由器、防火墙和NAT设备使用。企业或家庭中有一台服务器(如文件服务器、邮件服务器或内部Web服务器)需要从外部访问,同时也需要作为局域网内的普通设备访问互联网资源。

  • 场景细节:服务器配置了私有IP地址(如192.168.1.10),通过自我双向NAT,这台服务器的流量在外出时会被转换为一个固定的公网IP地址(例如,203.0.113.10)。当外部用户尝试访问此公网IP时,NAT设备能够将请求再次转换回服务器的私有IP地址,确保内外部通信的无缝连接。同时,服务器作为内部网络的一部分,也能无碍地访问互联网资源。

应用场景2:云服务提供商的内部测试

在云服务提供商的环境中,开发和测试团队可能需要模拟真实的互联网环境来测试内部部署的应用程序,而这些应用程序最终需要面向公众。

  • 场景细节:开发人员的测试服务器配置了私有IP,通过自我双向NAT映射到一个与外部服务交互的公共IP。这样,测试服务器既可以作为客户端访问外部资源进行集成测试,也可以作为服务端接收来自同一公网IP地址的测试请求,模拟真实世界的用户访问情况。这种配置有助于在不暴露内部网络结构的同时,进行全面的端到端测试。

应用场景3:游戏服务器托管

对于个人或小型游戏服务器托管商,可能只有一个公网IP地址可用,但希望同一台服务器既能作为游戏服务器供外部玩家连接,又能作为客户端参与其他在线游戏或服务。

  • 场景细节:通过自我双向NAT,服务器的私有IP被映射到唯一的公网IP上。外部玩家通过这个公网IP连接游戏服务器,同时,服务器也能使用该公网IP作为源地址访问其他游戏或服务,满足了在同一主机上同时进行游戏服务提供和客户端活动的需求。

在所有这些场景中,自我双向NAT提供了一种灵活且高效的解决方案,使得内部网络资源能够安全地与外部世界互动,同时保持了网络配置的简洁性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 应用场景1:家庭办公/小型企业网络
  • 应用场景2:云服务提供商的内部测试
  • 应用场景3:游戏服务器托管
相关产品与服务
弹性公网 IP
弹性公网 IP(Elastic IP,EIP)是可以独立购买和持有,且在某个地域下固定不变的公网 IP 地址,可以与 CVM、NAT 网关、弹性网卡和高可用虚拟 IP 等云资源绑定,提供访问公网和被公网访问能力;还可与云资源的生命周期解耦合,单独进行操作;同时提供多种计费模式,您可以根据业务特点灵活选择,以降低公网成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档