防火墙管理

一、概述

iptables并不是真正意义上的防火墙,我们可以理解为一个客户端工具,用户通过iptables这个客户端,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架就是Netfilter.

防火墙是工作在内核中的,即防火墙应该是内核中所实现的功能,netfilter才是防火墙真正的安全框架,netfilter位于内核空间;iptables是一个命令行工具,位于用户空间,通过这个命令行工具来操作netfilter

netfilter组件是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规律集。

iptables组件是一种工具,它使插入、修改和除去信息包过滤表中的规则变得容易。通过使用用户空间,可以构建自己的定制规则,将这些规则存储在内核空间的信息包过滤表中

**netfiler/iptables信息包过滤系统(防火墙)是一种功能强大的工具,可用于添加、编辑和除去规则,完成封包过滤,封包重定向和网络地址转换(NAT)等功能。**这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在所谓的 链(chain)中。

防火墙分类
从逻辑上分类:

分类说明
主机防火墙针对单个主机进行防护
网络防火墙处于网络入口或者边缘,针对网络入口进行防护,服务于防火墙背后的本地局域网

从物理上分类:

分类说明
硬件防火墙在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高
软件防火墙应用软件处理逻辑运行处于通用硬件平台之上的防火墙,性能低,成本低

二、四表五链

防火墙是基于规则来进行工作
规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。

规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。

配置防火墙的主要工作就是添加、修改和删除这些规则

当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点,我们说过,netfilter才是真正的防火墙,它是内核的一部分。所以,如果我们想要防火墙能够达到"防火"的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡,而这些关卡在iptables中不被称为"关卡",而被称为"链"。

除过这两个关卡以外,还有其他关卡(链),比如: “路由前”、“转发”、“路由后”,对应英文表示为PREROUTING、FORWARD、POSTROUTING
在这里插入图片描述
对于收到的每个数据包,都从“A”点进来,经过路由判决,如果是发送给本机的就经过“B”点,然后往协议栈的上层继续传递;否则,如果该数据包的目的地不是本机,那么就经过“C”点,然后顺着“E”点将该包转发出去。

对于本机发送的每个数据包,首先也有一个路由判决,以确定该包是从哪个接口出去,然后经过“D”点,最后也是顺着“E”点将该包发送出去。

协议栈这五个关键点A,B,C,D和E就是我们Netfilter中的链:PREOUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

(一)5个内置的链

在这里插入图片描述
在内核中的TCP/IP协议栈上选择了5个关卡(又称为“链”),这5个关卡是报文一定会流经的位置,并配置5个钩子函数(hook_function);当有报文经过时,被钩子函数钩起,对规则进行检查,并按照一定的机制(又可称为“功能”)完成处理

PREROUTING
报文刚刚到达本机后是发往本机内部还是经由本机转发的,需要作出判断,可以根据目标地址检查路由表来判断,这也就意味着接下来有一个路由功能要实现,即有一个路由选择的过程。而这个位置在路由选择发生之前就要完成,所以称为PREROUTINNG.

INPUT

FORWARD

一旦PREROUTING结束了,报文就有两个走向,第一,要么是到本机内部,第二要么是经过本机转发。这两种情形,到本机内部有一个专门的钩子叫NPUT,经由本机转发称为FORWARD。

OUTPUT

而对于一个网卡来讲,若将其当作是报文流出的接口,那报文要通过这个网卡流出时的来源有两种可能,第一种是转发而后出去的,第二种是由本机内部发出的。而本机内部发出的称为OUTPUT

POSTROUTING

无论是由本地转发的还是经由本机内部发出的,将来它在离开本机之前需要再做一次路由选择,那就意味着路由选择发生以后要走哪条路就确定了。那第二次路由决策发生以后我们要对其做一些即将离开本机之前最后那一关再给它做一些处理,这就叫POSTROUTING,这是第二次路由决策发生以后用于做出处理的。
在这里插入图片描述
报文的流向:
到本机某进程的报文:PREROUTING —> INPUT
由本机转发的报文:PREROUTING —> FORWARD —> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT —> POSTROUTING

