Linux防火墙之SNAT和DNAT详解

 更新时间:2025年09月27日 09:09:00   作者:yucfkyu  
SNAT将内网源地址转为公网IP,实现多主机共享;DNAT映射内网服务到公网,供外部访问,iptables和firewalld用于地址转换,前者静态规则,后者动态区域管理

1.SNAT是什么

SNAT又称源地址转换。源地址转换是内网地址向外访问时,发起访问的内网ip地址转换为指定的ip地址(可指定具体的服务以及相应的端口或端口范围),这可以使内网中使用保留ip地址的主机访问外部网络,即内网的多部主机可以通过一个有效的公网ip地址访问外部网络。

真实环境运用中私网可以通过路由转发,将数据包传送给公网IP地址的服务器,而公网地址无法将相应的数据包回还给私网地址的用户。此时二者之间需要一个媒介,就是一个建立在私网和公网之间的网关服务器,对其之间的数据包进行相应的处理。来完成私网IP与公网IP之间的建立联系 

2.DNAT是什么

 DNAT:目的地址转换的作用是将一组本地内部的地址映射到一组全球地址。通常来说,合法地址的数量比起本地内部的地址数量来要少得多。

  • 私网地址只能作为源地址来访问公网IP,而无法作为目标地址被其他主机访问
  • 所以DNAT将私网中web服务器映射到公网IP,使其公网IP作为目标地址被公网中主机进行访问

简单来说:

  • SNAT是对源地址转换
  • DNAT是对目的地址转换

SNAT的典型应用场景

SNAT策略的工作原理

SNAT源地址转换过程:

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

如何用iptables实现地址转换

准备任务

1.准备三台虚拟机

2.给网关服务器添加一张虚拟网卡

3.拓扑:

  • test1:20.0.0.10 内网
  • test2:ens33: 20.0.0.254
  • ens36:12.0.0.254

做SNAT的地址转换

  • test3:12.0.0.100 外网

过程

关闭防火墙

编辑网卡信息

首先ifconfig查看网卡名称(我这里是ens36)

cd /etc/sysconfig/network-scripts
#进入该路径
cp ifcfg-ens33 ifcfg-ens36
#创建新网卡信息

TYPE=Ethernet
DEVICE=ens36
ONBOOT=yes
BOOTPROTO=static
IPADDR=12.0.0.254
NETMASK=255.255.255.0
#GATEWAY=20.0.0.2
#DNS1=8.8.8.8

此处不用设置网关,因为要充当内网网关

TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=20.0.0.254
NETMASK=255.255.255.0
#GATEWAY=20.0.0.2
#DNS1=8.8.8.8

客户机配置

TYPE=Ethernet
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=20.0.0.10
NETMASK=255.255.255.0
GATEWAY=20.0.0.254
#DNS1=218.2.135.1

web配置

TYPE=Ethernet
DEIVCE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=12.0.0.100
NETMASK=255.255.255.0
GATEWAY=12.0.0.254
#DNS1=8.8.8.8

网卡配置结束后,要通过iptables命令添加

iptables -t nat -A POSTROUTING -s 20.0.0.0/24 -o ens36 -j SNAT --to 10.0.0.10
  • -t:指定表名
  • nat:地址转换的表名
  • -A:添加一条规则,在行尾追加
  • POSTROUTING:在出本机的时候添加一个地址转换的规则
  • -s:192.168.233.0/24 指定源IP地址
  • -j SNAT:指定控制类型
  • --to 10.0.0.10 所有源IP属于233.0这个网段,只要你是从ens36出来,都会把它们IP地址转换为10.0.0.10

完成之后,  iptables -t nat -vnL查看

  • 最后,网关服务器要同意转发
vim /etc/sysctl.conf

sysctl -p

立即启动

客户端链接web端(内网链接外网)测试

DNAT地址转换

iptables -t nat -A PREROUTING -d 11.0.0.11 -i ens36 -p tcp --dport 80 -j DNAT --to 20.0.0.10:80

web端连接客户端测试

实验结束

Linux抓包技术--tcpdump

  • tcpdump为Linux自带的抓包工具
  • wireshark只适用于Windows

抓包方式:

  • 1.指定抓包数量
  • 2.动态抓包,一致会获取包,除非人工停止
tcpdump tcp -i ens33 -t -s0 -c 10 and dst port 80 and net 20.0.0.0/24 -w ./target.cap
  • tcpdump:抓包命令,固定开头
  • tcp:抓包的协议
  • -i:经过,只抓经过ens33的数据包
  • -t:不显示时间戳
  • -s0:抓完整的数据包
  • -c:指定抓包的个数
  • dst port:80 访问的是httpd的80端口
  • src net:192.168.233.0/24
  • -w:抓包的数据,保存位置。

