文章目录

  • 一、FIREWALL概念
  • 1、防火墙原理
  • (1)四表
  • (2)五链
  • 2、iptables的一些常用命令
  • 3、firewall的优势
  • 4、firewall的原理
  • 二、FIREWALL服务的配置和使用
  • 1、防火墙服务的管理
  • 2、命令方式配置防火墙(其实绝大多数情况下的命令都能tab出来)
  • 3、特别介绍一下某个zone下的规则参数对应含义
  • 4、富规则方式配置防火墙
  • 三、iptables的使用
  • 1、iptables基本命令的使用
  • 2、iptables规则的添加
  • 3、iptables规则的删除
  • 4、使用firewall-cmd命令对iptables链进行设置


一、FIREWALL概念

防火墙借助硬件和软件在内部和外部网络之间产生一种保护屏障,防火墙配置好且启用的情况下,将是不同网络或网络安全域之间信息的唯一出入口,能够设置安全策略控制网络的信息流,防火墙是一个分离器、一个限制器也是一个分析器,有效地监控内部网络和Internet之间的任何活动,保障内部网络的安全

在操作系统中可能有几种防火墙共存,firewalld、iptables、ebtables

1、防火墙原理

防火墙其实是通过内核netfilter模块实现的功能,netfilter也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集

而不同的防火墙工具都只是保存策略的工具,默认使用firewalld服务,底层调用的命令仍然是iptables,firewalld和iptables相比,一个很明显的区别是:iptables默认所有的数据包都能流入计算机,而firewalld默认会拒绝,下图是firewalld和iptables之间的关系






firewall-config图形化方式

firewall-cmd命令方式

firewalld daemon & service

iptables command

netfilter


iptables包含四个表五个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度

(1)四表

iptables的四个表,默认是fileter,表处理优先级:raw > mangle > nat > filter

filter:一般的过滤功能

nat:用于nat功能(端口映射,地址映射等)

mangle:用于对特定数据包的修改

raw:优先级最高,设置raw时一般是为了不再让iptables做数据包跟踪处理,提高性能

raw表只使用在PREROUTING链和OUTPUT链,因为优先级最高,从而可以对收到的数据包在链接跟踪前处理。一旦使用了raw表,在某个链上,raw表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了

四个表中,用的最多的是filter表过滤,然后就是nat表用于转发

(2)五链

iptables的五个链

PREROUTING:数据包进入路由表之前

INPUT:通过路由表后目的地为本机

FORWARD:通过路由表后,目的地不为本机

OUTPUT:由本机产生,向外转发

POSTROUTING:发送到网卡接口之前

firewall允许mysql firewall default permit_运维

图中的五个链分别对应了内核中的对应的五个内核函数(在内核中函数名称是小写,所以这里五条链用大写与之区分),按照箭头指向顺序,假设有一个数据包,我现在不想让其进入内核,那么就在PREROUTING链阻止;假设有一个数据包,现在不想让其进入用户空间,那么可以在PREROUTING和INPUT链进行阻止

FORWARD:假设一个数据包通过了PREROUTING到达了内核,现在不想让其数据包进入计算机内部,使用FORWORD链使这个数据包通过内核直接转发给其他计算机,FORWARD链转发功能默认没有开启,可以通过防火墙进行开启

假设一个数据包进入到了用户空间,现在不想让这个数据包从我的计算机中流出,那么就可以在OUTPUT链和POSTROUTING链进行阻拦

2、iptables的一些常用命令

iptables -L可以看到默认有三条链INPUT链、FORWARD链、OUTPUT链

iptables -F清除所有链规则

3、firewall的优势

(1)firewalld可以动态修改单条规则

(2)firewall要比iptables使用简单,即使不明白"四张表五条链"而且对TCP/IP协议不太理解也能实现大多数的功能,因为firewall配置相对简单,下面主要写一下firewall用法

4、firewall的原理

firewall有9个域zone,默认是public域

