Firewalld防火墙企业实战

1. Firewalld防火墙简介

  • 从CentOS7开始,默认是没有iptables的,而使用了firewall防火墙,Firewalld 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具
  • 什么是动态防火墙,跟iptables有什么区别呢,iptables service 管理防火墙规则的模式:用户将新的防火墙规则添加进/etc/sysconfig/iptables 配置文件当中,再执行命令 service iptables reload 使变更的规则生效。
  • 整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。
  • 哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。
  • Firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。

2. Firewalld区域剖析

  • Firewalld将网卡对应到不同的区域(zone),zone 默认共有9个,block 、dmz 、drop、 external 、home、 internal 、public、 trusted、 work。
  • 不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public。
  • 在最新版本的fedora(fedora21)当中随着 server 版和 workstation 版的分化则添加了两个不同的自定义 zone FedoraServer 和 FedoraWorkstation 分别对应两个版本。
    1. 列出Firewalld所有支持的Zone 和查看当前的默认Zone,操作指令如下:
//查看firewalld支持的所有zone
[root@localhost ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
//查看firewalld默认的zone
[root@localhost ~]# firewall-cmd --get-default-zone
public

2.1. Firewalld区域(zone),说明如下:

  • iptables service 在 /etc/sysconfig/iptables 中储存配置
  • firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里
  • /etc/firewalld/的区域设定是一系列可以被快速执行到网络接口的预设定。
zone 解释
drop(丢弃) 任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制) 任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共) 在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部) 特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区) 用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作) 用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭) 用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部) 用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任) 可接受所有的网络连接。
  • 指定其中一个区域为默认区域是可行的。当接口连接加入了 NetworkManager,它们就被分配为默认区域。安装时,firewalld 里的默认区域被设定为公共区域

3. Firewalld服务剖析

  • 在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等。
  • 与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70+ 种服务供我们使用。
  • 当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中。
  • service 配置的好处显而易见:
  1. 通过服务名字来管理规则更加人性化
  2. 通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。
  • 每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:
[root@localhost ~]# firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger 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 isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut open ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

[root@localhost ~]# firewall-cmd --list-services
dhcpv6-client ssh

  • 动态添加一条防火墙规则如下:
    假设自定义的 ssh 端口号为 12222,使用下面的命令来添加新端口的防火墙规则:
[root@localhost ~]# firewall-cmd --add-port=12222/tcp --permanent
success
  • 如果需要使规则保存到 zone 配置文件,则需要加参数 --permanent
    举例如下:
[root@localhost ~]# firewall-cmd --add-port=8080/tcp
success
[root@localhost ~]# 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"/>
  <port protocol="tcp" port="12222"/>
</zone>
--可以看的出来没有firewall-cmd --add-port=8080/tcp这条规则。

4. Firewalld必备命令

  • CentOS7.x Linux系统使用Firewalld防火墙,需要掌握常见的Firewalld指令,如下为Firewalld常见的指令和参数含义:

4.1. 以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:

[root@localhost ~]# firewall-cmd --reload
success

4.2. 以 root 身份输入以下信息,重新加载防火墙,并中断用户连接,即丢弃状态信息:

[root@localhost ~]# firewall-cmd --complete-reload
success

4.3. 获取所有支持的ICMP类型

[root@localhost ~]# firewall-cmd --get-icmptypes
address-unreachable bad-header communication-prohibited destination-unreachable echo-reply echo-request fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option

4.4. 列出全部启用的区域的特性

[root@localhost ~]# firewall-cmd --list-all-zones
block
  target: %%REJECT%%
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


dmz
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


drop
  target: DROP
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


external
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


home
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client mdns samba-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


internal
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client mdns samba-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: dhcpv6-client ssh
  ports: 12222/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


trusted
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


work
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

4.5. 输出区域 全部启用的特性。如果生略区域,将显示默认区域的信息

