snat和dnat

snat和dnat怎么理解,发现不同的文章都解释了一遍,角度都不一样,很难深入。通过各个文章综合来看,应该从场景概念、原理和实践几个角度。参考文章:

  • 场景概念:https://www.cnblogs.com/52py/p/11395432.html
  • 原理:https://blog.csdn.net/beanewself/article/details/78317626
  • 实践:https://www.jianshu.com/p/1dbe4fc84102
场景概念
SNAT

内部地址要访问公网上的服务时,内部地址会主动发起连接,将内部地址转换成公有ip。网关这个地址转换称为SNAT


snat

如上图,内网客户端为了访问外网服务器,源ip是192.168.109.131,目的ip是12.0.0.12,请求过程必须先把源ip在网管上转换为公网ip,从192.168.109.131转换为12.0.0.254。

DNAT

内部需要对外提供服务时,外部发起主动连接,路由器或着防火墙的网关接收到这个连接,然后把连接转换到内部,此过程是由带公有ip的网关代替内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT.主要用于内部服务对外发布


DNAT

当内部对外部提供服务的时候,外部发起请求,源ip是192.168.109.20,目的ip是12.0.0.200,请求过程必须把目的ip修改未12.0.0.200.

原理和时间

原理上都是通过netfilter框架实现


netfileter框架

对于snat属于数据流出用户空间进程-->OUTPUT--> POSTROUTING,在POSTROUTING修改源ip

在网关上配置iptables规则
源地址转换需要在iptables的postrouting上做NAT转换,如果放在prerouting做转换,数据报文尚未经过路由决策,无法知道数据报文所要到达的目标是内网还是外网,所以在prerouting上做转换不合理
在gw上添加规则进行SNAT转换
·POSTROUTING:修改要离开防火墙数据包的源IP地址
-A:指定链名   
-p:指定协议类型   
-d:指定目标地址   
--dport:指定目标端口(destination port 目的端口)   
--sport:指定源端口(source port 源端口)   
-j:指定动作类型  
[root@gw ~]# iptables -t nat -A POSTROUTING -s 173.22.90.0/24 ! -d 173.22.90.0/24 -j SNAT --to-source 192.168.1.107

如上,实际是配置了一条规则

对于dnat属于数据流入:PREROUTING --> INPUT-->用户空间进程, 在PREROUTING配置规则

在网关上配置itables规则

在prerouting链上配置DNAT的转换规则
[root@GW ~]#  iptables -t nat -A PREROUTING -d 192.168.1.106 -p tcp --dport 80 -j DNAT --to-destination 173.22.90.4
·PREROUTING:修改到达防火墙数据包的目的IP地址
[root@GW ~]# service iptables save 
保存防火墙规则

#当内网的web服务使用的为非标准端口时也可以将其端口进行转换,以内网的http服务为8080为例
#[root@gw ~]# iptables -t nat -A PREROUTING -d 172.22.27.20 -p tcp --dport 80 -j DNAT --to-destination 192.168.73.20:8080

snat和dnat,需要通过场景理解概念,通过netfilter框架理解原理和配置。

解决问题

实际上,我碰到的要解决的问题是,对于一个微服务系统,如何打印外部客户端过来的ip。

一般的微服务系统,都存在网关,默认情况下,从http报文中解截获的ip都是网关ip,因为socket通信都是一跳一跳的,每跳都会修改源和目的ip,为了能打印源ip,就必须使用dnat设置。

你可能感兴趣的:(snat和dnat)