Linux-SNAT和DNAT

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: Linux-SNAT和DNAT

Pre

Linux-iptables命令

Linux-SNAT和DNAT

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

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

前提:开启IP转发

开启内核转发的模块。

echo 1 > /porc/sys/net/ipv4/ip_forward  #临时生效,重启失效

永久生效:

vi /etc/sysctl.conf

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

执行

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上:

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链来进行操作

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 地址)

例如:

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

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 地址)

例如:

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

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81  -j DNAT --to 192.168.0.2:80
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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
基于阿里云,构建一个企业web应用上云经典架构,让IT从业者体验企业级架构的实战训练。
相关文章
|
网络协议 Linux
SNAT和DNAT原理及应用
SNAT和DNAT原理及应用
1155 0
SNAT和DNAT原理及应用
|
11月前
|
网络协议 Docker 容器
docker启动报错 (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9876 -j DNAT --
docker启动报错 (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9876 -j DNAT --
299 0
|
10天前
|
弹性计算 Linux 网络安全
三步搭建VPC专有网络NAT网关,配置SNAT和DNAT规则(补充版)
申明:该文档参考于用户 “帅宝宝”的文档进行的优化,新增永久生效的方式
321 1
|
12月前
|
弹性计算 运维 数据安全/隐私保护
《企业运维之云上网络原理与实践》——第三章 云上网络VPC&EIP&NAT&共享宽带&SLB——配套实验:ECS通过SNAT访问CLB(1)
《企业运维之云上网络原理与实践》——第三章 云上网络VPC&EIP&NAT&共享宽带&SLB——配套实验:ECS通过SNAT访问CLB(1)
261 0
|
12月前
|
弹性计算 运维
《企业运维之云上网络原理与实践》——第三章 云上网络VPC&EIP&NAT&共享宽带&SLB——配套实验:ECS通过SNAT访问CLB(2)
《企业运维之云上网络原理与实践》——第三章 云上网络VPC&EIP&NAT&共享宽带&SLB——配套实验:ECS通过SNAT访问CLB(2)
211 0
|
网络协议 Linux
iptables之SNAT与DNAT(二)
iptables之SNAT与DNAT(二)
iptables之SNAT与DNAT(二)
|
网络协议 Linux 网络安全
|
弹性计算 网络协议 Linux
linux服务器自建snat和dnat
为了节省成本,购买了云服务器的时候只买了一个公网IP,但是有多台机器需要实现上网或者是被访问,一个IP只能绑定一个机器,就只能使用NAT网关或者是内网源进行下载,受限较大。
|
弹性计算 网络协议 网络安全
三步搭建VPC专有网络NAT网关,配置SNAT和DNAT规则
自建NAT网关配置SNAT和DNAT转发规则
19217 3
|
弹性计算 API
NAT网关之SNAT进阶使用(二)构建ECS级别SNAT出网方式
NAT网关是云上VPC ECS访问Internet的出入口。阿里云NAT网关控制台创建SNAT条目默认只支持交换机粒度。如何设置ECS粒度的SNAT规则呢,本文将为您揭晓。
6457 0