iptables实现网络防火墙(二)——SNAT与DNAT

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

前言

        在前面的文章中,我们曾经简单的介绍过Linux内核中防火墙的基本概念,以及四表五链的相关知识,可参看 LINUX 防火墙介绍。 并且也介绍了如何在Linux环境中搭建一个能够过滤协议和端口的简单网络防火墙,可以参看Linux实现网络防火墙(一)。 
        在实际生产应用中,防火墙的功能纷繁复杂,就像我们之前介绍的四表五链,以及数据包的流向,在实际应用中都是有着关键性的作用的。今天要介绍的SNAT和DNAT就是构建防火墙规则中几个个重要应用。其中DNAT在LVS集群应用中也有着很重要的作用,这一点我们以后再说。

什么是SNAT和DNAT呢

        NAT(Network Address Translation),又称作网络地址转换,顾名思义,就是在网络数据的传输过程中,对网络地址进行转换以达到网络数据传输的目的。相关详细的解释可以参考(网络地址转换–维基百科)。 
        SNAT(源地址转换)和DNAT(目标地址转换) 是在防火墙中,对NAT的两种应用方式。前面我们介绍过,防火墙中有四个表,一种一个表就是nat表,这个nat表就是用来对包地址进行管理的。

SNAT

        SNAT 只的是在网络传输过程中,将源地址进行转换。我们都知道,在访问互联网的过程中,网络是以数据包的形式进行传输的,而数据包中包含了目标地址和源地址,这样,就能够保证我们请求的服务器在处理数据之后,数据还能够返回。SNAT就是将数据包中源目标地址进行了转换。 
        IPV4地址数量,有限,但是全球各地却有着大量的计算机能够进入到互联网访问资源,这里使用的就是SNAT地址转换。
        在一个公司内部搭建了局域网,局域网内的用户想要访问互联网就需要使用SNAT技术进行地址转换,同时由于源地址发生了变化,也相对的提升了局域网内主机的安全。

        SNAT 的网络拓扑结构如下所示。备注,图中所注的IP地址为笔者实验环境的IP地址,只为增加理解,顺便进行下面的实验,实际生产中,IP地址应该会有所不同。

环境说明

担任角色 系统环境 主机名 地址 功能描述
WEB服务器 CentOS 7 web 172.18.3.77 提供web服务
Linux防火墙 CentOS 7 iptables 172.18.2.77 192.168.2.77 定义防火墙规则
局域网用户 CentOS 6 lan 192.168.2.66 访问互联网

SNAT的网络结构拓扑

        只有在局域网内的主机请求互联网上的服务时,才会发生源地址转换,结合下面的数据流转过程就会很容易理解。

SNAT 数据流向

DNAT

        如果我们在局域网内部署了一套WEB服务,但是我们想在互联网上进行访问,这时应该如何解决。对于公司来说,可能只有一个ipv4地址链接了互联网。
        这时就需要使用到DNAT,也就是目标地址转换。从下面的网络拓扑图中我们可以看到,互联网上的主机想要访问局域网内部的网络服务,具有外部网络地址的防火墙或者路由来进行。

担任角色 系统环境 主机名 地址 功能描述
互联网用户 CentOS 7 web 172.18.3.77 访问局域网内web服务
Linux防火墙 CentOS 7 iptables 172.18.2.77 192.168.2.77 定义防火墙规则
局域网WEB服务 CentOS 6 lan 192.168.2.66 提供web服务

DNAT数据流程

如何在防火墙上定义NAT规则?

        上面介绍了许多关于SNAT和DNAT的相关概念,那么在防火墙中应该如何定义NAT规则呢?
        在之前的文章中,我们知道NAT表能够影响的由四个链,分别是PREROUTING链,INPUT链,OUTPUT链,POSTROUTING链,根据前面的图示以及我们的分析,可以总结出,SANT的防火墙过滤规则应该定义在POSTROUTING链上,而DNAT防火墙的过滤转发规则应该定义在PREROUTING链上,这样就能够将网络请求进行转发了。

实验实现SNAT

实验环境

清除防火墙的过滤规则,关闭SELinux 
开启防火墙的路由转发功能,确保局域网内用户能够ping通互联网服务。
进行网络测试

# 清除防火墙过滤规则
[root@iptables ~]#iptables -F 

# 开启转发功能
[root@iptables ~]#echo 1 > /proc/sys/net/ipv4/ip_forward

# 局域网内用户可以ping通互联网
[root@lan ~]$ping 172.18.3.77
PING 172.18.3.77 (172.18.3.77) 56(84) bytes of data.
64 bytes from 172.18.3.77: icmp_seq=1 ttl=63 time=1.00 ms
64 bytes from 172.18.3.77: icmp_seq=2 ttl=63 time=1.52 ms


# 局域网内用户可以访问互联网
[root@lan ~]$curl http://172.18.3.77
www.google.com

实验过程

首先对192.168.2网段的请求进行SNAT地址转换,转换后的源地址变为172.18.2.77

[root@iptables ~]#iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 172.18.2.77

# 查看一下nat表的防火墙规则
[root@iptables ~]#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 1 packets, 229 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 1 packets, 229 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       all  --  *      *       192.168.2.0/24       0.0.0.0/0            to:172.18.2.77

从局域网内部访问互联网的服务,还是可以正常访问

[root@lan ~]$curl http://172.18.3.77
www.google.com

在互联网的那台主机上查看一下最近的访问记录,可以看到最近的一条访问信息是由172.18.2.77访问而来的,这说明,发生了网络地址转换。