其实不管是PREROUTING也好,还是POSTROUTING也罢,其实它们与网卡无关,从哪个网卡进来在路由发生之前都叫PREROUTING,无论即将通过哪个网卡离开,在路由决策发生以后都叫POSTROUTING。所以它们跟网卡是没有什么关系的,它们只是TCP/IP协议栈上的功能,可以从任意一个网卡离开,从任意一个网卡进来

除了五条内置链,用户还可以对链进行自定义

(二)四表

如果说在这个FORWARD上,它既然是转发的,那么在这里添加规则的目的是什么呢?定义哪些可以转发,哪些不可以转发,那为什么转发时要做限制呢?

这其实就是网络防火墙的意义了,iptables也可以用来扮演网络防火墙的角色,怎么扮演呢?把它的规则定义在FORWARD上,如果这个时候公司里只有一个主机或一根网线能够跟外部网络通信,然后把这个网线接到Linux主机上。内网所有主机都把这个Linux主机的内网网卡当网关,那就意味着所有的报文只要跟非本地网络的通信都要经过它,那我们就可以在它上面的访问列表上做好规则,比如能访问或者不能访问QQ等这一系列规则都可以在上面定义,而且我们对应哪些允许通过的主机都给它放行,哪些不允许通过的通通拒绝掉,那就能实现所谓的网络防火墙的功能了。

因此iptables可以扮演本地主机防火墙利用INPUT链、OUTPUT链即可,而又能扮演网络防火墙利用FORWARD链即可

把具有相同功能的规则的集合叫做“表”,不同规则放置于不同表中工作,在iptables中定义了四种表,每种对应不同的功能。

filter:过滤,最根本的功能,这是被称为防火墙赖以生存的根本。

nat:network address translation,网络地址转换;如果工作在网络地址转换这种模式的话,从这个角度讲,iptables这个主机更像是一个nat服务器。(nat是用来改源IP、源端口、目标IP、目标端口的)

mangle:拆散报文,做出修改,封装报文;把一个报文拆开后,除了地址转换外,其他科转换的部分都可以拿来修改。

raw:关闭nat表上启用的连接追踪机制;是nat功能的一种补充;想要完成nat功能需要启动连接追踪功能才能进行做nat地址转换,而如果关闭了nat追踪机制的话,接下来可能在有些地方就会产生一些问题,所以raw功能用的并不是特别多。

各表所对应的链:

filterINPUT、FORWARD、OUTPUT
natPREROUTING(DNAT,目标地址转换)、OUTPUT(SNAT,源地址转换)、POSTROUTING(SNAT,源地址转换)、INPUT(centos7中有而centos6中没有)
manglePREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
rawPREROUTING、OUTPUT

其实我们还需要注意一点,因为数据包经过一个"链"的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,我们应该一条一条的去匹配,而且我们说过,相同功能类型的规则会汇聚在一张"表"中,那么,哪些"表"中的规则会放在"链"的最前面执行呢,这时候就需要有一个优先级的问题,那些表应该优先匹配呢?

iptables为我们定义了4张"表",当他们处于同一条"链"时,表执行的优先级:
优先级次序(由高而低):raw --> mangle --> nat --> filter
在这里插入图片描述

三、基本用法

每一条“链”都是一个关卡,凡是要通过这个关卡就需要匹配这个关卡上面的规则,根据匹配规则来决定处理动作

规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;匹配条件加上处理动作共同组成了规则

规则的组成部分(主要有两类):

报文的匹配条件(只有对那些能匹配到指定的规则条件的才能做处理)
匹配到之后的处理机制或动作
匹配条件: 根据协议报文特征指定匹配条件

匹配条件的机制或编写格式:

基本匹配条件(只检查最根本的几项源IP、源端口之类的)
扩展匹配条件(想检查更严格一些,如:做连接追踪、转态追踪、甚至根据Mac地址做追踪、甚至能检查一些应用层的特性等等)
处理动作:(两种方式)

