首页
视频
资源
登录
原
网络 SNAT与DNAT
4654
人阅读
2022/5/15 18:35
总访问:
2537451
评论:
0
收藏:
0
手机
分类:
容器编排
![Kubernetes](https://img.tnblog.net/arcimg/hb/274ef6f115de4c9b8e40ded5deb2f4c2.jpg "Kubernetes") >#网络 SNAT与DNAT [TOC] NAT简介 ------------ tn2>网络地址转换NAT(Network Address Translation)是将IP数据报文中的IP地址转换为另一个IP地址的过程。 随着internet的发展和网络应用的增多,IPV4地址枯竭已成为制约网络发展的瓶颈。尽管IPV6可以从根本上解决IPv4地址空间不足的问题,但目前众多网络设备和网络应用大多数是基于IPv4的,因此在IPv6广泛应用之前,一些过滤技术(如CIDR、私网地址等)的使用是解决这个问题最主要的技术手段。NAT主要用于实现内部网络(简称内网,使用私有的网络地址)访问外部网络(简称外网,使用公有IP地址)的功能。当内网的主机要访问外网时,通过NAT技术可以将其私网地址转换为公网地址,可以实现多个私网用户共用一个公网地址来访问外部网络。 ![](https://img.tnblog.net/arcimg/hb/dacfa877da594c428bdb0ceb37111974.png) | 优点 | 缺点 | | ------------ | ------------ | | 节省IP地址空间 | 增加转发延迟 | | 解决IP地址重叠问题 | 丧失端到端的寻址能力 | | 增加网络连入internet的弹性 | 某些应用不支持NAT | | 网络变更的时候减少IP重编址带来的麻烦 | 需要一定的内存空间支持动态存储NAT表项 | | 对外隐藏内部地址,增加网络安全性 | 需要耗费一定NAT资源进行操作,需耗费一定内存资源进行存储NAT表项 | 静态NAT(SNAT) ------------ tn2>Static NAT,静态NAT,用于将内部本地地址(私有IP)与内部全局地址(公有IP)进行一对一的映射。缺点是需要每一个内部IP地址需独占一个宝贵的公网地址。即,如果某个合法IP地址已经被NAT静态的IP地址转换定义,即使该地址当前没有被使用,也不能被用作其他的地址转换。而且这种方式是静态手工创建的NAT映射,可扩展性不高。<br/> 这种方法主要用在内网中存在需要对公网提供服务的服务器场景,类似的场景有Web服务器、邮件服务器、FTP服务器等。<br/> Static NAT支持IP对IP的映射,以及端口对端口的映射。 ![](https://img.tnblog.net/arcimg/hb/df6c3df899214830a5fab0bb0e470a92.png) tn2>我们可以看到在私网访问外网时,仅仅是对发送端的IP进行了修改,那MAC有没有修改呢?这里我们保留一个疑问,在接下来我们将通过ENSP来进行实践。 >### 通过ENSP模拟IP对IP tn2>我们需要实践的如下图所示: ![](https://img.tnblog.net/arcimg/hb/16801af53c41416cb8d3d4eab6a58d34.png) tn2>PC1的IP是`192.168.0.2/24`,AR1上的网关为`192.168.0.1/24`。 Server1的IP为`2.2.2.1/24`,AR1上的网关为`2.2.2.2/24`下面是相关配置图。 ![](https://img.tnblog.net/arcimg/hb/c5627a5c07a94a1a8ac8de0403410201.png) ![](https://img.tnblog.net/arcimg/hb/3d25c0e559da4b7890a8140c82c3db50.png) tn2>我们知道SNAT是需要一对一的映射IP,所以我们只需要在PC1发往Server1数据包在AR1中的`192.168.0.2`设置为`2.2.2.3/24`之后再进行转发就可以进行与Server的通信了。命令如下: ```bash system-view # 查看当前AR1配置 dis current-configuration # 重命名为Router sysname Router # 为0/0/0接口添加网关 interface GigabitEthernet0/0/0 ip address 192.168.0.1 255.255.255.0 # 为0/0/1接口添加网关 interface GigabitEthernet0/0/1 ip address 2.2.2.2 255.255.255.0 # 将PC1的IP映射为2.2.2.3 nat static global 2.2.2.3 inside 192.168.0.2 netmask 255.255.255.255 # 设置所有到该路由的流量下一站为2.2.2.1 ip route-static 0.0.0.0 0.0.0.0 2.2.2.1 ``` ![](https://img.tnblog.net/arcimg/hb/6a063cf6bcf44d60918bd34bfbeaf69f.png) tn2>运行测试。 ```bash ping 2.2.2.1 ``` ![](https://img.tnblog.net/arcimg/hb/6b9a281ba93148dc9a18757a27e71e48.png) tn2>接下来我们分析GE0/0/1的包,发现它是从`2.2.2.3`发过来的。 GE0/0/0不用说了把是从`192.168.0.2`发到路由来的。 我们发现发送端的IP与MAC都变了,但MAC是哪个接口的MAC呢? ![](https://img.tnblog.net/arcimg/hb/c352b64c022149659b66ae75276aafba.png) tn2>我们通过`dis arp`查看IP所对应的MAC,发现MAC是`2.2.2.2`的。 ![](https://img.tnblog.net/arcimg/hb/895acaa70267468191ded327f8321752.png) tn2>然后我们添加一个PC2,由于没有配置SNAT,没有对应的IP映射,所以导致私网无法请求服务器端,我们可以看到后面的抓0/0/1接口的包也是没有想关请求的。 ![](https://img.tnblog.net/arcimg/hb/411ff51780fd4cd2b4e48dddf9840a40.png) >### SNAT Easy IP tn2>Easy IP 特别适合小型局域网访问Internet的情况。这里的小型局域网主要指中小型网吧、小型办公室等环境,一般据有以下特点:内部主机较少、出接口通过拨号方式获得临时公网IP地址以供内部主机访问Internet。对于这种情况,可以使用Easy IP 方式使局域网用户都可以通过这个IP地址接入Internet。 对于只申请到少量IP地址甚至只有一个合法IP地址却经常有很多用户要求同时上网的情况,这种转换方式非常有用。这种地址转换方式真正意义上缓解了IPv4地址紧缺的问题。在各种网络中被广泛使用。 ![](https://img.tnblog.net/arcimg/hb/715afb095ebc4cd1855c3474f952513a.png) Linux下实现SNAT ------------ tn2>我们知道内部地址要访问公网上的服务时,内部地址会主动发起连接,将内部地址转换成公有ip。网关这个地址转换称为 SNAT。但在Linux下我们应该如何模拟呢?我们可以通过下面的拓扑图进行实践。 ![](https://img.tnblog.net/arcimg/hb/d4314d37281f4d3d84f053e4a65b2bd0.png) ```bash # 添加br0 ip netns add ns1 ip l a br0 type bridge ip l s br0 up # 配置br0和veth0 ip l a veth0 type veth peer name br-veth0 ip l s veth0 netns ns1 ip l s br-veth0 master br0 ip l s br-veth0 up # 配置ns1中的接口 ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0 ip netns exec ns1 ip l s veth0 up ip a a 10.1.1.1/24 dev br0 ip l s br0 up ip netns exec ns1 ifconfig lo up # 添加路由 ip netns exec ns1 route add -net 0.0.0.0 gw 10.1.1.1 # 修改内核转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 添加SNAT规则 # 假设让iptables防火墙承担NAT服务器功能。此时,如果希望内网10.1.1.0/24出去的数据包其源IP地址都转换外网接口的公网,则需要执行以下iptables命令。 iptables -t nat -A POSTROUTING -s 10.1.1.0/24 ! -o br0 -j MASQUERADE # 测试运行 ip netns exec ns1 ping 114.114.114.114 ``` ![](https://img.tnblog.net/arcimg/hb/aaf78d6d4ff049ceb19703f0d120e225.png) ## DNAT tn2>简单来说:从外到内的访问。 当内部需要对外提供服务时,外部发起主动连接,路由器或着防火墙的网关接收到这个连接,然后把连接转换到内部,此过程是由带公有ip的网关代替内部服务来接收外部的连接,然后在内部做地址转换,此转换称为 DNAT ```bash docker run --name dnat -p 2022:22 --privileged=true -td centos:7 /sbin/init docker exec -it dnat bash yum -y install net-tools # 安装ssh访问服务 yum -y install openssh-server # 修改密码 passwd root # 启动ssh与查看状态 systemctl restart sshd netstat -an | grep 22 ``` ![](https://img.tnblog.net/arcimg/hb/85e3bd8fb4454e4081de661156a9e374.png) tn2>在主机上查看iptables的记录。 大致意思如下:当收到不是docker0网桥过来的包,放问2022端口的时候,将进行DNAT到我们刚刚创建的容器IP`172.18.0.2:22`中。 ```bash iptables-save | grep 2022 ``` ![](https://img.tnblog.net/arcimg/hb/2e285d3a1d3c49649193f150f588c2ff.png) tn2>接着我们通过刚刚的NS1进行测试是否可以进行连接。 ```bash ip netns exec ns1 ssh 10.1.1.1 -p 2022 ``` ![](https://img.tnblog.net/arcimg/hb/56b3e28742184b35ae80a186b148372e.png)
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
👈{{preArticle.title}}
👉{{nextArticle.title}}
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
166篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
28篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
39篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
AI
18篇
threejs
2篇
人物
1篇
嵌入式
2篇
python
13篇
HuggingFace
8篇
pytorch
9篇
opencv
6篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2024
TNBLOG.NET
技术交流:
群号656732739
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术