Linux网络之iptables

防火墙的基本知识

防火墙的定义

防火墙,也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网,防火墙是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的边界上构造的保护屏障,它按照系统管理员预先定义好的规则来控制数据包的进出,防火墙是系统的第一道防线,主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,其作用是防止非法用户的进入。保障内网的安全性、保证内外网之间数据的流通性。

在网络中,所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术,防火墙是在两个网络通讯时执行的一种访问控制尺度,它能允许你“同意”的人和数据进入你的网络,同时将你“不同意”的人和数据拒之门外,最大限度地阻止网络中的黑客来访问你的网络,换句话说,如果不通过防火墙,公司内部的人就无法访问Internet,Internet上的人也无法和公司内部的人进行通信,也就是说,如果没有防火墙,内网和外网之间就没办法进行交流。

防火墙的分类

防火墙从诞生开始,已经历了四个发展阶段:基于路由器的防火墙、用户化的防火墙工具套、建立在通用操作系统上的防火墙、具有安全操作系统的防火墙。常见的防火墙属于具有安全操作系统的防火墙。

从结构上来分,防火墙有两种:代理主机结构和路由器+过滤器结构;内部网络过滤器(Filter)路由器(Router)Internet

从原理上来分,防火墙则可以分成4种类型:特殊设计的硬件防火墙、数据包过滤型、电路层网关和应用级网关。

一般宏观来说,防火墙分为主机型防火墙,例如我们为了防止个人电脑被攻击,而开启的防火墙,还分为网关型防火墙,一般部署在企业的网关,用于过滤和转发,保证整个企业的网络环境安全性。

按照物理状态又分为:软件防火墙和硬件防火墙

按照功能分:包过滤型、状态检测型和代理性

防火墙的基本工作原理

防火墙通过审查经过的每一个数据包, 判断它是否有相匹配的过滤规则, 根据规则的先后顺序进行一一比较, 直到满足其中的一条规则为止,
然后依据控制机制做出相应的动作. 如果都不满足, 则将数据包丢弃, 从而保护网络的安全.

包过滤防火墙工作原理

数据包从外网传送到防火墙后, 防火墙抢在IP层向TCP层传送前, 将数据包转发给包检查模块进行处理.
首先与第一个过滤规则比较.
如果与第一个模块相同, 则对它进行审核, 判断是否转发该数据包, 这时审核结果是转发数据包, 则将数据包发送到TCP层进行处理, 否则就将它丢弃.
如果与第一个过滤规则不同, 则接着与第二个规则相比较, 如果相同则对它进行审核, 过程与(3)相同.
如果与第二个过滤规则不同, 则继续与下一个过滤规则比较, 直到与所有过滤规则比较完成. 要是所有过滤规则都不满足, 就将数据包丢弃.

在这里插入图片描述

netfilter/iptables简介

netfilter/iptables(下文简称为iptables)组成Linux平台下的包过滤防火墙, 与大多数的Linux软件一样,这个包过滤防火墙是免费的, 它可以代替昂贵的商业防火墙解决方案, 完成封包过滤, 封包重定向和网络地址转换NAT等功能.

虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体, 但它实际上由两个组件 netfilter 和iptables 组成.netfilter 组件也称为内核空间(kernelspace)组件, 是内核的一部分, 由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集. iptables 组件是一种工具, 也称为用户空间(userspace), 它使插入,修改和除去信息包过滤表中的规则变得容易.

netfilter/iptables 可用于添加, 编辑和除去规则,这些规则是在做信息包过滤决定时, 防火墙所遵循和组成的 规则.这些规则存储在专用的信息包 过滤表 中, 而这些表集成在 Linux内核中. 在信息包过滤表中, 规则被分组放在我们所谓的 链(chain)中.

iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过 iptables这个代理,将用户的安全设定执行到对应的安全框架中,这个安全框架”才是直正的防火墙,这个框架的名字叫 netfilter。
netfilter才是防火墙真正的安全框架( framework), netfilter位于内核空间。
iptables其实是个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/ iptables(下文中简称为 iptables)组成 Linux平台下的包过滤防火墙,与大多数的 Linux软件一样,这个包过滤防火墙是兔费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Netfilter是 Linux操作系统核心层内部的—一个数据包处理模块,它具有如下功能:
网络地址转换( Network Address Translate)
数据包内容修改以及数据包过滤的防火墙功能。
所以说,虽然我们使用 service iptables start启动 iptables"服务",但是其实准确的来说, iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

netfilter的工作逻辑

  • 流量通过网卡发送到主机后,会先流向内核空间的prerouting钩子函数,经过一系列规则过滤之后流向了路由表;

  • 路由表根据路由规则匹配数据报文,通过包头信息判断出数据包是否归属当前主机,若数据报文属于当前主机则会将该数据报文发送给input钩子函数,否则会发送给forwarding钩子函数;

  • input钩子函数经过一系列规则过滤之后从将数据从内核空间发送给用户空间的应用程序处理;

  • forwarding钩子函数经过一系列规则过滤之后从将数据从再一次发送给路由表;

  • 用户空间的程序如果想要发送数给其它主机,需要将数据从用户空间发送给内核空间的output钩子函数,output钩子函数经过一系列规则过滤之后也将数据发送给路由表;

  • 路由表根据路由规则匹配吓一跳路由,数据经过postrouting钩子函数发送给网卡; iptables报文流向规则
    在这里插入图片描述

Iptables数据流向

  • 入站数据流向(即流入本机流量:PREROUTING —> INPUT )
    从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

  • 转发数据流向(转发的流量: PREROUTING --> FORWARD —> POSTROUTING )
    来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

  • 出站数据流向(由本机流出的流量:OUTPUT —> POSTROUTING)
    防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

在这里插入图片描述

工作机制(三表五链)

链: 链就是位置,共有五个 : 数据包进路由之前(PREROUTING)、目的地址为本机,进系统(INPUT)、转发(FORWARD)、原地址为本机,向外发送,出系统(OUTPUT)、发送到网卡之前,出路由(POSTROUTING);
数据包到了该链处,会去对应表中查询设置的规则,然后决定是否放行、丢弃、转发还是修改等等操作。每个链都是一个规则列表,对对应的包进行匹配。

表:具有相同功能的规则的集合叫做表。
filter表:负责过滤功能,经过内核的;
nat表:网络地址转换,不经过内核的,实现数据包转发,修改源地址 端口 目标地址 端口,实现地址转换;
mangle表:拆解报文,作出修改,封装报文;
raw表:关闭nat表上启用的链接追踪机制。

表链关系: 我们所有自定义的规则都是这四种分类中的规则,或者说,所有的规则都存在于这4张表中。
filter表格:放的是经过内核的ip input output forward
nat表格:放的不是经过内核的服务 input output postrouting prerouting
备用表格mangle: input output forward postrouting prerouting
在这里插入图片描述
在这里插入图片描述

iptables结构

1、表:容纳各种规则链;表是按照功能分的类,具体功能如下:
(1)raw表:用来决定是否对数据包进行状态跟踪。(不常用)
(2)mangle表:为数据包设置标记,有ACK、SYN、FIN、RST、PSH、URG等标记。(不常用)
(3)nat表:修改数据包的IP地址、端口等信息。(网关型防火墙常用)
(4)filter表:确定是否放行数据包。(常用)
2、链:容纳各种防火墙规则;链是按照时机分的类。
  (1)input:处理入站请求包
  (2)output:处理出站包(就是响应、应答包)
  (3)forward:处理转发数据包,实现不同网段间的通信
  (4)prerouting:在包做路由选择之前应用此链的规则
  (5)postrouting:在数据包做路由选择之后应用此链的规则

注:初学者很难把表和链的关系联系起来,首先大家要牢记,表是按照功能分类,链是按照时机分类,这里给大家举个例子,比如第三条意思是:只有在路由前和路由后还有出站的时候才能修改数据包的IP地址和端口信息。

数据包过滤的匹配流程

1、规则表之间的顺序:raw→mangle→nat→filter
2、规则链之间的顺序:
  (1)入站数据流向:prerouting→input
  (2)出站数据流向:output→postrouting
  (3)转发数据流向:prerouting→forward→postrouting
