Self-Twice-nat:基本等同于常规的双向NAT,但存在几点细微差别。此特性允许同一主机上的客户端与服务通过NAT设备相互通信,特点是外部地址与本地地址相同。值得注意的是,自我双向NAT的静态映射只能由外部网络发起以建立会话连接。
外部地址和本地地址相同,通过文档中NAT转换关系来看就是外部报文使用Src ip 10.0.0.2 必须等于转换后Dst ip 10.0.0.2。
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相关配置。
网络拓扑图如下:
+--------------------------+
| 10.0.0.2/24 (local host) |
+--------------------------+
|
+-------------------------------------------+
| 10.0.0.1/24 (eth0) (nat inside & outside) |
| nat44 address 192.168.160.101 |
+-------------------------------------------+
VPP 相关配置命令如下:
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方向。
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会话。
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设备需要智能地管理会话,确保内部主机间的通信不会因为地址转换而中断。以下是几个应用此功能的典型场景:
想象一个小型企业或家庭办公室,其中部署了一台多功能网络设备,这台设备同时作为路由器、防火墙和NAT设备使用。企业或家庭中有一台服务器(如文件服务器、邮件服务器或内部Web服务器)需要从外部访问,同时也需要作为局域网内的普通设备访问互联网资源。
在云服务提供商的环境中,开发和测试团队可能需要模拟真实的互联网环境来测试内部部署的应用程序,而这些应用程序最终需要面向公众。
对于个人或小型游戏服务器托管商,可能只有一个公网IP地址可用,但希望同一台服务器既能作为游戏服务器供外部玩家连接,又能作为客户端参与其他在线游戏或服务。
在所有这些场景中,自我双向NAT提供了一种灵活且高效的解决方案,使得内部网络资源能够安全地与外部世界互动,同时保持了网络配置的简洁性。
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!