[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: dhcpv6-client ssh
  ports: 12222/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

4.6. 查看work区域的特性:

[root@localhost ~]# firewall-cmd --zone=work --list-all
work
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

4.7. 查看默认区域:

[root@localhost ~]# firewall-cmd --get-default-zone
public

4.8. 修改默认区域:

[root@localhost ~]# firewall-cmd --set-default-zone=work
success
[root@localhost ~]# firewall-cmd --get-default-zone
work

4.9. 获取活动的区域

[root@localhost ~]# firewall-cmd --get-active-zones
work
  interfaces: ens33

4.10. 根据接口获取区域

[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
work

4.11. 启用默认区域中的http服务

[root@localhost ~]# firewall-cmd --add-service=http
success

4.12. 禁止 work 区域中的 http 服务:

[root@localhost ~]# firewall-cmd --zone=work --remove-service=http
success

4.13. 使区域中的 http服务生效60秒:

[root@localhost ~]# firewall-cmd --zone=work --add-service=http  --timeout=60
success

4.14. 查看firewalld允许的服务:

[root@localhost ~]# firewall-cmd --list-services
dhcpv6-client ssh

4.15. 启动默认区域的80端口

[root@localhost ~]# firewall-cmd --add-port=80/tcp
success
[root@localhost ~]# firewall-cmd --list-ports
80/tcp

4.15.永久启动public区域的8080端口

[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
success

4.16. 查询区域中是否启用了特定服务

[root@localhost ~]# firewall-cmd --zone=work --query-service=ssh
yes

[root@localhost ~]# firewall-cmd --zone=work --list-services
dhcpv6-client ssh

4.17. 启用public区域中的 IP 伪装功能

[root@localhost ~]# firewall-cmd --zone=public --add-masquerade
success
//此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。

4.18. 禁用public区域中的 IP 伪装

[root@localhost ~]# firewall-cmd --zone=public --remove-masquerade
success

4.19. 查询public区域的伪装状态

[root@localhost ~]# firewall-cmd --zone=public --add-masquerade
success
//查询public区域的伪装状态
[root@localhost ~]# firewall-cmd --zone=public --query-masquerade
yes

4.20. 启用public区域的 ICMP 阻塞功能

[root@localhost ~]# firewall-cmd --zone=public --add-icmp-block=network-unknown
success
//此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文,以及错误应答。

4.21. 查询public区域的ICMP 阻塞功能状态

[root@localhost ~]# firewall-cmd --zone=public --query-icmp-block=network-unknown
yes

4.22. 禁止public区域的 ICMP 阻塞功能

[root@localhost ~]# firewall-cmd --zone=public --remove-icmp-block=network-unknown
success

4.23. 将8080端口的流量转发到80端口

[root@localhost ~]# firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80
success
//查看
[root@localhost ~]# firewall-cmd --list-forward-ports
port=8080:proto=tcp:toport=80:toaddr=

4.24. 取消8080端口的流量转发到80端口

[root@localhost ~]# firewall-cmd --remove-forward-port=port=8080:proto=tcp:toport=80
success
[root@localhost ~]# firewall-cmd --list-forward-ports

4.25. 将本机8080端口的流量映射带192.168.2.50的80端口

//要想转发到非本地的端口需要开启ip伪装
//开启伪装命令
[root@localhost ~]# firewall-cmd --add-masquerade
success

[root@localhost ~]# firewall-cmd --add-forward-port=port=8080:proto=tcp:toaddr=192.168.2.50:toport=80
success

4.26. 查询默认区域的转发信息

[root@localhost ~]# firewall-cmd --list-forward-ports
port=8080:proto=tcp:toport=80:toaddr=192.168.2.50

4.27. 取消将本机8080端口的流量映射带192.168.2.50的80端口

[root@localhost ~]# firewall-cmd --remove-forward-port=port=8080:proto=tcp:toaddr=192.168.2.50:toport=80
success
[root@localhost ~]# firewall-cmd --list-forward-ports
  • 注意想要命令永久生效需要添加–permanent,然后加载firewall-cmd --reload。不然重启服务就失效了。

5. Firewalld配置文件实战

  • 修改配置文件添加规则:启动public区域的http服务
[root@localhost ~]# cd /etc/firewalld/zones/

//查看public区域是否开启http服务
[root@localhost zones]# firewall-cmd --zone=public --list-services
dhcpv6-client ssh

//修改 public.xml
[root@localhost zones]# vim public.xml
...
<service name="http"/>

//查看public.xml
[root@localhost zones]# cat 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"/>
  <service name="http"/>
  <port protocol="tcp" port="12222"/>
  <port protocol="tcp" port="8080"/>
</zone>

//加载Firewalld服务
firewall-cmd --reload

//查询
[root@localhost zones]# firewall-cmd --zone=public --list-services
dhcpv6-client http ssh
--可以看的出来已经添加成功了。

你可能感兴趣的:(网络,linux,运维)