firewalld技术

  • firewalld:centos7自带的,和iptables一样,也是包过滤防火墙
  • firewalld过滤,通过区域来进行配置
  • iptables 静态防火墙
  • firewalld 动态防火墙

firewalld 分为以下几个区域

  • trusted :信任区,所有流量都可以传入
  • public :公共区域,允许ssh或者dhcpv6-client的流量可以传入,其他的全部拒绝,也是firewalld的默认区域。
  • external:外部区域,允许ssh或者dhcpv6-client的流量可以传入,其他的全部拒绝,默认通过此区域转发的ipv4流量地址,可以进行伪装
  • home 家庭区域:允许ssh或者dhcpv6-client的流量可以传入,其他的全部拒绝
  • internal:内部区域,默认值与home区域的作用相同
  • work 工作区域,允许ssh或者dhcpv6-client的流量可以传入,其他的全部拒绝
  • DMZ 隔离区 非军事区:允许ssh,其他的预定义好配置,其他的全部拒绝
  • block:限制区,拒绝所有流量
  • drop:丢弃区域,所有流量都会丢弃

firewalld相关命令

firewall-cmd --list-service

查看区域内允许通过的服务

firewall-cmd --add-service=http --zone=public

添加,浏览器20.0.0.10即可看到是否成功

firewall-cmd --remove-service=http --zone=public

删除

firewall-cmd --add-service=http --add-service=ftp --zone=pubilc

添加多个服务

firewall-cmd --list-services

查看

firewall-cmd --add-service={ftp,http}

添加多个的不同方法

firewall-cmd --add-service={ftp,http} --zone=public --permanent

永久生效

firewall-cmd --remove-service=http --zone=public --permanent

删除永久生效的项

firewall-cmd --zone=public --add-port=80/tcp

根据端口添加

firewall-cmd --zone=public --remove-port=80/tcp

移除

firewall-cmd --zone=指定区域
firewall-cmd --zone=public -add-port={3306,80,21}/tcp

添加多个端口

firewall-cmd --zone=public -add-port=30-35/tcp

添加端口的范围

firewall-cmd --list-all 查看

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • apache httpd配置多个端口的实现方法

    apache httpd配置多个端口的实现方法

    本文主要介绍了apache httpd配置多个端口的实现方法,包含了两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • linux实现自动删除最旧的几个文件详解

    linux实现自动删除最旧的几个文件详解

    最近因为工作的原因,有需求要删除Linux中旧的压缩包,发现网上给的答案都是删除N天前的文件,无法适应我的要求,于是自己研究了一翻。所以下面这篇文章主要介绍了关于linux自动删除最旧的几个文件的相关资料,需要的朋友可以参考下。
    2017-09-09
  • 覆盖原先的PATH导致命令失效提示command not found的解决方法

    覆盖原先的PATH导致命令失效提示command not found的解决方法

    今天小编就为大家分享一篇关于覆盖原先的PATH导致命令失效提示command not found的解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • linux下安装openssl、swoole等扩展的详细步骤

    linux下安装openssl、swoole等扩展的详细步骤

    本文给大家详细介绍了linux下安装openssl、swoole等扩展的,本文涉及到编译安装和yum安装的知识点,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2016-10-10
  • Linux服务器查看启动服务的5种方式总结

    Linux服务器查看启动服务的5种方式总结

    本文介绍Linux系统查看服务状态的多种方法,包括systemctl(推荐)、service、检查端口及进程,建议优先使用systemctl查看运行服务,结合ss -tuln验证网络监听,最后用systemctl list-unit-files确认开机自启项,以全面掌握服务情况
    2025-09-09
  • Linux centOS安装JDK和Tomcat的教程

    Linux centOS安装JDK和Tomcat的教程

    今天小编就为大家分享一篇关于Linux centOS安装JDK和Tomcat的教程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Ubuntu设置程序开机自启动的操作步骤

    Ubuntu设置程序开机自启动的操作步骤

    在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下
    2025-06-06
  • 虚拟机Linux桥接模式下设置静态IP详解

    虚拟机Linux桥接模式下设置静态IP详解

    这篇文章主要介绍了虚拟机Linux桥接模式下设置静态IP详解,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • centos7切换启动内核与切换启动模式的讲解

    centos7切换启动内核与切换启动模式的讲解

    今天小编就为大家分享一篇关于centos7切换启动内核与切换启动模式的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 解决Unixbench安装报错信息的问题

    解决Unixbench安装报错信息的问题

    下面小编就为大家分享一篇解决Unixbench安装报错信息的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12

最新评论