SNAT与DNAT策略及应用

969 阅读9分钟

一、SNAT的策略及应用

1.1 SNAT策略概述

  • SNAT策略的典型应用环境

    • 局域网主机共享单个公网IP地址接入Internet(互联网)即公私网的转换
  • SNAT策略的原理

    • 源地址转换,Source Network Address Translation
    • 修改数据包的源地址
  • SNAT的典型应用环境图例

image.png

二、SNAT的工作原理

  • 未作SNAT转换时的情况 image.png

如上图所示,在没有使用SNAT转换时,我们局域网的主机想要访问公网,我们局域网源地址IP为192.168.1.234在通过路由器的转发后,服务器收到我们的数据包后回传的数据包在经过我们路由转发时,我们路由器无法到达私网内部。导致数据包能发送到服务器,回包无法被路由转发回到局域网的主机上,从而导致访问失败。

  • 进行SNAT转换后的情况

image.png

在我们添加网关服务器后,网关服务器除了具有路由转发的功能外,还添加了SNAT策略。这样我们局域网的主机可以正常进行发送目标地址为外网服务器的数据包。

数据包在经过网关服务器时,网关服务器除了帮助我们进行数据包的转发外,还额外使用SNAT策略进行数据包的源地址转换,服务器收到的数据包的源地址则为网关服务器接通外网的网关,服务器的响应数据包的目的地址也会正常发送到网关服务器的网关。

网关服务器收到响应数据包后,会将响应数据包的目的地址再修正为局域网地址,从而达到数据包的有去有回,实现局域网与公网之间的通信。

三、SNAT策略的配置实验

如下图所示,我们准备3台虚拟机,其中一台为网关服务器,另外两台虚拟机分别处于局域网和公网

image.png

1. 准备环境

  1. 创建VMNET1和VMNET2一个负责划分局域网,一个模拟外网网段

image.png

  1. 网关服务器需要配置两张网卡

image.png

image.png

两张网卡分别划分到vmnet1与vmnet2的主机模式

image.png

2. 配置网关服务器

重启网关服务器后,进行网关服务器的相关配置:

systemctl stop firewalld  #关闭防火墙
setenforce 0              #关闭selinux

image.png

首先配置ens33网卡

image.png

以修改的ens33为模板修改ens36网卡配置

image.png

image.png

配置完成后,我们重启网卡服务

systemctl restart network

image.png

以上网关服务器的网络配置已全部完成

3. 配置外网服务器网卡

外网服务器同样需要关闭防火墙与selinux

systemctl stop firewalld  #关闭防火墙
setenforce 0              #关闭selinux

image.png

PS:外网服务器的网关配置要与网关服务器连接外网的网卡配置一致,否则网络将无法连通。

配置完成后,我们重启网卡服务

systemctl restart network

4. 配置局域网主机网卡

局域网主机关闭防火墙与selinux

systemctl stop firewalld  #关闭防火墙
setenforce 0              #关闭selinux

image.png

配置完成后,我们重启网卡服务

systemctl restart network

5. 测试局域网主机、网关服务器、外网服务器的网络连通性

网关服务器:

image.png

局域网主机:

image.png

外网服务器:

image.png

总结

在配置完我们的网络设置后,我们局域网与外网的数据包都只能在网关服务器的两个网卡进行接收和响应,数据包流向无法到达对方的主机。因为局域网主机与外网服务器不在同一网段,所以我们要对网关服务器进行一个转发功能的开启,进行数据包的转发。

6. 开启网关服务器的转发功能

vim /etc/sysctl.conf    #配置网络的内核配置文件

image.png

#设置完毕后,加载网络内核配置文件,命令如下
sysctl -p

加载配置文件后,我们可以发现外网服务器与局域网主机可以相互通信进行数据包的转发,实现了IP数据包的转发功能。

image.png

image.png

接下来,我们使用外网服务器安装并开启http服务,提供httpd服务,使用局域网主机访问外网服务器,并且跟踪日志文件内容:

yum install -y httpd                 #下载httpd服务
systemctl start httpd.service        #启动httpd服务 
tail -f /var/log/httpd/access_log    #跟踪日志文件

我们使用局域网主机访问外网服务器IP

image.png PS:我们是在模拟的环境中可以正常访问网页服务,正常的实际环境中,局域网与外网服务器只能实现互相ping通,而无法直接访问网页服务

image.png

可以看到局域网主机访问外网服务器,所使用的源地址仍然是自己的局域网地址,网关服务器只实现了路由的转发功能,并没有实现SNAT的转换

6. 配置网关服务器的SNAT策略

iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens36 -j SNAT --to 12.0.0.254
#指定nat表中的POSTROUTING链(即在数据转发前处理数据包)
#规则内容为源地址为子网掩码为24,IP地址处于192.168.100.0网段的数据包,指定出站网卡为ens36,并且源地址修改为12.0.0.254(即出站网卡的IP)

image.png

配置完成后我们重新进行局域网主机对于外网服务器的网页访问:

image.png

image.png

