最近工作上处理了很多关系配置服务器防火墙的操作,于是想写一篇理论与实践并存的文章,在这里分享给大家,希望对您有所帮助!
Firewalld是一种提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具,它自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现。
他们的作用是维护规则,而真正使用规则干活的是内核netfilter,firewalld和iptables的结构以及使用方法会有点不一样。
从逻辑上可分为:主机防火墙和网络防火墙
从物理上可分为:硬件防火墙和软件防火墙
firewalld和iptables就属于主机层面的防火墙
主机防火墙主要通过netfilter和TCP Wrappers两个机制来管理的。
Netfilter:数据包过滤机制
TCP Wrappers:程序管理机制
关于数据包过滤机制(Netfilter)两个软件:firewalld与iptables
注意:在RHEL7系列中,默认使用firewalld作为防火墙。在7系列之前使用的是iptables作为默认防火墙。
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。
【例如】互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,
初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。
网络区名称 | 默认配置 |
---|---|
trusted | 可接受所有的网络连接 |
home | 用于家庭网络 |
internal | 用于内部网络,仅接受ssh,mdns,gp-client,samba-client,dhcpv6-client连接 |
work | 用于工作区,仅接受sshjpp-client,dhcpv6-client服务连接 |
public | 用于工作区, 仅接受ssh,ipp-client,dhcpv6-client服务连接,在公共区域内使用,仅接受ssh或dhcpv6-client服务连接,是firewalld的默认区域 |
dmz | 仅接受ssh服务的连接 |
【温馨提示】firewalld的默认区域是 public
firewalld默认提供了九个zone配置文件:block.xml、 dmz.xml、 drop.xml、 external.xml、 home.xml、 internal.xml、 public.xml、 trusted.xml、 work.xml,都保存在 /usr/lib/firewalld/zones/目录下。
firewalld与 iptables 都是 linux 中防火墙的管理程序,但其实其角色主要为对于防火墙策略的管理,真正的防火墙执行者是位于内核中的 netfilter。
iptables 仅能通过命令行进行配置;而 firewalld 提供了图形接口,类似windows防火墙的操作方式;
iptables 每一个单独更改意味着清除所有旧的规则,并从 /etc/sysconfig/iptables 中读取所有新的规;则;而 firewalld 在有规则变动后,可以仅仅运行规则中的不同之处,即在 firewalld 运行时间内,改变设置时可以不丢失现行链接;
iptables 的配置文件在 /etc/sysconfig/iptables 中;而 firewalld 的配置文件在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件中;
iptables 没有守护进程,并不能算是真正意义上的服务;而 firewalld 有守护进程;
iptables 通过控制端口来控制服务,而 firewalld 则是通过控制协议来控制端口;
【firewalld】默认是拒绝;而【iptables】默认是允许。
【温馨提示】
service说明:在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等。这个目录下的服务配置默认是放通的,不受firewalld-cmd 规则控制,除非把这个目录下的服务配置文件删掉,就恢复了默认了(默认拒绝),当然也可以添加一些服务配置文件。
firewall-config(需要有图形化界面的才能使用), firewall-cmd是命令行工具,实际生产环境主要使用firewall-cmd来操作
运行时( runtime) :修改规则马上生效,但是临时生效,默认是运行时状态
持久配置( permanent) :修改后需要重载才会生效,有--permanent参数
1firewall-cmd --permanent [RULE] 2firewall-cmd --reload
可以通过 man firewall-cmd或者 firewall-cmd --help查看帮助,firewalld的选项很多,下面列出一些比较常用的
1firewall-cmd --help 2 3 --permanent # 配置写入到配置文件,永久生效 4 --reload # 重载配置文件,永久生效 5 --zone= # 指定区域,默认是public 6 --get-default-zone # 查看默认区域 7 --set-default-zone= # 设置默认区域 8 --get-zones # 获取所有可用的区域 9 --get-active-zones # 获取当前激活(活跃)的区域 10 --add-source= # 添加地址,可以是主机或网段,遵循当前区域的target 11 --remove-source # 移除地址,可以是主机或网段,遵循当前区域的target 12 --add-service= # 添加服务 13 --remove-service= # 移除服务 14 --list-services # 显示当前区域内允许访问的所有服务 15 --add-port=xx/tcp # 添加端口,后面要指定是TCP还是UDP 16 --remove-port= # 移除端口,遵循当前区域的target 17 --list-ports # 显示指定区域内允许访问的所有端口号 18 --list-all # 列出当前使用的区域的配置 19 --list-all-zones # 列出所有区域的配置 20 --get-zone-of-interface= # 获取指定接口所在的区域 21 --list-icmp-blocks # 显示指定区域内拒绝访问的所有ICMP类型 22 --list-protocols --列出在指定区域中允许通过的协议
(1)查看规则
查看当前区域的配置信息详解
1[root@localhost ]# firewall-cmd --list-all
2public (active) # 活动的区域
3 target: default # 默认启动的区域
4 icmp-block-inversion: no # ICMP协议类型黑白名单开关(yes/no)
5 interfaces: eth0 # 关联的网卡接口
6 sources: # 来源,可以是IP地址,也可以是mac地址
7 services: dhcpv6-client ssh # 列出允许通过这个防火墙的服务
8 ports: 80/tcp # 列出允许通过这个防火墙的目标端口。(即 需要对外开放的端口)
9 protocols: # 协议值可以是一个协议 ID 数字,或者一个协议名
10 masquerade: no # 表示这个区域是否允许 IP 伪装。如果允许,它将允许 IP 转发,它可以让你的计算机作为一个路由器
11 forward-ports: # 列出转发的端口
12 source-ports: # 允许的来源端口
13 icmp-blocks: # 可添加ICMP类型,当icmp-block-inversion为no时,这些ICMP类型被拒绝;当icmp-block-inversion为yes时,这些ICMP类型被允许
14 rich rules: # 富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的
15 rule family="ipv4" source address="192.168.250.0/24" accept
常用的查看信息
1# 查询默认区域配置信息 2firewall-cmd --list-all 3# 查看指定区域配置信息 4firewall-cmd --list-all --zone=work 5# 查询所有端口 6firewall-cmd --list-ports 7# 查询指定端口 8firewall-cmd --zone=public --query-port=22/tcp 9# 查询放通IP段 10firewall-cmd --list-sources 11# 查看默认区域 12firewall-cmd --get-default-zone 13# 查看所有可以使用的区域 14firewall-cmd --get-zones 15# 查看活跃的区域 16firewall-cmd --get-active-zones 17# 查看网卡绑定在了哪个区域 18firewall-cmd --get-zone-of-interface=[IFACE] 19# 查看所有服务 20firewall-cmd --get-services
(2)添加规则
1、开放特定端口
1# 开放3306端口 2firewall-cmd --zone=public --add-port=3306/tcp --permanent 3 4# 开放snmp的161的UDP端口,默认的zone是public,可以不指定zone 5firewall-cmd --add-port=161/udp --permanent 6 7# 让配置生效 8firewall-cmd --reload 9 10# 查看规则 11firewall-cmd --list-ports 12firewall-cmd --list-all
2、放通某个服务
1# 放通nfs服务的所有端口 2firewall-cmd --zone=public --add-service=nfs --permanent 3 4# 放通ssh服务 5firewall-cmd --zone=public --add-service=ssh --permanent 6 7# 放通snmp服务 8firewall-cmd --zone=public --add-service=snmp --permanent 9 10# 重载防火墙 11firewall-cmd --reload 12 13# 查看放通了哪些服务访问 14firewall-cmd --list-services
3、放通某个网段访问
1firewall-cmd --add-source=10.10.10.0/24 --zone=public 2 3firewall-cmd --reload 4 5# 查看 6firewall-cmd --list-sources
(3)删除规则
1# 删除开放的3306端口 2firewall-cmd --permanent --remove-port=3306/tcp 3firewall-cmd --reload 4 5# 删除nfs服务 6firewall-cmd --permanent --remove-service=nfs 7 8# 删除某个网段访问 9firewall-cmd --permanent --zone=public --remove-source=10.10.10.0/24 10firewall-cmd --reload
富规则是为了更细粒度的管控,在生产环境用的比较多,重点掌握
1firewall-cmd 2 3 --list-rich-rules --列出富规则 4 --add-rich-rule=<rule> --添加富规则 5 --remove-rich-rule=<rule> --移除富规则 6 --list-all 和 --list-all-zones --也能列出存在的富规则
规则的几乎每个单一元素都能够以option=value形式来采用附加参数
1rule 2 3 [source] 4 5 [destination] 6 7 service|port|protocol|icmp-block|masquerade|forward-port 8 9 [log] 10 11 [audit] 12 13 [accept|reject|drop]
格式:
1rule [family="ipv4|ipv6"] 2 3source address="address[/mask]" [invert="True"] 4 5destination address="address[/mask]" invert="True" 6 7service name="service name" 8 9port port="port value" protocol="tcp|udp" 10 11protocol value="protocol value" 12 13forward-port port="port value" protocol="tcp|udp" to-port="port value 14 15" to-addr="address" 16 17log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] 18 19accept | reject [type="reject type"] | drop
(1)对特定IP访问特定端口
1firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.10.10.110/32" port port="1521" protocol="tcp" accept" 2firewall-cmd --reload
(2)批量加端口,允许某个网段访问多个端口
1firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.10.10.0/24 port port=8080-8090 protocol=tcp accept' 2firewall-cmd --reload
(3)开通某个IP访问某个服务
1firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 service name=nfs source address="10.10.10.101/32" accept' 2firewall-cmd --reload
(4)拒绝某个IP访问所有端口
1firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=10.10.10.110/32 reject' 2firewall-cmd --reload
(5)允许某个IP访问所有端口
1firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=10.10.10.110/32 accept' 2firewall-cmd --reload