[root@web ~]#tail -1 /var/log/httpd/access_log
172.18.2.77 - - [23/Oct/2017:15:46:35 +0800] "GET / HTTP/1.1" 200 15 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

总结一下SNAT的命令格式

iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP

实验实现DNAT

实验环境

清除SNAT实验里设置的各种过滤规则。
互联网的主机,能够访问防火墙主机,但是不能够访问局域网内的网络服务,通过防火墙的外网IP也不能够访问。

# 直接访问内网服务不可行
[root@web ~]#curl http://192.168.2.66
curl: (7) Failed to connect to 192.168.2.66: Network is unreachable

# 通过防火墙的外网IP访问也不行
[root@web ~]#curl http://172.18.2.77
curl: (7) Failed connect to 172.18.2.77:80; Connection refused

# 可以访问到防火墙的地址
[root@web ~]#ping 172.18.2.77
PING 172.18.2.77 (172.18.2.77) 56(84) bytes of data.
64 bytes from 172.18.2.77: icmp_seq=1 ttl=64 time=0.857 ms
64 bytes from 172.18.2.77: icmp_seq=2 ttl=64 time=0.642 ms

实验过程

        根据之前,我们的讨论,我们应该在nat表的PREROUTING链上添加策略,将访问公网地址(172.18.2.77)的请求转发到内网地址(192.168.2.66)。

[root@iptables ~]#iptables -t nat -A PREROUTING -d 172.18.2.77 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.66:80

# 查看一下建立好的规则
[root@iptables ~]#iptables -vnL -t natChain PREROUTING (policy ACCEPT 7 packets, 1351 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            172.18.2.77          tcp dpt:80 to:192.168.2.66:80

Chain INPUT (policy ACCEPT 7 packets, 1351 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

此时,再从互联网主机通过外网IP访问局域网内服务的话,就能够看到不一样的结果。

[root@web ~]#curl http://172.18.2.77
LAN SERVER

查看局域网内的web服务器的访问日志,就可以看到有一条由外网主机访问到的记录。

[root@lan ~]$tail -1 /var/log/httpd/access_log 
172.18.3.77 - - [25/Sep/2017:07:34:18 +0800] "GET / HTTP/1.1" 200 11 "-" "curl/7.29.0"

至此DNAT的防火墙策略就已经配置完成了。

总结一下DNAT的命令格式

iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]

经过上面的配置和学习,我们搭建了简单的网络防火墙。实际生产中可以根据自己的实际情况进行更加详细的设置。

资料参考

本文部分思路和图示参考自以下博客,在此致敬。

http://ximenfeibing.blog.51cto.com/8809812/1652136/


个人博客地址:http://www.pojun.tech/ 欢迎访问


     本文转自Eumenides_s 51CTO博客,原文链接:http://blog.51cto.com/xiaoshuaigege/1975277,如需转载请自行联系原作者


相关文章
|
6月前
|
传感器 运维 监控
《计算机系统与网络安全》 第十章 防火墙技术
《计算机系统与网络安全》 第十章 防火墙技术
77 0
|
6月前
|
Linux
centos使用iptables实现nat端口转发
centos使用iptables实现nat端口转发
243 4
|
1月前
|
数据采集 监控 安全
网络安全产品之认识入侵检测系统
随着计算机网络技术的快速发展和网络攻击的不断增多,单纯的防火墙策略已经无法满足对安全高度敏感的部门的需要,网络的防卫必须采用一种纵深的、多样的手段。因此,入侵检测系统作为新一代安全保障技术,成为了传统安全防护措施的必要、有效的补充。[《安全防御之入侵检测与防范技术》](http://xiejava.ishareread.com/posts/48309864/)介绍了入侵检测技术,今天让我们从入侵检测系统的工作原理、主要功能、主要类型及与入侵防御系统的关系与区别等方面认识入侵检测系统。
42 2
|
1月前
|
SQL 监控 安全
网络安全产品之认识WEB应用防火墙
随着B/S架构的广泛应用,Web应用的功能越来越丰富,蕴含着越来越有价值的信息,应用程序漏洞被恶意利用的可能性越来越大,因此成为了黑客主要的攻击目标。传统防火墙无法解析HTTP应用层的细节,对规则的过滤过于死板,无法为Web应用提供足够的防护。为了解决上述问题,WAF应运而生。它通过执行一系列针对HTTP、HTTPS的安全策略,专门对Web应用提供保护。
36 1
|
1月前
|
人工智能 监控 安全
网络安全知识入门:Web应用防火墙是什么?
网络安全知识入门:Web应用防火墙是什么?
22 1
|
2月前
|
弹性计算 Linux 网络安全
三步搭建VPC专有网络NAT网关,配置SNAT和DNAT规则(补充版)
申明:该文档参考于用户 “帅宝宝”的文档进行的优化,新增永久生效的方式
283 1
|
2月前
|
云安全 安全 网络协议
网络安全产品之认识防火墙
防火墙是一种网络安全产品,它设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间,通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况,以此来实现网络的安全保护。
68 0
|
6月前
|
安全 Unix 网络安全
《计算机系统与网络安全》第十一章 入侵检测与防御技术
《计算机系统与网络安全》第十一章 入侵检测与防御技术
71 0
|
3月前
|
安全 网络安全
网络安全攻防技术:防火墙的实践应用
网络安全攻防技术是当今社会中最重要的话题之一。为了保护我们的个人信息和企业数据,我们需要使用各种安全工具和技术来打击网络攻击。本文将介绍防火墙的实践应用,以帮助您更好地保护您的网络安全。
|
3月前
|
网络协议 Linux 网络安全
Linux-SNAT和DNAT
Linux-SNAT和DNAT
36 0