netfilter/iptables是集成在linux2.4.x版本内核中的包过滤防火墙系统。

    该框架可以实现数据包过滤,网络地址转换以及数据包管理功能。linux中的防火墙系统包括两个部分:netfilte和iptables。netfilte可以对本机所有流入、流出、转发的数据包进行查看、修改、丢弃、拒绝等操作。由于netfilter在内核空间中,用户通常无法接触内核和修改内核,此时需要命令行工具,一般使用iptables,firewalld等工具。使用iptables可以添加、删除具体的过滤规则,iptables默认维护四个表和五个链,所有的防火墙策略规则都将被分别写入表和链中。centos7系统防火墙模块存放在/lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilter/目录下,当需要某个模块功能时,可以通过modprobe加载。

    centos7在原有的netfilter/iptables架构上又增加了firewalld。iptables工具是一个比较低级别的工具,仅可以调整ipv4的防火墙规则,所以在centos7上使用了firewalld作为默认的用户防火墙工具,但当用户使用firewalld编写ipv4防火墙规则时,firewalld依然是调用了底层的iptables实现具体的功能,只是这个调用过程对用户是透明的。


一、iptables

    默认的iptables规则表又fileter表(过滤规则表),nat表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表)。每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤),防火墙规则需要写入到这些具体的数据链中。

以下为流程

centos7-防火墙_第1张图片

1)外部主机发送数据包给防火墙本机,数据将会经过PEROUTING与INPUT链;

2)如果防火墙本机发送数据包到外部主机,数据经过OUTPUT于POSTRTOUTING链

3)如果防火墙作为路由负责转发数据,则数据经过PEROUTING链、FORWARD链已经POSTROUTING链


iptables的表与链的关系如下所示:

centos7-防火墙_第2张图片


1.1 iptables的语法

 iptables定义规则的方式比较复杂:

 格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

 -t table :3个filter nat mangle

 COMMAND:定义如何对规则进行管理

 chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的

 CRETIRIA:指定匹配标准

 -j ACTION :指定如何进行处理

选项:

-t                      指定需要维护的防火墙规则表,不使用-t时,则默认操作对象为filter表

-A                     追加防火墙规则

-D                     删除防火墙规则

-I                       插入防火墙规则

-F                      清空防火墙规则

-L                      列出防火墙规则

-R                      替换防火墙规则

-Z                      清空防火墙数据表统计信息

-P                      设置默认规则


匹配参数:

[!]-p                    匹配协议,!代表取反

[!]-s                     匹配源地址

[!]-d                    匹配目标地址

[!]-o                    匹配入站网卡接口

[!]--sport            匹配源端口

[!]--dport            匹配目的端口

[!]--src-range      匹配目标地址范围

[!]--dst-range     匹配目标地址范围

[!]--limit              匹配数据表速率

[!]--mac-source   匹配源mac地址

[!]--sports            匹配多个源地址

[!]--dports            匹配多个目的地址

[!]--state               匹配状态(INVALID,ESTABLISHED,NEW,EELATED)

[!]--string              匹配应用层字符串


触发动作:

ACCEPT                允许数据包通过

REJECT                 拒绝数据包通过

LOG                      将数据包信息记录syslog日志

DNAT                   目标地址转换

SNAT                    源地址转换

MASQUERADE     地址欺骗

REDIRECT             重定向


iptables防火墙规则的顺序非常重要,内核按顺序检查这些规则,如果发现有匹配的股则条目按,则立刻执行相关动作,停止继续向下查找规则条目,如果所有的防火墙规则都未能匹配成功,

则按照默认策略处理。使用-A选项添加防火墙规则会将该规则追加到整个链的最后,而使用-I选项添加的规则则默认会插入到链中作为第一条规则。下面通过实例简单演示iptables命令的使用方法。

iptables -nL                         #查看filter表的所有规则
iptables -t nat -nL                  #查看nat表所有的规则
iptables -F                          #清空filter表中所有的规则
iptables -A INPUT -s 192.168.0.1 -j DROP         #向filter表中添加一条新的入站规则,丢弃192.168.0.1主机发送给防火墙本机的所有的数据包
iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT       #向filter表中插入一条新的入站规则,拒绝192.168.0.22 ping
iptables -nL --line-number           #查看表中防火墙规则并显示规则编号
iptables -D INPUT 1                  #删除表中INPUT链的第一条规则
iptables -R INPURT 2 ! -s 192.168.0.254 -j REJECT        #替换filter表中INPUT链的第二条规则,拒绝192.168.0.254之外的任何主机连接防火墙本机
iptables -t fileter -p INPUT ACCEPT  #修改filte表中INPUT链的默认规则为接收数据包
iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG #将192.168.0.10主机发送给防火墙本机的22端口的所有数据包信息记录到messages日志
iptables -I INPUT -i eth1 --p tcp --dport 80 -j ACCEPT     #允许任何主机从eth1网络接口访问本机的80端口

 