注:(1)和(2)多用于主机型防火墙,(3)多用于网络型防火墙

在这里插入图片描述

iptables的参数 含义

-t指定表名称
-n不作解析
-L列出指定表中的策略
-A增加策略
-p网络协议
–dport端口
-s数据来源
-j动作:ACCEPT允许;REJECT拒绝;DROP丢弃
-N增加链
-E修改链名称
-X删除链
-D删除指定策略
-I插入
-R修改策略
-P修改默认策略

防火墙可作为路由器起转发作用

(1)永久生效方法
  vim etc/sysctl.conf
  修改
  forward = 1
  sysctl -p(立即生效)

(2)临时生效方法
  echo 1 > /proc/sys/net/ipv4/ipforward
  或者 sysctl -w net.ipv4.ip_forward=1

编写iptables的规则的注意事项

根据匹配规则来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作做出处理。
		匹配条件支持以下两种条件:
			基本匹配条件:内建
			扩展匹配条件:由扩展模块定义
		处理动作:
			基本处理动作:内建
			扩展处理动作:由扩展模块定义
			自定义处理机制:指的是自定义链
	iptables的链(chain):
		内置链:
			对应netfilter内核框架的钩子函数(hook function)
		自定义链接:
			用于内置链的扩展和补充,可实现更灵活的规则管理机制。
	添加规则时的重要考量点:
		(1)要实现那种功能:即判断添加到哪个表上。
		(2)报文流经的路径:即判断添加到哪里链上。
	链上的规则次序,即为检查的次序,换句话说,就是链上的规则从上往下依次匹配,一旦匹配上就不再往下匹配,若一条规则都没有匹配上则执行默认规则。

因此,定义链上规则次序隐含一定的应用法制:
		(1)同类规则(访问同一应用):匹配范围小的放在上面,举例如下:
			访问apache服务时,我们的规则是匹配172.200.0.0/21这个网段可以访问,其中172.200.1.110/21这台主机不允许访问,默认策略是拒绝所有主机,此时我们应该将拒绝172.200.1.110/21这条规则放在最上面,如果我们将172.200.0.0/21这条规则放在最上面则达不到要想拒绝172.200.1.110/21这台主机访问的效果。
		(2)不同类的规则(访问不同应用),匹配到报文频率较大的放在上面,举例如下:
			假设服务器有两个应用,sshd服务和haproxy服务,如果有2000万个请求量都是访问复杂均衡器haproxy的,我们应该将haproxy的规则放在上面,否者这2000万个连接每次访问haproxy之前都得先和匹配sshd的规则,发现访问的应用不是sshd后再去匹配第二天规则,从而大量浪费iptables的性能,如果将访问量较多的harpyx规则放在上面,大多数连接都会第一时间匹配到haproxy对应的规则,从而提升性能。
		(3)将哪些可由一条规则描述的多个规则合并起来,举例如下:
			如果又连续10条规则可以合并为一条建议大家合并为一条规则,否则数据包达到服务器时会依次匹配10次,如果合并10条规则为1条规则时,则可以减少九次匹配的时间,从而提升了工作效率。
所有规则都没有匹配上则执行默认策略,默认策略如果是拒绝(REJECT[这种方式会响应客户端数据报文,明显的拒绝,不推荐使用]或者DROP[这种方式是悄悄地把数据报文丢掉,推荐使用]),则说明在该链上定义的是白名单,如果默认策略是允许(ACCEPT),则说明在该链上定义的是黑名单。生产环境中建议大家使用白名单。

表命令