内建处理机制(如:以过滤功能为例,匹配到的就丢弃或拒绝)
自定义处理机制(自定义处理机制仅仅能够指明跳转目标,说白了就是可以自定义链匹配到后转到自定义的链上去。自定义的链不可能跟整个netfilter的某个钩子函数相对应,如PREROUTING就跟钩子函数PRETOUTING相对应,但自定义的链没办法对应,不对应的话报文就不可能流经指定的位置,那怎么办呢?没有办法,就只能在它必然流经的位置调用自定义的链)
注意:报文不会经过自定义链,因此自定义链要想发挥作用,只能在内置链上通过规则引用后生效;说白了就是通过自定义处理机制进行引用;

动作(action)含义
ACCEPT允许数据包通过
DROP直接丢弃数据包,不给任何回应消息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应
REJECT拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息
SNAT源地址转换,解决内网用户用同一个公网地址上网的问题
MASQUERADE是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
DNAT目标地址转换
REDIRECT在本机做端口映射
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配

操作选项:

常用操作选项说明
-t指定要操作的表,缺省时表示filter表
-A在指定链尾部添加规则
-D删除匹配的规则
-R替换匹配的规则
-I在指定位置插入规则(例:iptables -I INPUT 1 --dport 80 -j ACCEPT (将规则插入到filter表INPUT链中的第一位上))
-L/S列出指定链或所有链的规则
-F删除指定链或所有链的规则
-N创建用户自定义链[例:iptables -N allowed]
-X删除指定的用户自定义链
-P为指定链设置默认规则策略,对自定义链不起作用
-Z将指定链或所有链的计数器清零
-E更改自定义链的名称[例:iptables -E allowed disallowed]
-nip地址和端口号以数字方式显示[例:iptables -nL]
-j action指定“匹配条件”中的动作
-vverbose,列出详细信息
-x显示出计数器的精确值
常用规则匹配器说明
-p tcp/udp/icmp/all匹配协议,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等,all会匹配所有协议
-s addr匹配源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段
-d addr[/mask]匹配目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段
-m module指定使用的模块
–sport port1[:port2]匹配源端口(可指定连续的端口)
–dport port1[:port2]匹配目的端口(可指定连续的端口)
-o interface匹配出口网卡,只适用于FORWARD、POSTROUTING、OUTPUT(例:iptables -A FORWARD -o eth0)
-i interface匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。
–icmp-type匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型)
–tcp-flags mask comp匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。(例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT 表示匹配SYN和ACK标记的数据包)
–line-numbers同时显示规则序号

基本用法:
在这里插入图片描述
报文在经过iptables的链时,会匹配链中的规则,遇到匹配的规则时,就执行对应的动作,如果链中的规则都无法匹配到当前报文,则使用链的默认策略(默认动作),链的默认策略通常设置为ACCEPT或者DROP

那么,当链的默认策略设置为ACCEPT时,如果对应的链中没有配置任何规则,就表示接受所有的报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被接受。同理,当链的默认策略设置为DROP时,如果对应的链中没有配置任何规则,就表示拒绝所有报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被拒绝。

查看规则

1、查看指定表的指定链的规则信息
在这里插入图片描述
2、如果未指定表,则默认为filter表
在这里插入图片描述
3、列出nat表中所有链中的规则信息
在这里插入图片描述
4、列出mangle表的INPUT链中详细的规则信息
在这里插入图片描述
在这里插入图片描述
输出信息:
pkts:对应规则匹配到的报文的个数。

bytes:对应匹配到的报文包的大小总和。

target:规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施。

prot:表示规则对应的协议,是否只针对某些协议应用此规则。

opt:表示规则对应的选项。

in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。

out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。

source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。

destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。

5、在以上输出信息的 source 和 destination 下都是anywhere,可以通过-n选项解析出地址
在这里插入图片描述
6、同时可以对每一个规则编号可以加上 --line-numbers选项
在这里插入图片描述
可以看到每一条链后面都有一个括号包含一些内容,比如:(policy ACCEPT 0 packets, 0 bytes)

policy 表示当前链的默认策略

