前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux-SNAT和DNAT

Linux-SNAT和DNAT

作者头像
小小工匠
发布2021-08-16 11:02:47
1.3K0
发布2021-08-16 11:02:47
举报
文章被收录于专栏:小工匠聊架构

文章目录


Pre

Linux-iptables命令

Linux-SNAT和DNAT

在上一博客Linux-iptables命令中,我们知道了一些iptable的nat表中几个链的区别,这里单独讲其中两个链拿出来详细说明。

  • DNAT(Destination Network Address Translation,目的地址转换) 通常被叫做目的映射。
  • SNAT(Source Network Address Translation,源地址转换)通常被叫做源映射

前提:开启IP转发

开启内核转发的模块。

代码语言:javascript
复制
echo 1 > /porc/sys/net/ipv4/ip_forward  #临时生效,重启失效

永久生效:

代码语言:javascript
复制
vi /etc/sysctl.conf

修改其中的net.ipv4.ip_forward = 1

执行

代码语言:javascript
复制
sysctl -p

立刻生效


IP包的结构

我们在设置Linux网关或者防火墙时经常要用来的两种方式。 首先,我们要了解一下IP包的结构

这里写图片描述
这里写图片描述

在任何一个IP数据包中,都会有Source IP Address与Destination IP Address这两个字段,数据包所经过的路由器也是根据这两个字段是判定数据包是由什么地方发过来的,它要将数据包发到什么地方去。而iptables的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。


数据包在iptables中要经过的链(chain)

这里写图片描述
这里写图片描述

图中正菱形的区域是对数据包进行判定转发的地方。

在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress是本机地址,数据将会被转交给INPUT链。如果不是本机地址,则交给FORWARD链检测。

这也就是说,我们要做的DNAT要在进入这个菱形转发区域之前,也就是在PREROUTING链中做,

比如我们要把访问202.103.96.112的访问转发到192.168.0.112上:

代码语言:javascript
复制
iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112

这个转换过程当中,其实就是将已经达到这台Linux网关(防火墙)上的数据包上的destination ip address从202.103.96.112修改为192.168.0.112然后交给系统路由进行转发。

SNAT自然是要在数据包流出这台机器之前的最后一个链也就是POSTROUTING链来进行操作

代码语言:javascript
复制
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66

这个语句就是告诉系统把即将要流出本机的数据的source ip address修改成为58.20.51.66。这样,数据包在达到目的机器以后,目的机器会将包返回到58.20.51.66也就是本机。如果不做这个操作,那么你的数据包在传递的过程中,reply的包肯定会丢失。


总结

PREROUTING: 位于 nat 表,用于修改目的地址(DNAT)(上一节说的是数据包作路由选择前应用此链中的规则 记住!所有的数据包进来的时侯都先由这个链处理)

POSTROUTING:位于 nat 表,用于修改源地址 (SNAT)(上一节说的是对数据包作路由选择后应用此链中的规则,所有的数据包出来的时侯都先由这个链处理.


-j SNAT

简单的说,开放内网机器外网权限

注意:【系统在路由及过虑等处理直到数据包要被送出时才进行SNAT】

-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING链) 源地址转换,SNAT 支持转换为单 IP,也支持转换到 IP 地址池 (一组连续的 IP 地址)

例如:

代码语言:javascript
复制
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1

将内网 192.168.0.0/24 的原地址修改为 1.1.1.1,用于 NAT

代码语言:javascript
复制
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10

同上,只不过修改成一个地址池里的 IP


-j DNAT

简单的来说是发布内部服务器,让外面的internet用户能访问到服务器,如网站等

有一种DNAT的特殊情况是重定向,也就是所谓的Redirection,这时候就相当于将符合条件的数据包的目的ip地址改为数据包进入系统时的网络接口的ip地址

-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 链) 目的地址转换,DNAT 支持转换为单 IP,也支持转换到 IP 地址池 (一组连续的 IP 地址)

例如:

代码语言:javascript
复制
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1

把从 ppp0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1

代码语言:javascript
复制
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81  -j DNAT --to 192.168.0.2:80
代码语言:javascript
复制
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80  -j DNAT --to192.168.0.1-192.168.0.10

公网访问 http://218.100.100.111时:(假设公网上用户的IP为199.199.199.199,端口12345为随机的产生的。)

数据源 : ip:199.199.199.199 sport:12345 数据目标: ip:218.100.100.111 dport 80

此时,通过-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80 告诉199.199.199.199,您要访问的真正地址应该是192.168.5.179:80

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/10/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • Pre
  • 前提:开启IP转发
  • IP包的结构
  • 数据包在iptables中要经过的链(chain)
  • 总结
    • -j SNAT
      • -j DNAT
      相关产品与服务
      NAT 网关
      NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档