-t<表>:   指定要操纵的表
-A:  向规则链末尾中添加,追加条目;(append)
-D:  从规则链中删除条目;(delete)
-I:  向规则链的开头(或者指定序号)中插入条目,未指定规则序号时,默认作为第一规则;(insert)
-R:  替换规则链中的条目;
-L:  显示规则链中已有的条目;(list)
-F:  清除规则链中已有的条目,若位置定规则序号,则默认清空所有;(flush)
-v:    查看规则列表时显示详细信息(verbose)
-Z:  清空规则链中的数据包计算器和字节计数器;
-N:  创建新的用户自定义规则链;
-P:  定义规则链中的默认目标;(police)
-h:  显示帮助信息;
-p:  指定要匹配的数据包协议类型;
-s:  指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
iptables命令选项输入顺序:
	iptables  -t 表名 <-A/I/D/R>  规则链名  [规则号]  <-i/o 网卡名>  -p  协议名  <-s  源IP/源子网>  -- sport  源端口  <-d 目标IP/目标子网>  -- dport  目标端口  -j  动作

常用命令

		-A 追加规则-->
			iptables -A INPUT
		-D 删除规则-->
			iptables -D INPUT 1(编号)
		-R 修改规则-->
			iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)
		-I 插入规则-->
			iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
		-L 查看规则-->
			iptables -L INPUT 列出规则链中的所有规则
		-N 新的规则-->
			iptables -N allowed 定义新的规则

通用参数

		-p	协议  
			例:iptables -A INPUT -p tcp
		-s	源地址 
			例:iptables -A INPUT -s 192.168.1.1
		-d	目的地址
			 例:iptables -A INPUT -d 192.168.12.1
		-sport	源端口 
			例:iptables -A INPUT -p tcp --sport 22
		-dport	目的端口 
			例:iptables -A INPUT -p tcp --dport 22
		-i	指定入口网卡 
			例:iptables -A INPUT -i eth0
		-o	指定出口网卡 
			例:iptables -A FORWARD -o eth0
		-j 	指定要进行的处理动作
			常用的ACTION:
				DROP:丢弃
				REJECT:明示拒绝
				ACCEPT:接受
				SNAT基于原地址的转换
				MASQUERADE(动态伪装)--家用带宽获取的外网ip,就是用到了动态伪装
				DNAT目标地址转换
				MASQUERADE:源地址伪装
				REDIRECT:重定向:主要用于实现端口重定向
				MARK:打防火墙标记的
				RETURN:返回 在自定义链执行完毕后使用返回,来返回原规则链。

匹配(match)

每个iptables规则都包含一组匹配以及一个目标,iptables匹配指的是数据包必须匹配的条件,只有当数据包满足所有的匹配条件时,iptables才能根据由该规则的目标所指定的动作来处理该数据包
		匹配都在iptable的命令行中指定
			source--匹配源ip地址或网络
			destination (-d)--匹配目标ip地址或网络
			protocol (-p)--匹配ip值
			in-interface (-i)--流入接口(例如,eth0)
			out-interface (-o)--流出接口
			state--匹配一组连接状态
			string--匹配应用层数据字节序列
			comment--在内核内存中为一个规则关联多达256个字节的注释数据

目标(target)

		iptables支持一组目标,用于数据包匹配一条规则时触发一个动作
		ACCEPT--允许数据包通过
		DROP--丢弃数据包,不对该数据包做进一步的处理,对接收栈而言,就好像该数据包从来没有被接收一样
		LOG--将数据包信息记录到syslog
		REJECT--丢弃数据包,同时发送适当的响应报文(针对TCP连接的TCP重要数据包或针对UDP数据包的ICMP端口不可达消息)
		RETURN--在调用链中继续处理数据包
	管理命令
		 1.链管理命令(这都是立即生效的)
			-P :设置默认策略的(设定默认门是关着的还是开着的)
				默认策略一般只有两种
					iptables -P INPUT (DROP|ACCEPT)
					默认是关的/默认是开的
				比如:
					iptables -P INPUT DROP
					这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了
			-F: FLASH,清空规则链的(注意每个链的管理权限)
				iptables -t nat -F PREROUTING
				iptables -t nat -F 清空nat表的所有链
			-N:NEW 支持用户新建一个链
				iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
			-X: 用于删除用户自定义的空链
				使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了
			-E:用来Rename chain主要是用来给用户自定义的链重命名
				-E oldname newname
			-Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
				 iptables -Z :清空
		2.规则管理命令
			-A:追加,在当前链的最后新增一个规则
			-I num : 插入,把当前规则插入为第几条。
				-I 3 :插入为第三条
			-R num:Replays替换/修改第几条规则		
				格式:iptables -R 3 …………
			-D num:删除,明确指定删除第几条规则
		3.查看管理命令 “-L”
			    	附加子命令
				-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
				-v:显示详细信息
				-vv
				-vvv :越多越详细
				-x:在计数器上显示精确值,不做单位换算
				--line-numbers : 显示规则的行号
				-t nat:显示所有的关卡的信息

