iptables--对DNAT和SNAT的个人理解

对DNAT和SNAT的个人理解

理解iptablies的DNAT和SNAT,对于理解LVS的负载均衡有很好的承接作用,但是之前在理解DNAT和SNAT一直卡在为什么要在postrouting还是prerouting链上设置,所以写此博客以此加深记忆。

iptables的报文流向

首先要理解的是iptables的报文流向,如图所示是,上层协议及用户层空间,以下均为系统的内核空间,因此iptables是工作在内核级的程序。
从图中可以分析出,报文流向有三个:
1.prerouting–>route rules–>input–>user space:流向用户空间
2.user space–> output–>route rules–>postrouting:从用户空间流出
3.prerouting–>route rules–>forward–>postrouting:经过forward做转发功能
在这里插入图片描述

SNAT和DNAT

NAT(net address translate):网络地址转换,由于IPV4地址数量资源匮乏,无法满足需求如此巨大的互联网,于是聪明的网络工程师就搞出了nat这个东西。
NAT原理:如图所示,局域网中使用的都是ipv4的私有地址,然后通过nat代理转发局域网中的所有请求和响应,所以局域网与互联网是不能直接“见面”的,而局域网中的地址都是私有地址,也就是说任何一个局域网都可以使用,使得ip地址复用。。

在这里插入图片描述
SNAT(source nat):源地址转换,以上图为例,就是Host A/B/C所在的网络为局域网,server(假设地址为210.33.5.22)所在的网络为公网。SNAT就是将局域网中的地址转换,NAT(假设面向局域网地址为192.168.1.3,面向公网地址为210.33.5.11)代为转发。

Host A (192.168.1.2)-->server(210.33.5.22)  

snat转发过程:
host A (192.168.1.2)--> nat(192.168.1.3)
nat(210.33.5.11)-->server(210.33.5.22)

#nat接收报文并修改请求报文中source地址为本机的公网地址(210.33.5.11),
然后发送给server(210.33.5.22)

所以服务器端收到的是来自nat的请求。那么在iptables中如何设置呢?
首先由于是nat,所以肯定用到的是nat表,那么报文的流向就是:

prerouting-->forward-->postrouting

那么要设置在prerouting还是postrouting呢?(nat表中不支持forward)
如果是在prerouting定义,那必然不符合逻辑,因为后面还要查路由规则,如果本机由多个公网地址呢?报文的目标地址已经是server地址,也就是非nat的地址,也就是说本身就是要穿过nat,而snat的目的就是要转换源地址,所以必须在postrouting时修改源地址为本机的公网地址。

DNAT:(destination nat):目标地址转换,公网地址发送回应包给局域网的主机时,nat将公网地址返回给自己的地址转换为局域网地址。


dnat回应包转发过程:
server(210.33.5.22)-->nat(210.33.5.11)
server(210.33.5.22)--> host A (nat将目标地址修改为:192.168.1.2)

#作为回应包,因为发出的请求包时从nat发出去的,所以server自然也是将包回应给nat,
而nat中已经记录了当时地址转换的局域网地址,所以nat将原本回应给自己的包,
修改目标地址转发给局域网内发起请求的主机。

由SNAT设置了postrouting可知,要设置DNAT规则,须在prerouting时设置。
这是因为如果是在postrouting设置,那么由于server的相应包是给nat的,所以nat就会以为是发送给自己的,直接收下并往INOUT链上走,而不是转发,自然就到实现不了DNAT的功能,所以在prerouting上设置时,判断是否要转发,即可决定数据报文的走向。

DNAT (Destination NAT) 和 SNAT (Source NAT) 是 iptables 中的两个重要功能,用于修改数据包的目的地址和源地址,以实现网络地址转换和负载均衡等功能。具体上,DNAT 可以将数据包的目的地址转换为指定的地址,而 SNAT 可以将数据包的源地址转换为指定的地址。 下面是具体的使用方法: 1. DNAT 使用 DNAT 可以将数据包的目的地址转换为指定的地址,具体方法如下: ``` iptables -t nat -A PREROUTING -d [原始目的地址] -j DNAT --to-destination [目标地址] ``` 其中,-t nat 表示指定 iptablesnat 表,-A PREROUTING 表示在数据包进入路由前应用规则,-d [原始目的地址] 表示匹配数据包的原始目的地址,-j DNAT 表示将匹配的数据包进行 DNAT 转换,--to-destination [目标地址] 表示指定目标地址。 例如,将来自 192.168.1.2 的数据包的目的地址转换为 10.0.0.2: ``` iptables -t nat -A PREROUTING -d 192.168.1.2 -j DNAT --to-destination 10.0.0.2 ``` 2. SNAT 使用 SNAT 可以将数据包的源地址转换为指定的地址,具体方法如下: ``` iptables -t nat -A POSTROUTING -s [原始源地址] -j SNAT --to-source [目标地址] ``` 其中,-t nat 表示指定 iptablesnat 表,-A POSTROUTING 表示在数据包出路由后应用规则,-s [原始源地址] 表示匹配数据包的原始源地址,-j SNAT 表示将匹配的数据包进行 SNAT 转换,--to-source [目标地址] 表示指定目标地址。 例如,将来自 192.168.1.2 的数据包的源地址转换为 10.0.0.2: ``` iptables -t nat -A POSTROUTING -s 192.168.1.2 -j SNAT --to-source 10.0.0.2 ``` 需要注意的是,DNAT 和 SNAT 都会修改数据包的地址,因此需要谨慎使用,避免对网络造成影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值