policy ACCEPT 表示上面 mangle 表的 INPUT 链的默认动作为 ACCEPT,换句话说就是,默认接受通过INPUT关卡的所有请求,所以我们在配置INPUT链的具体规则时,应该将需要拒绝的请求配置到规则中,说白了就是"黑名单"机制,默认所有人都能通过,只有指定的人不能通过

packets 表示当前链(上例为INPUT链)默认策略匹配到的包的数量,254 packets表示默认策略匹配到254个包。

bytes 表示当前链默认策略匹配到的所有包的大小总和

查看某链中的规则信息常用用法:
在这里插入图片描述
规则配置
1、清理指定表的规则:
在这里插入图片描述
2、添加“拒绝所有来自192.168.1.2的所有报文”规则:
在这里插入图片描述
如果添加规则时不指定 -A 选项,那么默认添加在该链的第一条

这里要说明的是:匹配规则的顺序是从上到下的,数据包从第一条向下开始匹配,当匹配到首个满足条件时,便执行该规则的动作,不会再向下匹配(即使下面还有满足条件的规则)

3、也可以以序号进行添加:
在这里插入图片描述
4、以规则序号删除:
在这里插入图片描述
5、以存在的规则内容删除:
在这里插入图片描述
6、修改规则:
在这里插入图片描述
7、修改默认策略:
在这里插入图片描述
8、保存规则:
在这里插入图片描述
将保存到 /etc/sysconfig/iptables 文件中

9、重定向保存:
在这里插入图片描述
10、从文件恢复规则:
在这里插入图片描述
11、可以同时指定多个地址:
在这里插入图片描述
12、基于协议:
在这里插入图片描述
13、基于网卡:
在这里插入图片描述
14、基于端口:
禁止192.168.1.7的主机连接本机的22, 25,80端口
在这里插入图片描述
禁止192.168.1.7的主机连接本机的22,25,80端口
在这里插入图片描述
禁止任何主机连接本机的22端口:
在这里插入图片描述

四、相关模块

(一)iprange扩展模块

使用iprange扩展模块可以指定"一段连续的IP地址范围",用于匹配报文的源地址或者目标地址

-m iprange:使用iprange扩展模块
–src-range:源地址范围
–dst-range:目标地址范围

iptables -t filter -I INPUT -m iprange --src-range 192.168.200.100-192.168.200.200 -j REJECT

(二)time扩展模块

根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件

-m time:表示使用time扩展模块

–timestart:选项用于指定起始时间,00:00:00格式时分秒。

–timestop:选项用于指定结束时间。

–weekdays:选项用于用数字指定星期几,还能用缩写表示,例如:Mon, Tue, Wed,Thu, Fri, Sat, Sun

–monthdays,–datestart,–datestop:指定日期范围

iptables -t filter -I OUTPUT -p TCP --dport 80 -m time --timestart 08:55:00 --timestop 17:00:00 -j REJECT
iptables -t filter -I OUTPUT -p TCP --dport 80 -m time --weekdays 1,2,3,4,5 -j REJECT
iptables -t filter -I OUTPUT -p TCP --dport 8080 -m time --datestart 2019-04-20 --datestop 2019-04-21 -j REJECT

(三)connlimit扩展模块

可以限制IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对"每个客户端IP",即对单IP的并发连接数限制。一般和协议、端口配合使用

–connlimit-above:按照IP地址限制连接上限
–connlimit-mask:按照网段限制连接上限

iptables -t filter -I OUTPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j REJECT
iptables -t filter -I OUTPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT

(四)string扩展模块

使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。

-m string:表示使用string扩展模块
–algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项
–string:用于指定需要匹配的字符串

iptables -t filter -I INPUT -m string --algo kmp --string "bit" -j REJECT

(五)limit扩展模块

limit模块对“报文到达速率”进行限制,我们可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。
–limit second | minute | hour | day:主要用来限制单位时间内可以流入的数据包的数量。
–limit-burst NUM:指定令牌桶的大小

iptables -t filter -I INPUT -m limit --limit 10/min -j ACCEPT

(六)tcp-flags模块

属于tcp扩展模块中的内容,-tcp-flags值得就是tcp头中的标志位。可以通过此扩展匹配条件,去匹配tcp报文的头部的标识位,然后根据标识位的实际情况实现访问控制的功能。

