1、firewalld概述
firewalld是什么?**
- FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。
什么是动态防火墙?
- 我们首先需要弄明白的第一个问题是到底什么是动态防火墙。为了解答这个问题,我们先来回忆一下 iptables service 管理防火墙规则的模式:用户使用命令添加防火墙的规则,如果想让规则永久保存,还需要再执行命令 service iptables reload 使变更的规则保存到配置文件里。在这整个过程的背后,iptables service 会对防火墙的规则列表全部重读一次,加载到内核.
- 如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。
firewalld和iptables的关系
- 这里有必要说明一下 firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
什么是区域(zone)?
- 过滤规则集合:zone
- 一个zone就是一套过滤规则,数据包必须要经过某个zone才能入站或出站。不同zone中规则粒度粗细、安全强度都不尽相同。可以把zone看作是一个个出站或入站必须经过的安检门,有的严格、有的宽松、有的检查的细致、有的检查的粗略。
- firewalld将网卡对应到不同的区域(zone),zone 默认共有9个;
- block :限制,任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
- dmz :非军事区,用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
- drop :丢弃,任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
- external:外部,特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接;
- home:家庭,用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
- internal:内部,用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接;
- public:公共,在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
- trusted:信任,可接受所有的网络连接。
- work:工作,用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
- 不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public.
- 指定其中一个区域为默认区域是可行的。当接口连接加入了 NetworkManager,它们就被分配为默认区域。安装时,firewalld 里的默认区域被设定为公共区域。
- 简单来讲就是为用户预先准备了几套规则集合,我们可以根据场景的不同选择合适的规矩集合,而默认区域是public。
什么是服务?
在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等.
与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70多 种服务供我们使用.
当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中.
- /etc/firewalld/ 存放修改过的配置(优先查找,找不到再找默认的配置)
- /usr/lib/firewalld/ 默认的配置
修改配置的话只需要将/usr/lib/firewalld中的配置文件复制到/etc/firewalld中修改。恢复配置的话直接删除/etc/firewalld中的配置文件即可。
- 比如:ssh服务默认运行在22端口,如果你的ssh服务运行在220端口(不是默认),此时需要放行220端口,就需要把/usr/lib/firewalld/ssh.xml 文件拷到 /etc/firewalld/services/ 目录下,修改文件端口为220
[root@node0 ~]# ls /usr/lib/firewalld/services/
[root@node0 ~]# ls /usr/lib/firewalld/services/
amanda-client.xml https.xml nfs3.xml sip.xml
...................
2、firewalld的命令展示
service配置的好处
- 通过服务名字来管理规则更加人性化,
- 通过服务来组织端口分组的模式更加高效
- 如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。
- 每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:
#列出所有支持的service
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls managesieve mdns minidlna mongodb mosh mountd ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
#查看当前zone加载的service
[root@node0 ~]# firewall-cmd --list-services
ssh dhcpv6-client
常用的firewalld命令展示
#安装firewalld
[root@node0 ~]# yum -y install firewalld
#启动
[root@node0 ~]# systemctl start firewalld
#查看状态
[root@node0 ~]# systemctl status firewalld
#停止
[root@node0 ~]# systemctl disable firewalld
#禁用
[root@node0 ~]# systemctl stop firewalld
#查看版本
[root@node0 ~]# firewall-cmd --version
0.5.3
#查看帮助
[root@node0 ~]# firewall-cmd --help
#显示状态
[root@node0 ~]# firewall-cmd --state
running
#查看区域信息
[root@node0 ~]# firewall-cmd --get-active-zones
public
interfaces: ens32
#查看指定接口所属的区域
[root@node0 ~]# firewall-cmd --get-zone-of-interface=ens32
public
#拒绝所有的包
[root@node0 ~]# firewall-cmd --panic-on
#取消拒绝状态
[root@node0 ~]# firewall-cmd --panic-off
#查看是否拒绝
[root@node0 ~]# firewall-cmd --query-panic
#更新防火墙规则
[root@node0 ~]# firewall-cmd --reload
#或者是
[root@node0 ~]# firewall-cmd --complete-reload
success
#列出所有支持的zone
[root@node0 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
#查看当前默认的zone
[root@node0 ~]# firewall-cmd --get-default-zone
public
#设置默认接口区域--->这里是立即生效的,不用重启
[root@node0 ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success
#把接口添加到区域,默认接口都在public
[root@node0 ~]# firewall-cmd --zone=public --add-interface=ens32
The interface is under control of NetworkManager, setting zone to 'public'.
success
#如果需要永久生效-->加上--permanent -->然后在reload防火墙
[root@node0 ~]# firewall-cmd --zone=public --add-interface=ens32 --permanent
The interface is under control of NetworkManager and already bound to 'public'
The interface is under control of NetworkManager, setting zone to 'public'.
success
[root@node0 ~]# firewall-cmd --reload
success
#查看打开的所有端口
[root@node0 ~]# firewall-cmd --zone=dmz --list-ports
#添加一个端口到指定区域
[root@node0 ~]# firewall-cmd --zone=dmz --add-port=8080/tcp
success
#如果要永久生效就必须加上参数--permanent 然后reload
#添加某个服务到规则
[root@node0 ~]# firewall-cmd --zone=work --add-service=smtp
success
#移除服务
[root@node0 ~]# firewall-cmd --zone=work --remove-service=smtp
success
#输出某个区域全部启用的特性,如果省略区域,将显示默认区域
[root@node0 ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
#获取活动的区域
[root@node0 ~]# firewall-cmd --get-active-zones
public
interfaces: ens32
#根据接口获取区域
[root@node0 ~]# firewall-cmd --get-zone-of-interface=ens32
public
#把接口添加到区域当中
[root@node0 ~]# firewall-cmd --zone=public --add-interface=ens34
success
#修改接口所在的区域
[root@node0 ~]# firewall-cmd --zone=public --change-interface=ens34
success
#从区域中删除一个接口
[root@node0 ~]# firewall-cmd --zone=public --remove-interface=ens34
success
#查询区域中是否包含接口
[root@node0 ~]# firewall-cmd --zone=dmz --query-interface=ens32
no
#查看该区域中启用的服务
[root@node0 ~]# firewall-cmd --zone=public --list-services
ssh dhcpv6-client
#启用应急模式阻断所有网络连接,以防出现紧急状况
[root@node0 ~]# firewall-cmd --panic-on
[root@node0 ~]# firewall-cmd --panic-off
#查询应急模式
[root@node0 ~]# firewall-cmd --query-panic
no
3、firewalld的手工调试实验
通过配置文件来使用firewalld的方法
- 系统本身已经内置了一些常用服务的防火墙规则,存放在/usr/lib/firewalld/services/
注意! - 请勿编辑/usr/lib/firewalld/services/ ,只有 /etc/firewalld/services 的文件可以被编辑。
#查看
[root@node0 ~]# ls /usr/lib/firewalld/services/
#动态添加一条防火墙规则如下;以下例子均以系统自带的public zone为例子;
#假设自定义的 ssh 端口号为123,使用下面的命令来添加新端口的防火墙规则:
#如果需要使规则保存到 zone 配置文件,则需要加参数 –permanent
[root@node0 ~]# firewall-cmd --add-port=123/tcp
success
[root@node0 ~]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
</zone>
#如果加上--permanent的话
[root@node0 ~]# firewall-cmd --add-port=123/tcp --permanent
[root@node0 ~]# cat /etc/firewalld/zones/public.xml
..............
<port protocol="tcp" port="123"/>
.........
防火墙的配置文件也是可以手动修改,修改后记得重载
- 如果想要开放80端口供外部访问http㐏
- 把http.xml文件复制到/etc/firewalld/services/下面
- 这个cp命令其实是可以省略的,系统会优先去读取 /etc/firewalld 里面的文件,读取完毕后,会去/usr/lib/firewalld/services/ 再次读取.为了方便修改和管理,建议复制到/etc/firewalld
[root@node0 ~]# cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/
[root@node0 ~]# ls /etc/firewalld/services/
http.xml
#首先修改一下默认的规则
[root@node0 ~]# cp /etc/firewalld/zones/public.xml{,.bak}
[root@node0 ~]#
#在这个文件中添加一下http服务
......
<service name="ssh"/>=
#添加这一行
<service name="http"/>
#重启防火请就能完成
[root@node0 ~]# firewall-cmd --reload
success
修改ssh.xml文件的123为ssh的端口
#还是老规矩,复制一下配置 文件
[root@node0 ~]# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
#然后修改一下配置文件的默认端口
[root@node0 ~]# cat /etc/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="123"/> #修改这个默认的
</service>
#然后重载配置文件就ok了
[root@node0 ~]# firewall-cmd --reload
success
设置指定ip访问ssh端口
- 修改/etc/firewalld/zones/中的rule字段内为要限制的ip和使用的服务
[root@node0 ~]# vim /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your compu
ter. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="http"/>
<service name="dhcpv6-client"/>
<port protocol="tcp" port="123"/>
#在这里面添加如下几行
<rule family="ipv4">
<source address="192.168.75.131"/>
<service name="ssh"/>
<accept/>
</rule>
---------------
</zone>
#然后重启服务
[root@node0 ~]# firewall-cmd --reload