在这里插入图片描述

实践演练

配置路由器

防火墙中设置对httpd服务的影响 firewalld的地址伪装和端口转发
地址伪装是通过地址伪装,NAT设备将经过设备的包转发到指定的接收方,同时将通过的数据包源地址更改为其NAT设备自己的接口地址。当返回的数据包到达时,会将目的地址修改为原始主机的地址并做路由。地址伪装可以实现局域网多个地址共享单一公网地址上网。

IP地址伪装仅支持ipv4,不支持ipv6。

配置双网卡 路由器网络配置

在这里插入图片描述

在这里插入图片描述
添加地址伪装功能
在这里插入图片描述
客户端IP为192.168.0.226
在这里插入图片描述
网关为192.168.0.126
在这里插入图片描述
客户端和服务端网络能通
在这里插入图片描述

iptables命令行

man iptables
在这里插入图片描述

先关闭firewall
在这里插入图片描述
分别查看firewall和iptables的状态,不可以同时打开在这里插入图片描述
iptables -t filter -nL 不作解析 查看filter表格里面的链( 不跟-t,默认为filter表格
在这里插入图片描述
iptables -t filter -nL 不作解析 查看filter表格里面的链( 不跟-t,默认为filter表格
在这里插入图片描述
iptables -t filter - L 作解析查看filter表格里面的链
在这里插入图片描述
iptables -F清除所有策略
在这里插入图片描述
service iptables save 保存,

在这里插入图片描述
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT 接受所有访问22端口的
在这里插入图片描述
iptables -t filter -A INPUT -s 172.25.254.25 -p tcp --dport 22 -j REJECT 拒绝172.25.254.25 访问22端口
在这里插入图片描述
iptables -D INPUT 2 删除第二条
在这里插入图片描述
iptables -t filter -I INPUT 1 -s 172.25.254.73-p tcp --dport 22 -j REJECT 插入策略默认插入到第一条。
在这里插入图片描述
iptables -t filter -R INPUT 1 -s 172.25.254.25 -p tcp --dport 22 -j DROP
修改策略的动作 REJECT–> DROP 从有拒绝提示到没有提示
在这里插入图片描述

iptables -S INPUT 显示所有已添加策略

在这里插入图片描述

iptables -N redhat 新建链

在这里插入图片描述

 iptables -E redhat RANRAN 修改链的名称

在这里插入图片描述

iptables -P INPUT DROP 修改链的默认策略

在这里插入图片描述

默认策略只可以修改为DROP和ACCET在这里插入图片描述

iptables -t nat -A POSTROUTING -o(output) eth0 -j SNAT --to-source 172.25.254.126(开启地址伪装功能

在这里插入图片描述

(1)iptables -A INPUT-m state --state ESTABLISHED,RELATED -j ACCEPT  允许当前正在运行的程序
(2)iptables -A INPUT-m state --state NEW -I lo -j ACCEPT 接受从内部lo口发出的信息
(3)iptables -A INPUT-m state --state NEW -p tcp --dport 22 -j ACCEPT 接受所有访问22端口(sshd)
(4)iptables -A INPUT-m state --state NEW -p tcp --dport 53 -j ACCEPT 接受所有访问53端口(httpd)
(5)iptables -A INPUT-m state --state NEW -p tcp --dport 3128 -j ACCEPT 接受所有访问3128端口(squid)
(6)iptables -A INPUT -j REJECT 拒绝其他所有访问

在这里插入图片描述在这里插入图片描述在这里插入图片描述

参考链接

Linux防火墙核心概念详解

iptables 防火墙工作原理及知识点图文详解

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值