这里主要指tcp包头中的标志位,SYN,ACK,FIN,RST,URG,PSH

匹配规则是:“SYN,ACK.,FIN,RST,URG,PSH,SYN”
可以把这串字符拆成两部分去理解,第一部分为"SYN,ACK,FIN,RST,URG,PSH",第二部分为"SYN"

第一部分表示:我们需要匹配报文tcp头中的哪些标志位,那么上例的配置表示,我们需要匹配报文tcp头中的6个标志位,这6个标志位分别为为"SYN、ACK、FIN、RST、URG、PSH",我们可以把这一部分理解成需要匹配的标志位列表。

第二部分表示:第一部分的标志位列表中,哪些标志位必须为1,上例中,第二部分为SYN,则表示,第一部分需要匹配的标志位列表中,SYN标志位的值必须为1,其他标志位必须为0。

匹配第一次握手

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT 

匹配第二次握手

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT

(七)state扩展模块

state是一个重要的扩展,基于连接追踪功能去查看每一报文当前所处的状态,可以根据报文的状态进行限制

不论什么协议,客户端第一次访问时,服务器会去内核内存中的追踪表查看他之前是否来过,查不到就证明是第一次来,记录入追踪表,如果查到以前来过就不检查规则,直接允许访问,这称为连接追踪机制。在访问量特别大的场景下,比如负载均衡服务器不建议开启,追踪表最大只能记录6万多的条目,访问数超过就会无法记录出错,导致所有的连接失败。

报文状态有五种:

NEW: 第一次连接时
ESTABLISHED:已建立的连接;
INVALID:无法识别的连接;
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接
UNTRACKED:row表上关闭连接追踪功能

iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

以上所有的规则配置都是基于本机的,属于主机防火墙范畴

五、网络防火墙

(一)概述

主机防火墙主要针对单个主机进行防护,网络防火墙处于网络入口的边缘,针对网络入口进行防护,针对整个网络入口后面的局域网(内网)进行防护

当外部网络中的主机与网络内部主机通讯时,不管是由外部主机发往内部主机的报文,还是由内部主机发往外部主机的报文,都需要经过iptables所在的主机,由iptables所在的主机进行"过滤并转发",所以,网络防火墙主机的主要工作就是"过滤并转发"

拥有"过滤功能"的链只有3条,INPUT、OUTPUT、FORWARD,当报文发往本机时,如果想要过滤,只能在INPUT链与OUTPUT链中实现,而此时,iptables的角色发生了转变,我们想要将iptables所在的主机打造成"网络防火墙"。网络防火墙的职责就是"过滤并转发",要想"过滤",只能在INPUT、OUTPUT、FORWARD三条链中实现,要想"转发",报文则只会经过FORWARD链(发往本机的报文才会经过INPUT链)

所以,综上所述,iptables的角色变为"网络防火墙"时,规则只能定义在FORWARD链中

(二)iptables之ip_forward转发

使用如下命令查看当前主机是否已经开启了转发功能,0表示为开启,1表示已开启

cat /proc/sys/net/ipv4/ip_forward

使用如下两种方法均可临时开启核心转发,立即生效,但是重启网络配置后会失效

# 方法一:
echo 1 > /proc/sys/net/ipv4/ip_forward
# 方法二:
sysctl -w net.ipv4.ip_forward=1

使用如下方法开启核心转发功能,即使重启网络服务也会生效(永久生效)

配置/etc/sysctl.conf文件

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

(三)利用iptables搭建网络防火墙示例

由于iptables此时的角色为"网络防火墙",所以需要在filter表中的FORWARD链中设置规则。

可以使用"白名单机制",先添加一条默认拒绝的规则,然后再为需要放行的报文设置规则。

配置规则时需要考虑"方向问题",针对请求报文与回应报文,考虑报文的源地址与目标地址,源端口与目标端口等。

组网及配置图:
在这里插入图片描述
说明:这是在vmvare环境下模拟的

