CentOS 7云服务器如何使用firewalld防火墙?

  • 发布时间:2020-02-20 11:19:23
  • 阅读次数:45

firewalld是一款同时支持IPv4和IPv6的动态防火墙软件,可运行在基于RHEL 7(红帽企业级Linux)的操作系统上。firewalld是对传统iptables防火墙的升级换代。本文就以CentOS 7操作系统为例,说明如何使用firewalld防火墙,主要用到的工具是firewall-cmd命令。

首先我们需要确认firewalld是否已成功安装。用下面的命令来查看firewalld的状态:

$ systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2016-03-10 15:07:00 UTC; 1min 30s ago

可以看出,在这台云服务器上,firewalld已成功安装并加载。

我们还可以用firewall-cmd工具来查看:

$ firewall-cmd --state
running

区域管理

和iptables不同,firewalld引入了一个叫做区域的概念,用于定义安全等级。区域的使用很灵活,我们可以把不同的网络接口添加到不同的区域中,也可以把所有的网络接口都添加到一个区域中。通过这样的划分,只要在区域上设置了防火墙规则,就可以应用于该区域下的所有网络接口。为了便于用户上手,firewalld建立了一个初始的默认区域。和区域相关的常用命令如下。

查看当前区域:

$ firewall-cmd --get-zones
block dmz drop external home internal public trusted work

查看默认区域:

$ firewall-cmd --get-default-zone
public

更改默认区域:

$ firewall-cmd --set-default-zone=home

值得注意的是,firewalld的设置文件是/etc/firewalld/firewalld.conf。虽然可以通过手工修改这个文件来设置firewalld,但是仍然推荐使用firewall-cmd命令,否则容易出现错误。

获取活跃区域:

$ firewall-cmd --get-active-zones

获取某个网络接口对应的区域(以eth0为例):

$  firewall-cmd --get-zone-of-interface=eth0

如果默认区域不能满足更精细化的需求,还可以创建新区域(以zone1为例):

$ firewall-cmd --permanent --new-zone=zone1

创建之后,需要重新加载:

$ firewall-cmd --reload

把某个网络接口(以eth1为例)添加到某个区域(以internal为例)下:

$ firewall-cmd --permanent --zone=internal --change-interface=eth1

列出某个区域下的全部信息,包括网络接口、允许的服务、端口设置等:

$ firewall-cmd --permanent --zone=public --list-all
public (default)
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

服务管理

区域设置完毕之后,就可以把服务添加到区域中了。这里的服务指的是协议和端口的组合。

查看可用服务:

$ firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https

查看默认区域下的服务:

$ firewall-cmd --list-services
dhcpv6-client ssh

把某个服务(以http为例)添加到某个区域(以public为例)下:

$ firewall-cmd --permanent --zone=public --add-service=http

重新加载firewalld:

$ firewall-cmd --reload

验证是否添加成功:

$ firewall-cmd --zone=public --list-services
dhcpv6-client http ssh

把某个服务(以http为例)从某个区域(以public为例)中删除:

$ firewall-cmd --permanent --zone=public --remove-service=http

如果我们要做一些自定义设置,比如修改了默认的SSH端口,那么就需要添加自定义服务。服务是以XML文件的格式来定义的,默认服务存放在/usr/lib/firewalld/services目录下。我们用tree命令查看该目录下的文件:

$ tree /usr/lib/firewalld/services
/usr/lib/firewalld/services
├── amanda-client.xml
├── bacula-client.xml
├── bacula.xml
├── dhcpv6-client.xml
├── dhcpv6.xml
├── dhcp.xml
├── dns.xml
├── freeipa-ldaps.xml
├── freeipa-ldap.xml
├── freeipa-replication.xml
├── ftp.xml
├── high-availability.xml
├── https.xml
├── http.xml

创建自定义服务最简单的方法就是复制一份默认的服务XML文件,在此基础上做修改。自定义服务存放在/etc/firewalld/services目录下。例如,我们要创建自定义SSH服务,先复制一份SSH服务对应的XML文件。

$ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-custom.xml

XML文件的内容如下:

$ cat /etc/firewalld/services/ssh-custom.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="22"/>
</service>

假如我们要把端口号从22改成1234,那么要修改short标签的内容和port标签的属性。修改后的文件如下:

$ nano /etc/firewalld/services/ssh-custom.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH-Custom</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="1234"/>
</service>

重新加载firewalld:

$ firewall-cmd --reload

把新创建的服务添加到默认区域下:

$ firewall-cmd --permanent --zone=public --add-service=ssh-custom

端口管理

除了通过服务来定义协议和端口规则之外,还可以单独设置协议和端口的防火墙规则。比如我们要运行TCP协议7777端口,就可以这样设置:

$ firewall-cmd --permanent --zone=public --add-port=7777/tcp

设置端口范围也是没有问题的:

$ firewall-cmd --permanent --zone=public --add-port=7000-8000/tcp

删除刚才设置的协议和端口:

$ firewall-cmd --permanent --zone=public --remove-port=7777/tcp

查看某个区域下允许的协议和端口:

$ firewall-cmd --zone=public --list-ports
7000-8000/tcp

在所有设置完成之后,需要启用firewalld,使其能跟随系统自动启动。

$ systemctl enable firewalld

firewall的功能很强大,设置项也很多。由于本人能力有限,只能介绍一些firewalld的基础使用方法,还有一些高级用法,比如端口转发、地址伪装、d-Bus通讯等功能,就留给爱学习的读者们自己研究了。

【全文完】

< 上一篇:Ubuntu 18.04云服务器如何做好初始安全设置? 下一篇:Ubuntu云服务器如何使用UFW防火墙? >