1.2运用举例

 1) 允许任意客户端访问服务器主机提供的日常服务(HTTP,HTTPS,DNS,NTP,SMTP,POP3,SSH),在linux系统中,/etc/services文件可以找到各种服务所对应的标准端口信息

centos7-防火墙_第3张图片

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp --dport 123 -j ACCEPT
iptables -P INPUT -P INPUT DROP
iptables -P INPUT -p OUTPUT ACCEPT


2)使用SNAT共享上网,服务器作为软路由,内部所有的192.168.0.0/24网端内的主机连接外网时,防火墙自动将所有源地址修改为公网IP,最后互联网将信息返回给路由后,由路由再转交给真正的后端主机。防火墙源地址转换(SNAT)规则需要被写入到NAT表中的POSTROUTING链

vim /etc/sysctl.conf

centos7-防火墙_第4张图片

systctl -p      #重新加载内核参数配置文件
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.125.199.84    #配置nat表,使用snat方式将源地址段192.168.0.0/24  转换为124.125.199.84公网地址


3)配置DNAT,外部网络公网IP访问内网业务服务器

sed -i '$a\net.ipv4.ip_forward = 1' /etc/sysctl.conf   #配置文件最后一行添加
systctl -p       #重新加载内核配置文件
iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100   #配置nat表,使用dnat方式,访问公网地址80端口转换192.168.0.100
iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101



4)限制单位时间内数据包的个数,防止网络***发送大量无效的数据包给服务器,造成服务器无法响应正常的请求包

iptables -I INPUT -m limit --limit 500/sec -j ACCCEPT   #当每秒数据包个数为500的时候接收入站连接,否则拒绝连接
iptables -P INPURT DROP


5)根据数据连接状态设置防火墙规则,放行所有的出站数据包,拒绝入站的新连接请求与无效链接,放行入站的回应请求

iptables -F
iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT


6)防火墙设置规则,记录192.168.0.1 到192.168.0.22地址段内所有的主机发送给路由要求转发的数据包,并允许转发这些数据包

iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j LOG
iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.10 -p tcp --dport 80 -j ACCEPT


1.4 iptables备份与还原

    默认的iptables防火墙规则会立刻生效,但是如果不保存,当计算机重启后,所有的规则将会丢失,所以需要即时保存。

iptables软件包提供了两个非常有用的工具,iptables-save和iptables-restore,可以方便的处理大量的防火墙规则。centos7系统中的防火墙规则默认保存再/etc/sysconfig/iptables文件中,使用iptables-save将规则保存至该文件中实现保存防火墙规则的作用,重启后会自动加载该文件中的规则。如果使用iptables-save将规则保存到其他位置,可以实现备份防火墙规则的作用。当防火墙规则需要做还原时,可以使用iptables-restore将备份文件直接导入当前防火墙规则。

iptables-save > /etc/sysconfig/iptables
iptables-save > firewall.bak
iptables-restore < firewall.bak



二、firewalld

firewalld将所有的网络流量都分类汇聚到zones中,它通过zones管理防火墙规则,每一个进入系统的数据包,都会首先检查源IP地址和接口,如果与某个zone匹配,则该zone的规则将生效。而每个zone都会有开启或关闭服务和端口的列表,以实现允许或拒绝链接服务和端口。如果数据包的源IP地址和网卡接口都不能和任何zone匹配,则该数据包将匹配默认zone,一般情况下是一个public的默认zone。firewalld会提供block,dmz,drop,external,home,internal,public,trusted,work这九个zone。比如有一个数据包从eno1网卡进入本机,根据规则进入work这个zone而在work这和zone中有允许访问http服务的规则,则最后该数据包将可以进入本机并访问http服务

大部分zone都定义的有自己的允许规则,规则通过端口/协议(631/udp)或者预定义的服务(ssh)这种形式设置,如果数据包没有匹配这些允许的规则,则该数据包一般会被防火墙拒绝。但是如果有名为trusted的zone,默认会运行所有的数据流量,如果有一个数据包进入了该zone,则被允许访问所有的资源。