步骤:
1、首先在node01 和 node03 主机上下载httpd服务
2、按照上图所示准备三台虚拟机并配置参数
3、此时web服务器可以Ping 通所有网卡(因为vmware特有的环境导致,如果是实际情况中一定是无法Ping通node01即内网主机)
4、在web服务器上添加一条路由

[root@admin ~]# route add -net 192.168.80.0/24 gw 192.168.126.8

5、在node02,即充当网络防火墙的主机上开启p_forward转发功能

临时开启转发功能:

echo "1" > /proc/sys/net/ipv4/ip_forward

永久开启转发功能:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

6、配置node03和node01的HTTP默认主页:
node03:

echo "This is Server ..." > /var/www/html/index.html

node01:

echo "This is Client ..." > /var/www/html/index.html

7、验证内外网互相通信

node01访问node03:

[root@admin ~]# curl 192.168.126.129
This is Server ...

node03访问node01:

[root@admin html]# curl 192.168.80.129
I am Client ...

8、在防火墙中添加规则
在node02(充当网络防火墙)主机上配置如下规则:

[root@eddy ~]# iptables  -I FORWARD -j REJECT

那么此时内外网便无法进行访问和通信。

9、在防火墙中添加过滤规则
只允许内网主机node01(192.168.80.0网段)可以使用80端口(即可以使用HTTP服务)访问外网

[root@eddy ~]# iptables -I FORWARD -s 192.168.80.0/24 -p tcp --dport 80 -j ACCEPT
[root@eddy ~]# iptables -I FORWARD -d 192.168.80.0/24 -p tcp --sport 80 -j ACCEPT

此时,内网便只能使用80端口(即httpd服务)访问外网,外网无法访问内网

此时再添加规则,允许外网主机node03(192.168.126.129)可以使用80端口(即可以使用HTTP服务)访问内网(192.168.80.0网段)

[root@eddy ~]# iptables -I FORWARD -s 192.168.126.129 -p tcp --dport 80 -j ACCEPT
[root@eddy ~]# iptables -I FORWARD -d 192.168.126.129 -p tcp --sport 80 -j ACCEPT

此时,便可以使用80端口(即httpd服务)互相通信

注意:通常我们有防火墙之后在配置规则时,需要考虑的是双向通讯

六、创建自定义链

当默认的链中的规则非常多的时候,不方便管理,在iptables中,可以通过自定义链来解决问题

-E :更改自定义链的名称
-N :创建用户自定义链
-X :删除指定的用户自定义链
-D :删除指定的规则

创建自定义链:

iptables -t filter -N IN_WEB_DENY

向自定义链中添加规则:

iptables -t filter  -I IN_WEB_DENY -s 192.168.201.22 -j REJECT

查看自定义链中的规则:

iptables -t filter -L IN_WEB_DENY

自定义的链需要进行关联引用才能发挥作用:

iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB_DENY

删除自定义链
1、首先应该先删除自定义链的所有引用

iptables -t filter -D INPUT -p tcp --dport 80 -j IN_WEB_DENY

2、清楚自定义链中的规则

iptables -t filter -D IN_WEB_DENY -s 192.168.201.22 -j REJECT
# 或
iptables -t filter -D IN_WEB_DENY 1

3、此时,才能删除自定义的链

iptables -t filter -X IN_WEB_DENY

七、处理动作

(一)REJECT

REJECT动作的常用选项为–reject-with

使用–reject-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝

可用值
icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable,
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-pro-hibited
icmp-admin-prohibited

当不设置任何值时,默认值为icmp-port-unreachable

增加提示信息

iptables -t filter -I INPUT -s 192.168.1.51 -j REJECT --reject-with icmp-host-unreachable

拒绝源地址192.168.1.100的1000-5000端口访问ssh服务,并给出提示信息为 “icmp-admin-prohibited”

iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m tcp --sport 1000:5000 --dport 80 -j REJECT --reject-with icmp-admin-prohibited

(二)LOG

使用LOG动作,可以将符合条件的报文的相关信息记录到日志中,但当前报文具体是被"接受",还是被"拒绝",都由后面的规则控制,换句话说,LOG动作只负责记录匹配到的报文的相关信息,不负责对报文的其他处理,如果想要对报文进行进一步的处理,可以在之后设置具体规则,进行进一步的处理