从上图可以看到,我们更改完iptables的规则后,我们的网页服务依然可以进行访问,并且源地址由局域网主机的IP地址,通过SNAT的转换,转换为了出站网卡的IP地址

四、DNAT的策略及应用

4.1 DNAT策略概述

  • DNAT策略的典型应用环境
    • 在Internet中发布位于企业局域网内的服务器(服务器暴露在公网成本高,安全风险高)
  • DNAT策略的原理
    • 目标地址转换,Destination Network Address Translation
    • 修改数据包的目标地址
  • DNAT策略的典型应用环境图例

image.png

提供服务的服务器位于局域网当中,向公网的客户机提供服务。

五、DNAT的工作原理

  • 进行转换后的DNAT的情况 image.png

从我们上方SNAT的模拟实验可以知道,私网IP作为源地址可以正常使用路由转发功能正常路由。

如上图所示,但是私网IP作为目的地址,是无法被外部客户机直接进行访问的,所以当外部客户端的数据包只能送往网关服务器,希望网关服务器可以协助转发自己的数据包。

到达网关服务器的公网IP的网卡接口时,网卡接收到目的地址为自己网关的IP的数据包后,会通过DNAT的转换,将数据包目的地修改为正确的内网服务器IP,达到内网服务器实现提供服务的效果。

内网服务器后续的响应数据包同样会发送到网关服务器,再由网关服务器通过DNAT的转换,转换为外网当中的客户机,使客户机能够分辨响应数据包是发送给自己的。

六、DNAT策略的配置实验

6.1 实验条件

  • 局域网的web服务器能够访问Internet(即需要进行SNAT配置)
  • 网关的外网IP地址有正确的DNS解析记录(实现DNS解析或映射关系)
  • Linux网关支持IP路由转发

image.png PS:网络设置为仅主机模式,和上文中SNAT的主机网络设置分配相同

6.2 配置局域网服务器

  • 配置网卡

image.png 配置完成后,重启网卡服务

systemctl restart network
  • 开启httpd服务

    yum install -y httpd #安装httpd服务即web服务 systemctl start httpd #开启httpd服务

  • 验证web服务是否开启

image.png

6.3 外网Linux客户机配置

image.png

配置完成后,重启网卡服务

systemctl restart network

6.3 外网windows客户机配置

  • 进入网络设置界面

image.png

  • 进行网络IP地址网关等设置

image.png

image.png

  • 测试网络连通性

image.png

6.4 配置网关服务器

  • 分别配置两个接口的网卡

同上方SNAT操作相同,分别配置局域网,外网的两个网卡配置,配置完成内容如下图所示:

image.png

  • 开启路由转发功能

      vim /etc/sysctl.conf    #配置网络的内核配置文件  配置内容为net.ipv4.ip_forward=1
      sysctl -p               #重新加载配置文件
      
    
  • 配置SNAT策略

      iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens36 -j SNAT --to 12.0.0.254
    
  • 配置DNAT策略

      iptables -t nat -A PREROUTING -d 12.0.0.254 -p tcp --dport 80 -i ens36 -j DNAT --to 192.168.100.50:80
      # -t nat -A PREROUTING     指定nat表中的PREROUTING链(数据转发后的规则链)
      # -d 12.0.0.254            指定目的地址为12.0.0.254的数据包
      # -p tcp --dport 80        指定tcp的80端口的数据包,即httpd协议所使用的端口
      # -i ens36                 指定入站网卡为ens36,即数据包流向是从局域网服务器发出的
      # -j DNAT                  指定策略为DNAT
      # --to 192.168.100.50:80   将符合前置条件的数据包的目的地址转化为IP地址为192.168.100.50且端口号为80的地址
      # 总结: 指定在nat表中的PREROUTING链中,使用DNAT的策略,将目的地址(网关服务器连接外网的网卡IP地址)为12.0.0.254且端口号为80,入站网卡为ens36的数据包中的目的地址转化为192.168.100.50且端口号为80的地址(局域网地址)
    

配置iptables内容如下: image.png

  • 使用外网windows客户机访问

image.png

image.png

  • 使用外网Linux客户机访问

image.png

image.png

6.5 DNAT总结

DNAT可以将我们服务器置于局域网内部进行隐藏,从而提升了服务器的安全性,位于外网中的客户机仅需要访问外网的网关服务器地址,就可以实现访问局域网内部服务器提供的网页服务。

七、数据包的抓包

  • 在windows中使用的抓包工具为wireshark(图形界面选择网卡,根据指定网卡进行抓包)
  • 在Linux中最常用的抓包工具为tcpdump

举例:

tcpdump tcp -i ens33 -t -a 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
# tcp∶ ip、icmp、arp、rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
# -i ens33 :只抓经过接口ens33的包
# -t:不显示时间戳
# -s 0 :抓取数据包时默认抓取长度为68字节。加上"-s 0"后可以抓到完整的数据包
# -c 100 :只抓取100个数据包
# dst port ! 22 :不抓取目标端口是22的数据包
# src net 192.168.1.0/24 :数据包的源网络地址为192.168.1.0/24
# -w ./target.cap ∶ 保存成cap文件,方便用ethereal (即wireshark)分析