Linux-SNAT和DNAT

2021-08-16 11:02:47 浏览数 (1)

文章目录

  • Pre
  • 前提:开启IP转发
  • IP包的结构
  • 数据包在iptables中要经过的链(chain)
  • 总结
    • -j SNAT
    • -j DNAT

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

0 人点赞