CentOS 7 默认使用的是firewalld来管理主机的网络连接,当然,如果对firewalld不熟悉的话,安装iptables-services 就可以像管理之前的版本一样使用iptables对网络进行配置。这里分别对两种方式进行简单的介绍。


Firewalld介绍

Firewalld使用firewalld-cmd工具来对防火墙进行配置。firewalld使用“区域”的概念将不同的网络安全级别区分开,从不安全区到安全区的顺序如下:

  • drop: 最低的安全级别区域, 所有从这个区域进来的连接请求都会被丢弃,只有到此区域的流量才会被允许。

  • block: 与drop策略类似, 不同的是进入的连接请求会返回icmp-host-prohibited 或者 icmp6-adm-prohibited 的消息.

  • public: 相当于公共网络,不信任的网络区域,一般的连接请求会被拒绝,只有少数自定义的连接请求会被允许.

  • external: 如果firewall被当做网关的时候外部请求所在的区域, 通过配置NAT转换的方式来保证私密性,与内部信任的网络进行通信。

  • internal: 以网关为边界,在external区的另外一端, 网关的安全策略,这个区域的连接被认为是安全的,并允许一些附加的服务连接。

  • dmz: 用于主机对DMZ区域的识别。只有少数确定的连接请求会被接受 (DMZ: 一些被内部隔离的主机,可能有不安全的连接行为,如对外的代理服务器等).

  • work: 用于工作的主机区域. 大多数的连接请求被认为是安全的. 更多一些的服务请求会被允许.

  • home: 家庭网络。它通常意味着信任大多数其他计算机,并且将接受更多的服务。

  • trusted: 信任网络中的所有机器。最开放的可用选项,应谨慎使用。

要使用firewalld ,我们可以创建规则并更改我们区域的属性,然后将网络接口分配到最合适的区域。

与iptables的设置类似,在防火墙中,规则可以被指定为永久生效或仅当前生效。如果添加或修改规则,则默认情况下,会修改当前运行的防火墙的行为。在下次启动时,旧的规则将被恢复。如果要使配置永久生效,可以使用--permanent参数。当然,也可以使用--permanent构建一整套随着时间变化的规则,这些规则将在发出reload命令时立即被应用。


Firewalld配置


查看规则

在配置防火墙时,不要急使用systemctl enable firewalld命令使firewalld开机自启动,我们应该等到我们创建了防火墙规则,并有机会在配置此行为之前进行测试。如果出现问题,这可以帮助我们避免被锁定在机器外面。

通过下面的命令可以启动并查看系统firewalld状态:

# systemctl start firewalld

# firewall-cmd --state
running

查看当前默认的区域:

# firewall-cmd --get-default-zone
public

查看区域应用的接口:

# firewall-cmd --get-active-zones
public
  interfaces: eth0

查看区域规则:

# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules:

这里可以看到处于public区的eth0与dhcp和ssh服务相关联。


列出所有可用的区域:

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

可以通过--zone和--list-all 选项来查看相关区域的默认规则:

# firewall-cmd --zone=home --list-all
home
  interfaces: 
  sources: 
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules:

也可以使用--list-all-zones选项来查看所有规则:

firewall-cmd  --list-all-zones


zone规则配置

默认情况下,主机的网络接口都会在默认区域,如果要修改接口配置区域使用如下命令:

# firewall-cmd --zone=home --change-interface=eth0
success

查看是否修改成功(服务重启后失效):

# firewall-cmd --get-active-zones
home
  interfaces: eth0
public
  interfaces: eth1

如果要永久生效,可以修改网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,添加一行:

ZONE=home

重启网络服务和防火墙即可生效。


修改默认zone,这将使所有在原默认zone的网络接口变更到新的默认zone中:

# firewall-cmd --set-default-zone=home
success
# firewall-cmd --get-default-zone
home


服务规则配置

Firewalld默认可以对系统的一些应用进行管理,通过如下命令可以查看当前默认可以管理的应用服务类型:

# 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


系统默认的服务属性存放在/usr/lib/firewalld/services目录下,可以查看对应的xml文件:

# cat 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="22"/>
</service>

对某个zone添加服务应用:

# firewall-cmd --zone=public --add-service=http
success

查看是否添加成功:

# firewall-cmd --zone=public --list-all
public
  interfaces: 
  sources: 
  services: dhcpv6-client http ssh

或者直接查看对应zone的允许的服务:

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

如果要查看或者配置永久生效的内容,可以使用--permanent参数,上面的两个命令就可以用如下格式:

firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --list-services


自定义服务规则

firewalld默认定义了一些常见的服务应用,但是如果需要使用的服务系统中并没有符合的应用就需要我们自定规则。

自定义规则有两种方式:

  • zone中添加协议端口

  • 配置xml文件,定义一个新的服务


zone中添加协议端口

如,我们要添加一个5000端口的TCP协议在public zone中:

# firewall-cmd --zone=public --add-port=5000/tcp

查看端口列表:

# firewall-cmd --zone=public --list-ports
5000/tcp

也可以指定端口范围:

firewall-cmd --zone=public --add-port=4990-4999/udp

增加永久生效选项:

firewall-cmd --zone=public --permanent --add-port=5000/tcp
firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
firewall-cmd --zone=public --permanent --list-ports


自定义服务

通过直接添加协议端口的方式虽然简单直接,但是不方便规范化的管理,尤其是在有频繁服务变更的场景中,这种方式会增加管理员的维护负担。通过自定义服务的方式,可以清晰的说明服务的应用细节和信息,可以和管理系统自带的服务一样进行管理。


为了区分系统自带的服务和我们自定义的服务,我们一般将自定义的服务文件存放在/etc/firewalld/services 目录下:

cp /usr/lib/firewalld/services/ssh.xml  /etc/firewalld/services/
cd  /etc/firewalld/services/
mv ssh.xml  trying.xml

修改自定义文件:

vim trying.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>trying stuff</short>
  <description>this is test firewalld</description>
  <port protocol="tcp" port="8888"/>
  <port protocol="udp" port="9999"/>
</service>

使用reload命令使配置生效:

firewall-cmd --reload

查看系统应用:

firewall-cmd --get-services|grep trying


自定义zone


可以通过自定义新的zone来创建我们需要的规则:

firewall-cmd --permanent --new-zone=publicweb

查看创建的zone:

firewall-cmd --permanent --get-zones|grep publicweb

执行reload命令之后才能生效。可以根据需求对定义的zone添加服务和网络接口。


参考链接:

https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7