CentOS7 firewall 防火墙

介绍

防火墙守护 firewalld 服务引入了一个信任级别的概念来管理与之相关联的连接与接口。它支持 ipv4 与 ipv6,并支持网桥,采用 firewall-cmd (command) 或 firewall-config (gui) 来动态的管理 kernel netfilter 的临时或永久的接口规则,并实时生效而无需重启服务。

Firewall 能将不同的网络连接归类到不同的信任级别,Zone 提供了以下几个级别:

1
2
3
4
5
6
7
8
9
丢弃区域(Drop Zone):如果使用丢弃区域,任何进入的数据包将被丢弃。这个类似与我们之前使用iptables -j drop。使用丢弃规则意味着将不存在响应,只有流出的网络连接有效。
阻塞区域(Block Zone):阻塞区域会拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过。
公共区域(Public Zone):只接受那些被选中的连接,而这些通过在公共区域中定义相关规则实现。服务器可以通过特定的端口数据,而其它的连接将被丢弃。
外部区域(External Zone):这个区域相当于路由器的启用伪装(masquerading)选项。只有指定的连接会被接受,而其它的连接将被丢弃或者不被接受。
隔离区域(DMZ Zone):如果想要只允许给部分服务能被外部访问,可以在DMZ区域中定义。它也拥有只通过被选中连接的特性。
工作区域(Work Zone):在这个区域,我们只能定义内部网络。比如私有网络通信才被允许。
家庭区域(Home Zone):这个区域专门用于家庭环境。我们可以利用这个区域来信任网络上其它主机不会侵害你的主机。它同样只允许被选中的连接。
内部区域(Internal Zone):这个区域和工作区域(Work Zone)类似,只有通过被选中的连接。
信任区域(Trusted Zone):信任区域允许所有网络通信通过。

CentOS7查看防火墙状态,启动,关闭防火墙

systemctl

  • 启动:
    systemctl start firewalld
  • 停止:
    systemctl stop firewalld
  • 重启:
    systemctl restart firewalld
  • 查看状态:
    systemctl status firewalld
  • 开机启动:
    systemctl enable firewalld
  • 开机禁用:
    systemctl disable firewalld
  • 查看服务是否开机启动:
    systemctl is-enabled firewalld
  • 查看已启动的服务列表:
    systemctl list-unit-files | grep enabled
  • 查看启动失败的服务列表:
    systemctl --failed

firewall-cmd

  • 查看版本:
    firewall-cmd --version
  • 显示所有配置:
    firewall-cmd --list-all-zones
  • 查看帮助:
    firewall-cmd --help
  • 显示状态:
    firewall-cmd --state
  • 查看防火墙规则:
    firewall-cmd --zone=public --list-all
  • 查看所有打开的端口:
    firewall-cmd --zone=public --list-ports
  • 从public添加 interface:
    firewall-cmd --zone=public --add-interface=eno16777736
  • 从public移除 interface:
    firewall-cmd --zone=public --remove-interface=eno16777736
  • 改变网卡接口的所属域(ps:一个接口只能属于一个域):
    firewall-cmd --zone=public --change-interface=eth1
  • 查看区域信息:
    firewall-cmd --get-active-zones
  • 查看默认的zone:
    firewall-cmd --get-default-zone
  • 设置默认的zone:
    firewall-cmd --set-default-zone=trusted
  • 查看指定接口所属区域:
    firewall-cmd --get-zone-of-interface=eth0
  • 拒绝所有包:
    firewall-cmd --panic-on
  • 取消拒绝状态:
    firewall-cmd --panic-off
  • 查看是否拒绝:
    firewall-cmd --query-panic
  • 将发往80端口的请求转发到8080:
    firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
  • 开放某个端口:
    firewall-cmd --zone=public --add-port=80/tcp --permanen
  • 查看某个端口是否开放:
    firewall-cmd --zone=public --query-port=80/tcp
  • 删除某个端口:
    firewall-cmd --zone=public --remove-port=80/tcp --permanent
  • 开放端口区间:
    firewall-cmd --permanent --zone=public --add-port=8080-9999/tcp
  • 针对某个IP开放端口规则:
    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="6379" accept"
    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.233" accept"
  • 删除某个规则:
    firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.51" accept"
  • 针对一个IP段访问:
    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.0/16" accept"
    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9200" accept"
  • 禁止某个IP访问某个端口:
    firewall-cmd --zone=public --add-rich-rule "rule family="ipv4" source address=192.168.1.4 port port=22 protocol=tcp reject"
  • 获取全部的服务:
    firewall-cmd --get-services
  • 查看某域的服务:
    firewall-cmd --zone=public --list-services
  • 域中添加服务:
    firewall-cmd --zone=public --add-service=http
  • 删除服务:
    firewall-cmd --zone=public --permanent --remove-service=http
  • 重新载入使配置立即生效:
    firewall-cmd --reload

参数说明:

  • –zone:指定域
  • –permanent :永久生效
  • –add-rich-rule:添加一条规则
  • source address:来源IP
  • –query-port:查询某个端口

编写 firewall 服务文件

firewall 的服务配置XML文件位置都存放在 /usr/lib/firewalld/service/etc/firewalld/service 下面
一份简易的配置示例:

1
2
3
4
5
6
<?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>

一份教复杂的配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<service>
<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>
<port protocol="tcp" port="80"/>
<port protocol="udp" port="8080-9999"/>
<rule family="ipv4">
<source address="192.168.0.0/24"/>
<accept/>
</rule>
<rule family="ipv4">
<source address="192.168.142.166"/>
<port protocol="tcp" port="6379"/>
<accept/>
</rule>
<rule family="ipv4">
<source address="192.168.1.4"/>
<port protocol="tcp" port="22"/>
<reject/>
</rule>
</service>

评论