SNAT和DNAT

4,717 阅读6分钟

前言

SNAT是原地址转换,DNAT是目标地址转换。区分这两个功能可以简单的由服务的发起者是谁来区分,内部地址要访问公网上的服务时,内部地址会主动发起连接,将内部地址转换成公有ip。网关这个地址转换称为SNAT. 当内部需要对外提供服务时,外部发起主动连接,路由器或着防火墙的网关接收到这个连接,然后把连接转换到内部,此过程是由带公有ip的网关代替内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT.主要用于内部服务对外发布。

SNAT应用场景

当内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换功能称为SNAT,主要用于内部共享IP访问外部网络。 一个IP地址做SNAT转换,一般可以让内网100到200台主机实现上网。

  • 数据包从内网发送到公网时,SNAT会把数据包的源地址由私网IP转换成公网IP。
  • 当相应的数据包从公网发送到内网时,会把数据包的目的地址由公网IP转换为私网IP。
  • 当内网有多台主机访问外网时,SNAT在转换时会自动分配端口,不同内网主机会通过端口号进行区分。

Snipaste_2022-09-18_15-46-26.png

SNAT配置

配置环境:
局域网各主机已正确设置IP地址、子网掩码、默认网关地址
Linux网关开启IP路由转发

Snipaste_2022-09-16_18-27-00.png

配置SNAT策略,实现SNAT功能,将所有192.168.1.0这个网段内的ip的源地址改为12.0.0.254
 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens34 -j SNAT --to 12.0.0.254
 或
 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens34 -j SNAT --to-source 12.0.0.50-12.0.0.100

-A POSTROUTING                   指定POSTROUTING链
-s 192.168.1.0/24                源地址所处的网段(内网IP)
-o ens34                         出站网卡
-j SNAT                          使用SNAT功能
--to 12.0.0.254                  外网IP
--to-source 12.0.0.2-12.0.0.10   外网地址池

非固定的公网IP地址(共享动态IP地址)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens34 -j MASQUERADE

Snipaste_2022-09-18_15-54-21.png

Snipaste_2022-09-18_16-05-03.png

Snipaste_2022-09-18_16-00-18.png

Snipaste_2022-09-18_16-03-46.png

DNAT应用场景

当内部地址需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部将公网IP转换为私网IP,此转换功能称为DNAT,主要用于内部服务对外发布。

  • 数据包从外网发送到内网时,DNAT会把数据包的目标地址由公网IP转换成私网IP。
  • 当相应的数据包从内网发送到公网时,会把数据包的源地址由私网IP转换为公网IP。
  • 客户机想访问服务器时,访问的是网关地址,由网关去找服务器的内网地址。
  • 如果多台服务器使用同一个网关,那么通过不同的端口号来对应不同的服务器

Snipaste_2022-09-18_15-19-16.png

DNAT配置

配置环境
局域网的服务器能够访问Internet
网关的外网地址有正确的DNS解析记录
Linux网关开启IP路由转发

Snipaste_2022-09-16_18-27-00.png

把从ens34进来的要访问web服务的数据包目的地址转换为 192.168.1.100
 iptables -t nat -A PREROUTING -i ens34 -d 12.0.0.254 -p tcp --dport 80 -j DNAT --to 192.168.1.100
 或
 iptables -t nat -A PREROUTING -i ens34 -d 12.0.0.254 -p tcp --dport 80 -j DNAT --to 192.168.1.50-192.168.1.100

-A PREROUTING        修改目标地址的链           
-i ens33             入站网卡
-d 12.0.0.254        数据包的目的地址
-p tcp --dport 80    数据包的目的端口
-j DNAT              使用DNAT功能
--to 192.168.1.100  内网服务器IP

Snipaste_2022-09-18_15-54-21.png

Snipaste_2022-09-18_16-30-08.png

Snipaste_2022-09-18_16-24-53.png Snipaste_2022-09-18_16-28-27.png

iptables与dns分离解析

实验拓扑图 Snipaste_2022-09-18_18-38-09.png

实验要求:
web服务器在内网中,提供http服务。
要求内网中的主机能够通过www.apple.com 访问该web服务。
外网的主机能够通过www.apple.com 访问该web服务。

实验配置

网关服务器配置
关闭firewalld和selinux。开启路由转发功能。 Snipaste_2022-09-18_15-54-21.png

iptables配置

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens34 -j SNAT --to 12.0.0.254
iptables -t nat -A PREROUTING -i ens34 -d 12.0.0.254 -p tcp -j DNAT --to 192.168.1.100

Snipaste_2022-09-18_18-55-34.png

配置dns分离解析

配置主配置文件vim /etc/named.conf Snipaste_2022-09-18_19-00-52.png Snipaste_2022-09-18_19-01-44.png

配置区域配置文件vim /etc/named.rfc1912.zones

view "lan" {
 match-clients {192.168.1.0/24;};   内网解析网段
 zone "apple.com" IN {              域名
   type master;
   file "apple.com.zone.lan";
};
 zone "." IN {
  type hint;
  file "named.ca";
 };
};

view "wan" {
  match-clients {any;};         外网解析
  zone "apple.com" IN {           域名
   type master;
   file "apple.com.zone.wan";
 };
};
将view之外的zones都删除

Snipaste_2022-09-18_19-06-12.png

配置区域数据配置文件

cd /var/named/
cp -p named.localhost apple.com.zone.lan
cp -p named.localhost apple.com.zone.wan
vim apple.com.zone.lan     编辑内网解析文件
vim apple.com.zone.wan     编辑外网解析文件
systemctl start named    

Snipaste_2022-09-18_19-15-52.png Snipaste_2022-09-18_19-16-23.png

内网web服务器配置
关闭firewalld防火墙
编辑网卡配置

Snipaste_2022-09-18_19-19-40.png

安装httpd软件包,写一个网页,启动httpd服务。本地验证一下能否打开该网页。 Snipaste_2022-09-18_19-21-10.png

Snipaste_2022-09-18_19-22-15.png

外网主机配置
关闭firewalld防火墙
编辑网卡服务

Snipaste_2022-09-18_19-23-11.png

实验结果
内外网主机都能访问并解析www.apple.com 服务

Snipaste_2022-09-18_18-57-40.png Snipaste_2022-09-18_18-45-13.png

Snipaste_2022-09-18_18-57-21.png

tcpdump----linux抓包

tcpdump 是一个很常用的网络包分析工具,可以用来显示通过网络传输到本系统的 TCP/IP 以及其他网络的数据包。tcpdump 使用 libpcap 库来抓取网络报,这个库在几乎在所有的 Linux/Unix 中都有。在 Windows 中我们通常会使用 Wireshark 进行图形化操作相当便捷,然而在 Linux 环境中如何巧妙应用 tcpdump 的命令来操作提升效率就显得尤为重要。在本文中,我们将会通过一些实例来演示如何使用 tcpdump 命令。
tcpdump 是一款灵活、功能强大的抓包工具,能有效地帮助排查网络故障问题

tcpdump tcp -i ens33 -t -s 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。Net:网段,host:主机。
 -w ./target.cap               保存成cap文件,方便用ethereal (即wireshark)分析。

Snipaste_2022-09-18_17-37-17.png

Snipaste_2022-09-18_17-35-12.png