具体的firwalld预定义zone及其描述信息如下所示:


drop(丢弃):任何接受的网络数据包都被丢弃,没有任何回复,

仅能有发送出去的网络连接(数据包不能进来,但是可以出去)


block(限制):任何接受的网络连接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒绝。(和drop相比,比较宽松一些,主要是为了针对icmp)


piblic(公共):在公共区域内使用,不能相信网络内其他计算机不会对你造成危害,只能接受经过选取的连接。


external(外部):特别是为路由器启用了伪装功能的外部网,你不能信任来自网络的其他计算,不能相信他们不会对你造成伤害,只能接受经过选择的连接。


dmz(非军事区):用于你的非军事区内的电脑,此区域可公开访问,可以有限的进入你的内部网络,仅仅接受经过选择的连接。


work(工作):用于工作区,你可以基本信任网络内的其他电脑不会对你造成危害,仅仅接收经过选择的连接。


home(家庭):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收经过选择的连接。


internal(内部):用于内部网络,你可以基本上信任网络内其他电脑不会对你造成危害,仅仅接收经过选择的连接。


trusted(信任):可接受所有的网络连接。


2.1 firewalld-cmd命令

   可以使用firewall-cmd命令来管理防火墙规则,语法格式如下:

  用法:

firwall-cmd [OPTIONS....]

选项:

--get-default-zone                        获取默认zone信息

--set-default-zone=          设置默认zone

--get-active-zones                          显示当前正在使用的zone信息

--get-zones                                       显示系统预定义的zone

--get-zone-of-interface=      查询某个接口与哪个zone匹配

--get-zone-of-source=[//]        查询某个源地址与哪个zone匹配

--list-all-zones                                            显示所有的zone信息的所有规则

--add-service=                            向zone中添加允许访问的服务

--add-port=[-]/       向zone中添加允许访问的端口

--add-interface=                        将接口与zone绑定

--add-source=[//]            将源地址与zone绑定

 


--list-all                                         列出某个zone所有的规则信息

--remove-service=       从zone中移除允许某个服务的规则

--remove-port=[-]/            从zone中移除允许的某个端口规则

--remove-source=[/]            将源地址与zone解除绑定

--remove-interface=                     将网卡接口与zone接触绑定

--permanent                                                      设置永久有效的规则,默认的情况规则都是临时的

--reload                                                            重新加载防火墙规则

firewall-cmd --get-default-zone            #查看默认zone,为public
firewall-cmd --set-default-zone=trusted     #设置默认zone为trusted
firewall-cmd --get-active-zones            #显示当前正在使用的zone信息

centos7-防火墙_第5张图片

firewall-cmd --get-zones                    #显示系统预定义的zone,默认为九个zone

centos7-防火墙_第6张图片

firewall-cmd --get-services                #显示系统预定义的服务名称

centos7-防火墙_第7张图片

firewall-cmd --get-zone-of-interface=ens192                #查询接口匹配的zone

image.png

firewall-cmd --list-all-zones                        #显示所有的zone以及对应的规则信息

centos7-防火墙_第8张图片

firewall-cmd --add-service=ftp --zone=public                    #public中添加允许访问ftp服务的规则
firewall-cmd --remove-service=ftp --zone=public                 #public中删除允许访问ftp服务的规则
firewall-cmd --add-port=3306/tcp --zone=public                   #public中添加允许访问3306服务的规则
firewall-cmd  --remove-port=3306/tcp --zone=public                                     #public中删除允许访问3306服务的规则
firewall-cmd  --add-interface=eno1 --zone=public                                       #将网卡eno1与public绑定,流量接入该接口匹配public规则
firewall-cmd  --remove-port=eno1 --zone=public                                          #将网卡eno1与public解绑定
firewall-cmd  --add-source=1.1.1 --zone=public                                           #将源地址1.1.1.1与public绑定,以后该主机访问本机时匹配public中的规则
firewall-cmd  --list-all --zone=public                                                   #查看public中这个zone的规则列表
firewall-cmd  --permanet --add-port=3306/tcp --zone=public                               #public中添加一条永久规则
firewall-cmd  --reload                                                                    #重启防火墙

    


一般在实际运维中,我们主要使用 iptables做为防火墙,将firewalld服务禁用,避免干扰