文章目录
- 一、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 > filterfilter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射等)
mangle:用于对特定数据包的修改
raw:优先级最高,设置raw时一般是为了不再让iptables做数据包跟踪处理,提高性能
raw表只使用在PREROUTING链和OUTPUT链,因为优先级最高,从而可以对收到的数据包在链接跟踪前处理。一旦使用了raw表,在某个链上,raw表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了
四个表中,用的最多的是filter表过滤,然后就是nat表用于转发
(2)五链
iptables
的五个链PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARD:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTING:发送到网卡接口之前
图中的五个链分别对应了内核中的对应的五个内核函数(在内核中函数名称是小写,所以这里五条链用大写与之区分),按照箭头指向顺序,假设有一个数据包,我现在不想让其进入内核,那么就在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允许的规则