2.1、说明:
1、在 RHEL7 里有几种防火墙共存,firewalld、iptables,默认是使用 firewalld 来管理 netfilter 子系统,不过底层调用的命令仍然是 iptables 等。
2、Firewalld 是提供支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它具备对 IPv4 和 IPv6 防火墙设置的支持,
支持以太网桥,并有分离运行时间和永久性配置选择。它还具备一个通向服务或者应用程序以直接增加防火墙规则的接口。
系统提供了图像化的配置工具firewall-config、system-config-firewall, 提供命令行客户端 firewall-cmd, 用于配置 firewalld 永久性或非永久性运
行时间的改变。
3、以前的system-config-firewall/lokkit 防火墙模型是静态的,每次修改都要求防火墙完全重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配
置所需模块的装载等,而模块的卸载将会破坏状态防火墙和确立的连接。相反,firewall daemon 动态管理防火墙,不需要重启整个防火墙便可应用
更改,因而也就没有必要重载所有内核防火墙模块了。不过,要使用 firewall daemon 就要求防火墙的所有变更都要通过该守护进程来实现,以确保
守护进程中的状态和内核里的防火墙是一致的。
4、firewall daemon 无法解析由 iptables 和 ebtables 命令行工具添加的防火墙规则。firewalld 和 iptables service 之间最本质的不同是,
iptables service 在 /etc/sysconfig/iptables 中储存,而 firewalld 将配置储存在 /usr/lib/firewalld/(系统配置文件,预定义配置文件)
和 /etc/firewalld/(用户配置文件) 中的各种XML文件里。使用 iptables service 每一个单独更改意味着清除所有旧有的规则和从
/etc/sysconfig/iptables 里读取所有新的规则,然而使用 firewalld 却不会再创建任何新的规则,仅仅运行规则中的不同之处,因此
firewalld 可以在运行时间内改变设置而不丢失现行连接。firewalld 有基于 CLI(命令行界面) 和基于 GUI(图形用户界面) 两种管理方式,即
firewall-cmd(终端管理工具) 和 firewall-config(图形管理工具)。
5、firewalld 跟 iptables 的区别:
(1)firewalld可以动态修改单条规则,动态管理规则集,允许更新规则而不破坏现有会话和连接,而iptables,在修改了规则后必须得全部刷新才可以生效。
(2)firewalld使用区域和服务而不是链式规则。
(3)进站:firewalld默认是拒绝的(ping和ssh不拒绝),需要设置以后才能放行。而iptables默认是允许的,需要拒绝的才去限制。
出站:firewalld、iptables 不限制。
(4)firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现。也就是说,firewalld和iptables一样,它们的作用都用于维
护规则,而真正使用规则干活的是内核的netfilter。只不过firewalld和iptables的结果以及使用方法不一样!firewalld是iptables的一个封装,可以让你更容易
地管理iptables规则。它并不是iptables的替代品,虽然iptables命令仍可用于firewalld,但建议firewalld时仅使用firewalld命令。
(5)firewalld 默认每个服务是拒绝,每个服务都需要去设置才能放行;iptables 默认是每个服务是允许,需要拒绝的才去限制。
6、firewalld 自身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来实现,也就是说 firewalld 和 iptables 一样,他们的作
用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。
7、firewalld 机制:
8、firewalld中常用的区域名称及策略规则:
(1)区域:
firewalld支持动态更新技术并加入了区域(zone)的概念,简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),
用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
从上图我们可以看到,firewalld默认出口是全放开的。
(2)确定使用的区域:
public 是默认区域(zone)。
对于一个接收到的请求具体使用哪个 zone,firewalld 是通过下面三种方式来判断的:
source:来源地址。
Interface:接收请求的网卡。
firewalld:配置的默认区域(zone)。
这三个方式的优先级按顺序依次降低,也就是说如果按照 source 可以找到就不会再按 interface 去找,如果前两个都找不到才会使用第三个默认区域。
9、firewalld-cmd 命令(firwall-cmd 是 Linux 提供的操作 firewalld 服务的一个工具):
(1)参数:
(2)参数说明:
1)firewalld 配置的防火墙策略默认为运行时(Runtime)模式,只能临时生效,是立刻生效的,又称为当前生效模式,而且随着系统的重启会失
效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在 firewall-cmd 命令后面添加 --permanent 参数,这样
配置的防火墙策略就可以永久生效了。但是永久生效模式有一个特点,就是使用它设置的策略只有在系统重启后才会生效,如果想让配置策略永
久并立即生效,需要手动执行 firewall-cmd --reload 重载命令。注意,remove 掉 ssh 服务或者 ssh 端口,当前远程登陆会话不会断开,退出后
就无法远程连接了。
2)添加常用端口,默认会添加到默认的区域(如果没有修改默认区域,默认区域为 public)。
2.2、firewalld 基本操作:
1、安装 firewalld 软件:
[root@centos-test ~]# yum install -y firewalld firewall-config
2、启动 firewalld 服务:
[root@centos-test ~]# systemctl start firewalld
3、关闭 firewalld 服务:
[root@centos-test ~]# systemctl stop firewalld
4、重启 firewalld 服务:
[root@centos-test ~]# systemctl restart firewalld
5、查看 firewalld 服务状态:
[root@centos-test ~]# systemctl status firewalld
6、开启 firewalld 服务开机自启:
[root@centos-test ~]# systemctl enable firewalld
7、关闭 firewalld 服务开机自启:
[root@centos-test ~]# systemctl disable firewalld
8、查看 firewalld 服务开机自启状态:
[root@centos-test ~]# systemctl list-unit-files | grep firewalld
2.3、firewalld-cmd 一般规则:
1、查看 firewalld 服务的状态:
[root@centos-test ~]# firewall-cmd --state
running
2、列出 firewalld 服务指定域的所有设置(默认的规则):
[root@centos-test ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
# 目标
icmp-block-inversion: no
# ICMP协议类型黑白名单开关(yes/no)
interfaces: eth0 eth1
# 关联的网卡接口
sources:
# 来源,可以是IP地址,也可以是mac地址
services: ssh dhcpv6-client
# 允许的服务
ports:
# 允许的目标端口,即本地开放的端口,这里添加的是公开端口,所有的IP地址都能访问。
protocols:
# 允许通过的协议
masquerade: no
# 是否允许伪装(yes/no),可改写来源IP地址及mac地址
forward-ports:
# 允许转发的端口
source-ports:
# 允许的来源端口
icmp-blocks:
# 可添加ICMP类型,当icmp-block-inversion为no时,这些ICMP类型被拒绝;当icmp-block-inversion为yes时,
# 这些ICMP类型被允许。
rich rules:
# 富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的。
3、查看当前 firewalld 服务活动的区域,并附带一个目前分配给它们的接口列表:
[root@centos-test ~]# firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
4、查看 firewalld 服务默认区域:
[root@centos-test ~]# firewall-cmd --get-default-zone
public
5、查看 firewalld 服务所有可用区域:
[root@centos-test ~]# firewall-cmd --get-zones
block dmz drop external home public public trusted work
6、列出 firewalld 服务所有预设服务:
[root@centos-test ~]# firewall-cmd --get-services
# 这样将列出 /usr/lib/firewalld/services/ 中的服务器名称,注意配置文件是以服务本身命名的service-name.xml。
7、列出 firewalld 服务所有区域的设置:
[root@centos-test ~]# firewall-cmd --list-all-zones
8、设置 firewalld 服务默认区域:
[root@centos-test ~]# firewall-cmd --set-default-zone=public
9、设置 firewalld 服务网络地址到指定的区域:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-source=172.16.1.0/24
# 凡是网段为 172.16.1.0/24 发来包将会使用 public 区域设置的规则。
# --permanent参数表示永久生效设置,如果没有指定 --zone 参数,那么会加入默认区域。
10、删除 firewalld 服务指定区域中的网络地址:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-source=172.16.1.0/24
11、查询、列出、添加、改变、删除 firewalld 服务指定域网络接口:
[root@centos-test ~]# firewall-cmd --get-zone-of-interface=eth0
[root@centos-test ~]# firewall-cmd --zone=public --list-interface
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-interface=eth0
[root@centos-test ~]# firewall-cmd --permanent --zone=public --change-interface=eth0
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-interface=eth0
12、查询、列出、添加、删除 firewalld 服务中的服务:
[root@centos-test ~]# firewall-cmd --zone=public --query-service=smtp
[root@centos-test ~]# firewall-cmd --zone=public --list-service
# 查看当前zone下有哪些service
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-service=smtp
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-service=smtp
13、查询、列出、添加、删除 firewalld 服务中的端口:
[root@centos-test ~]# firewall-cmd --zone=public --query-port=8080/tcp
[root@centos-test ~]# firewall-cmd --zone=public --list-ports
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-port=8080/tcp
# 端口既可以是一个独立端口数字,又或者端口范围,例如,5060-5062。
# 协议可以指定为 tcp 或 udp。
14、firewalld 服务应急模式:
[root@centos-test ~]# firewall-cmd --query-panic
# 查看是否为应急模式
[root@centos-test ~]# firewall-cmd --panic-on
# 打开应急模式,拒绝所有流量,远程连接会立即断开,只有本地能登陆。
[root@centos-test ~]# firewall-cmd --panic-off
# 取消应急模式,但需要 reload firewalld 后才可以远程ssh。
# 如果是远程的机器执行上面的规则会立刻断开网络连接,必须紧记不能随便执行。如果你只是虚拟机
或者物理机器登陆就可以执行来调试。
15、将同一台服务器上 80 端口的流量转发至 8080:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
success
[root@centos-test ~]# firewall-cmd --reload
[root@centos-test ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports: port=80:proto=tcp:toport=8080:toaddr=
source-ports:
icmp-blocks:
rich rules:
16、防火墙可以实现伪装IP的功能,将端口转发到另外一台服务器上就会用到这个功能:
[root@centos-test ~]# firewall-cmd --zone=public --query-masquerade
# 检查是否允许伪装IP
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-masquerade
# 允许防火墙伪装IP
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-masquerade
# 禁止防火墙伪装IP
17、将本地的 80 端口的流量转发到IP地址为 172.16.1.15 的远程服务器上的 8080 端口(目的地址转换),需要开启masquerade:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-masquerade
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.10.15
[root@centos-test ~]# firewall-cmd --reload
[root@centos-test ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: yes
forward-ports: port=80:proto=tcp:toport=8080:toaddr=
port=80:proto=tcp:toport=8080:toaddr=10.0.10.15
source-ports:
icmp-blocks:
rich rules:
18、重载 firewalld 服务:
[root@centos-test ~]# firewall-cmd --reload
# 注意,这并不会中断已经建立的连接,如果打算中断,可以使用 --complete-reload选项。
# 如果没有去reload,list-all 命令是看不到你新设置的东西的。
2.4、firewalld-cmd 富规则设置(rich rules):
0、说明:
(1)rule :规则。
(2)family:'ipv4':指定ipv4的地址。
(3)source address='10.0.10.1':要拒绝或接受的IP,可以是IP或者是IP段。
(4)service name='ssh':指定的是ssh服务。
(5)drop:此条规则的执行方法是丢弃。
(6)reject:此条规则的执行方法是拒绝。
(7)accept:此条规则的执行方法是接受。
1、查询、禁用、删除、自定义 firewalld 服务的 ping 响应:
[root@centos-test ~]# firewall-cmd --zone=public --query-rich-rule="rule protocol value='icmp' drop"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule protocol value='icmp' drop"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-rich-rule="rule protocol value='icmp' drop"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' protocol value='icmp' accept"
# 允许172.16.1.10主机ping。
2、添加或拒绝某个IP访问ssh端口:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' service name='ssh' accept"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.0/24' port protocol='tcp' port='22' accept"
# 允许172.16.1.0/24网段的主机访问22端口。
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' service name='ssh' reject"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' service name='ssh' drop"
# reject 和 drop 的效果是一样的。
3、列出所有多语言规则:
firewall-cmd --zone=public --list-rich-rules
4、允许172.16.1.10主机所有连接:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' accept"
5、每分钟允许2个新连接访问ftp服务:
firewall-cmd --permanent --zone=public --add-rich-rule="rule service name='ftp' limit value='2/m' accept"
6、同意新的 IPv4 和 IPv6 连接 FTP,并使用审核每分钟登录一次:
firewall-cmd --permanent --zone=public --add-rich-rule="rule service name='ftp' log limit value='1/m' audit accept"
7、允许172.16.1.0网段中的主机访问ftp服务:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.0/24' service name='ftp' accept"
8、将来自172.16.1.0/24网段访问本地8080端口的流量转发到172.16.1.208主机的80端口(源地址转换):
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.0/24' forward-port port='8080' protocol='tcp' to-port='80' to-addr='172.16.1.208'"
# 伪装(需要开启masquerade),将来自局域网172.16.1.0/24网段访问外网的流量映射为网络出口公网IP,即修改源IP地址。
9、禁止172.16.1.10访问https服务,并返回错误信息:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' service name='https' reject"
# 如果是drop的话是直接丢弃,会返回timeout(连接超时)。
10、每分钟允许2个新连接访问ftp服务:
firewall-cmd --permanent --zone=public --add-rich-rule="rule service name='ftp' limit value='2/m' accept"
11、允许新的ipv4和ipv6连接ftp,并使用日志和审核,每分钟允许访问一次:
firewall-cmd --permanent --zone=public --add-rich-rule="rule service name='ftp' log limit value='1/m' audit accept"
12、将来自172.16.1.0/24网段访问本机8080端口的流量转发到本机的80端口:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.0/24' forward-port port='8080' protocol=tcp to-port=80"
13、允许一个IP(172.16.1.10)仅能通过指定端口(8080-8090)访问到目标(172.16.1.12):
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' destination address='172.16.1.12/32' port port='8080-8090' protocol='tcp' accept"
14、添加、删除 firewalld 服务可以访问的IP地址:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' port port='80' protocol='tcp' accept"
# 允许172.16.1.10主机访问80端口。
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family='ipv4' source address='172.16.1.10' port port='80' protocol='tcp' accept"
# 移除172.16.1.10主机访问80端口的策略。
2.5、补充:
1、地址转换问题:
(1)源地址转换,就是我们平常说的代理上网,应用场景就是代理内网用户上网。
(2)目的地址转换,就是我们常说的端口映射,应用场景是发布服务到外网。
(3)双向地址转换,就是先将数据包的目的地址转换后再转换源地址,应用场景是内网以公网ip访问内网的业务系统。
2、如何清除 firewalld 服务规则:
(1)如果防火墙配置了规则很多如果清空规则呢,firewalld默认没有命令来清空规则。但是我们可以通过编辑配置文件来清除规则。
/etc/firewalld/zones/ 此处为配置生效后保存的配置文件,当用命令每次将新的配置写入到配置文件之中后,系统会自动的备份以
前的文件。如果是手动修改需要先对配置文件进行备份。
[root@centos-test ~]# ls /etc/firewalld/zones
public.xml public.xml.old
3、使用默认模板的形式添加服务(用于定制服务端口):
(1)所有的默认规则都可以在 /usr/lib/firewalld/ 中找到:
[root@centos-test ~]# ls /usr/lib/firewalld/
helpers icmptypes ipsets services xmlschema zones
(2)复制默认目录下的规则到配置目录下:
[root@centos-test ~]# cp -a /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services/
(3)配置文件中包含了服务名,端口,还有服务的相关说明:
[root@centos-test ~]# cat /etc/firewalld/services/ftp.xml
need the vsftpd package installed for this option to be useful.
(4)在 /etc/firewalld/zones/public.xml 中增加一行
[root@centos-test ~]# vim /etc/firewalld/zones/public.xml
ections are accepted.
(5)重载firewalld:
[root@centos-test ~]# firewall-cmd --reload
(6)查看服务:
[root@centos-test ~]# firewall-cmd --zone=public --list-service
ssh dhcpv6-client ftp
手机扫一扫
移动阅读更方便
你可能感兴趣的文章