LOG动作选项

–log-level :可以指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug。
–log-prefix :可以给记录到的相关信息添加"标签"之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。–log-prefix对应的值不能超过29个字符。

1、对发送到本机22端口的数据包信息进行记录

iptables -t filter -I INPUT -p tcp --dport 22 -j LOG

2、记录源地址为192.168.1.100,访问目标网段192.168.2.0/24的访问记录

iptables -t filter -I INPUT -s 192.168.1.100 -d  192.168.2.0/24 -j LOG

3、LOG动作的报文信息默认记录在/var/log/messages文件中

tailf /var/log/messages

4、同时,也可以将LOG动作的报文信息记录到一个指定的文件中:

[root@eddy ~]# vi /etc/rsyslog.conf   
iptables  /var/log/iptables.log
[root@eddy ~]# systemctl restart rsyslog
# 此时,便可以在自己指定的记录文件中查看到
[root@eddy ~]# tail -f /var/log/iptables.log 

(三)SNAT/DNAT

NAT(Network Address Translation,网络地址转换)是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程。在实际应用中,NAT 主要用于实现私有网络访问公共网络的功能

NAT功能通常会被集成到路由器、防火墙、或独立的NAT设备中。我们基本上局域网中的主机要想访问外网都是通过类似NAT的模式做的地址转换

内网和外网的一次通信中,实际上报文在经过路由器或者防火墙的时候,我们内网的主机IP已经被隐藏了,对应转换成了路由器或者防火墙的IP并映射一个端口,这些信息会被NAT记录下来,当外部主机收到信息后,源地址和源端口显示的是防火墙的IP和映射的端口,当外部的主机回应时,首先是由防火墙或者路由器收到的,这时候会根据我们NAT的记录,将相应报文中的目标IP和目标端口,改为内部主机的IP和端口,再将报文发给内部主机,这样整个过程就结束了,达到了内部主机上网,并且隐藏了内部主机的IP

在整个过程中实际上有两次地址转换:

1、内部主机的报文发送出去,报文的源IP和端口发生了改变,Source Network Address Translation英文缩写SNAT
2、外部主机回应报文后,响应报文的目标IP和端口发生了改变,:Destinationnetwork address translation英文缩写为DNAT

这个技术帮我们解决了隐藏内网IP,共享公网IP,解决了IPV4地址不够用的问题

nat表的功能就是地址转换,所以我们需要在nat表中定义nat规则(SNAT和DNAT)

SNAT地址转换

在centos7中,SNAT规则只能存在于POSTROUTING链与INPUT链中,在centos6中,SNAT规则只能存在于POSTROUTING链中

iptables -t nat -I POSTROUTING -s 192.168.126.0/24 -j SNAT --to-source 183.168.25.4

-t natnat表的功能就是地址转换,所以我们需要在nat表中定义nat规则,即动作为SNAT或DNAT时,必须是定义在nat表中
-A POSTROUTING表示将SNAT规则添加到POSTROUTING链的末尾,在centos7中,SNAT规则只能存在POSTROUTING链与INPUT链中,在centos6中,SNAT规则只能存在于POSTROUTING链中
-s 192.168.126.0/24表示报文来自于192.168.126.0/24网段
-j SNAT表示使用SNAT动作,对匹配到的报文进行源地址转换
–to-source 192.168.1.153表示将匹配到的报文的源IP修改为183.168.25.4,–to-source是SNAT动作的常用选项,用于指定SNAT需要将报文的源IP修改为哪个IP地址。

DNAT地址转换

DNAT规则只配置在PREROUTING链与OUTPUT链中
将公司的公网IP地址192.168.1.153的80端口请求转发到内网主机192.168.100.1的8080端口

iptables -t nat -I PREROUTING -d 192.168.1.153 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.153:80