名称

功能

配置文件

阻塞区域(block)

任何传入的网络数据包都将会被阻止

block.xml

工作区域(work)

相信网络上的其他计算机不会损害自己的计算机

work.xml

家庭区域(home)

相信网络上的其他计算机不会损害自己的计算机

home.xml

公共区域(public)

不相信网络上的任何计算机,只有选择接受传入的网络计算机

public.xml

隔离区域(DMZ)

隔离区域也被叫做非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接

dmz.xml

信任区域(trusted)

所有的网络连接都可以接受

trusted.xml

丢弃区域(drop)

任何传入的网络连接都被拒绝,且不响应

dorp.xml

内部区域(internal)

信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接

internal.xml

外部区域(external)

不相信网络上的其他计算机,不会损害你的计算机,只有选择接受传入的网络连接

external.xml

这些zone的配置文件都保存在"/usr/lib/firewallld/zones"目录下。默认情况下在/etc/firewalld/zones下面只有一个public.xml。如果给另外一个zone做一些改动,并永久保存,那么就会自动生成对应的配置文件

比如给work zone增加一个端口

firewall-cmd --permanent --zone=work --add-prot=1000/tcp

那么就会在/usr/lib/firewalld/zones/目录下生成对应的work.xml配置文件

由此可见,firewalld的配置文件其实有两个主要的目录

(1)/usr/lib/firewalld/系统配置文件,尽量不要修改

(2)/etc/firewalld/用户配置文件,可以自行修改

/etc/firewalld配置文件目录下面,不止保存了zones的配置文件,还有services文件,也就是

/usr/lib/firewalld/services/目录中,每个文件分别对应一项具体的网络服务,通过名字来管理更加高效,后文的讲解,会让你更明白这两个路径下的这些文件的含义和用途

二、FIREWALL服务的配置和使用

1、防火墙服务的管理

# systemctl对防火墙的管理
[root@localhost ~]# systemctl start firewalld	# 起服务
[root@localhost ~]# systemctl stop firewalld #停服务
[root@localhost ~]# systemctl enable firewalld # 设置防火墙开机自启
[root@localhost ~]# systemctl disable firewalld # 关闭防火墙开机自启
[root@localhost ~]# systemctl status firewalld # 查看firewalld服务的状态
[root@localhost ~]# systemctl mask firewalld.service	# 注销服务,执行后无法使用systemctl控制该服务的开启与关闭且开机不会加载该服务
[root@localhost ~]# systemctl unmask firewalld.service # 取消注销

# firewall-cmd对防火墙的管理
[root@localhost ~]# firewall-cmd --state	# 显示状态
[root@localhost ~]# firewall-cmd --reload	# 重载防火墙策略,无需断开链接,动态加载规则
[root@localhost ~]# firewall-cmd --complete-reload # 重启防火墙,类似于重启服务
[root@localhost ~]# firewall-cmd --panic-on		# 任何人都不能访问我这台计算机
[root@localhost ~]# firewall-cmd --panic-off	# 与上一条命令对应

2、命令方式配置防火墙(其实绝大多数情况下的命令都能tab出来)

# 下面对命令做了大概的分类,好好观察一下,找到大概的规律,就容易理解命令的逻辑了
# 对zone和服务的全览(泛查询)
[root@localhost ~]# firewall-cmd --get-zones	# 查看所有的zone
[root@localhost ~]# firewall-cmd --get-default-zone	# 查看默认的zone
[root@localhost ~]# firewall-cmd --get-active-zones	# 查看活跃的zone
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33	# 查看ens33接口所属区域
[root@localhost ~]# firewall-cmd --get-services	# 查看所有的服务


# 对某个zone下的服务查看,可以配合"--zone=域"使用
[root@localhost ~]# firewall-cmd --list-all	# 列出指定的zone的规则,如果不指定zone默认查看当前活跃zone的规则
[root@localhost ~]# firewall-cmd --list-source	# 列出源IP
[root@localhost ~]# firewall-cmd --list-source-ports	# 列出源端口
[root@localhost ~]# firewall-cmd --list-ports	# 列出端口
[root@localhost ~]# firewall-cmd --list-services	# 列出活跃zone下的服务


# 对服务、端口等的设置与添加,策略的设置
[root@localhost ~]# firewall-cmd --set-default-zone=work	# 设置默认zone
[root@localhost ~]# firewall-cmd --add-interface=ens33	# 添加接口
[root@localhost ~]# firewall-cmd --add-source=192.168.0.21	# 添加源地址
[root@localhost ~]# firewall-cmd --add-service=dhcp	# 添加服务
[root@localhost ~]# firewall-cmd --add-port=80/tcp	# 添加端口
[root@localhost ~]# firewall-cmd --add-masquerade	# 开启内核路由转发功能,其等同于以下改法
[root@localhost ~]# vim /etc/sysctl.conf修改net.ipv4.ip_forward = 1
[root@localhost ~]# firewall-cmd --add-icmp-block=echo-request	# 禁止ping
[root@localhost ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
# 设置80到8080端口转发,add-forward-prot=后面的内容以冒号分隔,正好是三对,源端口:协议:目标端口


# 对策略的删除
[root@localhost ~]# firewall-cmd --remove-sevice=dhcp	# 删除服务
[root@localhost ~]# firewall-cmd --remove-port=80/tcp	# 删除端口
[root@localhost ~]# firewall-cmd --panic-on	# 丢弃
[root@localhost ~]# firewall-cmd --query-panic	# 查询丢弃状态
[root@localhost ~]# firewall-cmd --panic-off	# 取消丢弃


# 永久生效
[root@localhost ~]# firewall-cmd --permanent ...	# 如果想要永久生效,就在firewall-cmd后边加一个--permanent参数

# 总结来说就是:firewall-cmd命令后面
# 1、如果是泛查询,一般是--get-xxx
# 2、如果是查询某个zone下的xxx,一般是--list-xxx再结合--zone=一起使用
# 3、如果是对某个zone下的xxx做修改或添加,一般是--add-xxx
# 4、如果是对某个zone下的xxx做删除,一般是--remove-xxx
# 5、永久生效的话,另加--permanent

3、特别介绍一下某个zone下的规则参数对应含义

[root@localhost ~]# firewall-cmd --list-all
public (active)
	target: default
	icmp-block-inversion: no		# icmp-blocks反转开关
	interfaces: ens33
	sources:		# 允许哪个原地址到达计算机
	services: ssh mdns dhcpv6-client cockpit
	ports:
	protocols:
	masquerade: no			#  伪装(路由转发功能),配置成功后,可以用sysctl -p查看到net.ipv4.ip_forward = 1
	forward-ports:		# 端口转发
	source-ports:		# 允许哪个源端口到达计算机
	icmp-blocks:	# 如果icmp-blok-inversion为默认的no的时候,这里为黑名单,若为yes则相反
	rich rules:		# 富规则

可以使用sysctl -p查看一下策略,可以看到内核打开的一些功能,sysctl -p查看到的内容和/etc/sysctl.conf文件的内容是一致的

【注】特别要注意的是:如果选取的策略是通过放行服务(ssh)的方式,而不是通过放行端口的方式对网络做安全加固的话,那么可能会因为不同服务器ssh服务本身使用的端口不同,而导致有的服务器ssh放行失败

举个简单的例子如下:

ssh默认使用的端口是22,但是某些服务器会修改为2222(通过修改/etc/ssh/sshd_config可以实现),此时如果firewall-cmd对ssh服务做放行,那么默认放行的将是22端口(这是因为默认的xml描述文件里对ssh服务描述的就是22),最终导致ssh服务使用2222,而防火墙只通行22,最终导致ssh连接不上

那么对ssh服务的放行究竟是对哪个配置文件做的修改呢?其实其默认是读取/usr/lib/firewalld/services目录下的ssh对应的xml描述文件,firewall-cmd做操作的时候实际上也是操作这个文件。

当然了,能放这些xml文件的地方除了这个路径,其实还有/etc/firewalld/services这个路径,也就是说,为了防止直接修改/usr/lib/firewalld/services路径下的xml文件修改出错,可以用cp命令拷贝到/etc/firewalld/services目录下一份,这样只修改/etc/firewalld/services下的这个xml就行了,修改完对ssh服务的描述,firewalld服务找xml文件的时候,会先加载/usr/lib/firewalld/services目录下的,之后再加载/etc/firewalld/services目录下的xml文件,后加载的会覆盖掉先前的

通过上面的例子可以看出来,通行策略使用放行服务的方式,可能会引起诸多问题,所以还是建议通过端口做控制,使用哪些端口,就对哪些端口做控制

4、富规则方式配置防火墙

如果不知道富规则语法,可以使用man firewall-cmd查看man帮助,其中不难找到富规则的关键词firewalld.richlanguage,然后使用man richlanguage查看

rule
    [source]
    [destination]
    service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
    [log]
    [audit]
    [accept|reject|drop|mark]

示例

[root@localhost ~]# firewall-cmd --add-rich-rules='rule family=ipv4 source not address=192.168.0.200 destination address=192.168.0.33 accept'
# 源地址不是192.168.0.200目标地址是192.168.0.33的情况,允许通过

三、iptables的使用

1、iptables基本命令的使用

[root@localhost ~]# iptables -L		# 查看所有规则
# 查看的结果中,如果有的链中有policy的是主链,也就是内核的链
[root@localhost ~]# iptables -t filter -L		# 查看filter表中的所有链
[root@localhost ~]# iptables -F		# 清空所有规则

2、iptables规则的添加

[root@localhost ~]# iptables -A INPUT -s 192.168.0.200 -j ACCEPT		# 默认是添加到filter表中,给INPUT链添加一条规则,来自源地址192.168.0.200的数据允许通过
[root@localhost ~]# iptables -A INPUT -p tcp --dport 135:139,80 -j DROP		# 在INPUT链中设置规则,对端口进行控制,对135到139之间的端口以及80端口的tcp连接进行丢弃

规则添加好之后,只当前生效,如果需要永久生效,有两种方式

(1)直接修改iptables的配置文件/etc/sysconfig/iptables把上面的iptables规则设置都编辑在这个配置文件中

(2)先用/usr/sbin/netfilter-persistent save命令保存一下目前设置的规则,默认会保存到/etc/iptables/rules.v4中,编写开机启动脚本,每次开机把rules.v4中的规则恢复出来

# 脚本内容如下
#!/bin/bash
/sbin/iptables-restore  <  /etc/iptables/rules.v4		# 恢复规则

脚本名为iptables.sh,放在/etc/network/if-pre-up.d/目录下

3、iptables规则的删除

[root@localhost ~]# iptables -L INPUT --line-numbers	# 查看所有规则对应的行号
[root@localhost ~]# iptables -D INPUT 11	# 这里的11是行号

永久删除的话,先当前删除,然后再写入配置就好了

4、使用firewall-cmd命令对iptables链进行设置

[root@localhost ~]# firewall-cmd --direct --get-all-chains			# 查看所有的链
[root@localhost ~]# firewall-cmd --direct --get-chains filter		# 查看filter表中的链
[root@localhost ~]# firewall-cmd --direct --add-chain ipv4 filter data	# 在filter表中添加一条名为data的链,该链对ipv4地址进行过滤
# 添加data链后,对这个链添加规则
[root@localhost ~]# firewall-cmd --direct --add-rule ipv4 filter data 1 -s 192.168.0.66 -j ACCEPT		# 在data链中的第一行添加源地址192.168.0.66允许的规则