-t nat -I PREROUTING表示在nat表中的PREROUTING链中配置DNAT规则,DNAT规则只配置在PREROUTING链与OUTPUT链中
-d 192.168.1.153 -p tcp --dport 80表示报文的目标地址为公司的公网IP地址,目标端口为tcp的80号端口
-j DNAT --to-destination 192.168.2.153:80表示将符合条件的报文进行DNAT,也就是目标地址转换,将符合条件的报文的目标地址与目标端口修改为192.168.2.153:80,–to-destination就是动作DNAT的常用选项

使用防火墙让内网用户上网示例

互联网使用公有IP地址,企业内网使用私有IP地址,当企业内网中的PC去访问互联网服务时,是可以正常把请求送出去的,但是如果互联网上的某台主机响应此请求,目标主机就变成了内网PC 的IP地址,互联网是没有到达内部局域网的路由,因此,就不知道该怎么把数据包送到哪里去

针对以上情况,解决的办法是在企业内部PC发出请求时,在网络的边界,也就是防火墙的出口,把企业私有IP地址转换成防火墙的出口公有IP地址。这样,互联网上的某台主机响应请求时,目标主机就变成了防火墙的出口IP地址了,当响应的数据包到达防火墙的出口时,再经过防火墙的地址转换,把其转变为企业内网的某台PC的IP地址,这样就能正常的访问互联网了。

把内部网络PC的IP地址转变成公有IP地址,这种转换在Netfilter/Iptables中称为SNAT,即源地址转换。而源地址转换一做在Iptables的NAT表的POSTROUTING链里

要求:

在一公司的局域网中有一台Netfilter/Iptables防火墙,防火墙的eth1接口连接内部网络,eth0接口连接外部网络,现在的需求是,使用防火墙使内网所有用户都共享一个出口IP地址访问互联网。
在这里插入图片描述
实现步骤:

1、配置IP地址,网关和掩码

2、防火墙配置

echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.0.0.1

3、测试
此时PC1和PC2便可以访问Web服务器

使用防火墙发布内网服务器示例

企业内部服务器使用的是私有IP地址,而互联网上的用户使用的是公有IP地址,这样,互联网上的用户是不能直接访问企业内部的服务器的,互联网上的用户只能访问到企业的边界,也就是防火墙的出口

针对以上情况,解决的办法是在防火墙上进行网络地址转换。当互联网上的用户访问内部服务器时,首先访问企业出口IP地址,然后防火墙根据网络地址转换表,把这样的请求数据包的目标IP地址转换成企业内部服务器的私有IP地址,这样,请求就可以到达企业内部服务器了

把目标地址是出口的公有IP地址转换成企业内私有IP地址称为DNAT,即目标地址转换。而目的地址转换一般做在Iptables的NAT表的PREROUTING链里

要求:

在一公司内部有一台Web服务器,同时有一台Netfilter/Iptables防火墙,防火墙的eth1接口连接内部网络,eth0接口连接外部网络,现在的需求是,使用防火墙使内网的Web服务器通过防火墙发布至互联网
在这里插入图片描述
实现步骤:

1、配置IP地址 ,掩码,网关

2、防火墙配置

echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -d 1.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.0.1

3、测试
此时外网主机PC2可以正常访问公司内部网站

(四)MASQUERADE

MASQUERADE会动态的将源地址转换为可用的IP地址,其实与SNAT实现的功能完全一致,都是修改源地址,只不过SNAT需要指明将报文的源地址改为哪个IP,而MASQUERADE则不用指定明确的IP,会动态的将报文的源地址修改为指定网卡上(类似于动态NAT技术,有一个公网IP地址池)

MASQUERADE的规则定义在POSTROUTING链或INPUT中

可以把MASQUERADE理解为动态的、自动化的SNAT,如果没有动态SNAT的需求,没有必要使用
MASQUERADE,因为SNAT更加高效

iptables -t nat -I POSTROUTING -s 192.168.126.0/24 -o ens33 -j MASQUERADE

(五)REDIRECT

使用REDIRECT动作可以在本机上进行端口映射

REDIRECT的规则只能定义在PREROUTING链或者OUTPUT链中

将本机的80端口映射到本机的8080端口上

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

经过上述规则映射后,当别的机器访问本机的80端口时,报文会被重定向到本机的8080端口上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值