Linux系统Firewall的使用说明、命令与规则设置

Linux系统Firewall的使用说明、命令与规则设置

1、Firewall简介

CetnOS 7默认防火墙使用 firewalld 替代了之前的 iptables,主要特点:动态管理防火墙,不需要重启整个防火墙便可应用更改;使用“区域(zone)”概念。

firewalld 支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。firewalld 也支持允许服务或者应用程序直接添加防火墙规则的接口。firewalld 无法解析由 iptables 和 ebtables 命令行工具添加的防火墙规则。firewalld 和 iptables 不能同时运行,只能选择其中之一。

2. “区域(zone)”介绍

区域定义了网络连接的可信等级。这是一个一对多的关系,这意味着一次连接可以仅仅是一个区域的一部分,而一个区域可以用于很多连接。区域按照从不信任到信任的顺序排序:

  • 丢弃(drop)****:任何流入网络的包都被丢弃,不作出任何响应。只允许流出的网络连接。

  • 阻塞(block)****:任何进入的网络连接都被拒绝,并返回 IPv4 的 icmp-host-prohibited 报文或者 IPv6 的 icmp6-adm-prohibited 报文。只允许由该系统初始化的网络连接。

  • 公开(public):用以可以公开的wangl,默认区域。只允许选中的连接接入。

  • 外部(external):用在路由器等启用伪装的外部网络。只允许选中的连接接入。

  • 隔离区(dmz):用以允许隔离区(dmz)中的电脑有限地被外界网络访问。只接受被选中的连接。

  • 工作(work):用在工作网络。只接受被选中的连接。

  • 家庭(home):用在家庭网络。只接受被选中的连接。

  • 内部(internal):用在内部网络。只接受被选中的连接。

  • 受信任的(trusted):允许所有网络连接。

区域设置以 ZONE= 选项 存储在网络连接的 ifcfg 文件中。如果这个选项缺失或者为空,firewalld 将使用配置的默认区域。在 /etc/firewalld/zones 下面新增或修改区域。

网络接口可以指定到某个区域,未指定区域的网络接口一律配置到默认区域。

3. firewalld配置文件

/usr/lib/firewalld/ 存放默认配置文件,不能被修改,即使修改也会随着 firewalld 软件包的更新被重置。

/etc/firewalld/ 这里的配置文件可以是系统管理员通过配置接口定制的,也可以是手动定制的。这些文件将替代默认配置文件生效。

通常将配置文件从 /usr/lib/firewalld/ 拷贝到 **/**etc/firewalld/ 相应目录,再根据需求进行修改。

4. firewalld服务常用操作

  • 启动firewalld并设为开机自启
1
systemctl start firewalld.servicesystemctl enable firewalld.service
  • 重载firewalld配置文件,不改变当前连接状态
1
systemctl reload firewalld.service
  • 重启firewalld服务
1
systemctl restart firewalld.service
  • 停止firewalld服务
1
systemctl stop firewalld.service
  • 禁用firewalld服务
1
systemctl disable firewalld.service
  • 查看firewalld服务状态
1
systemctl status firewalld.service

firewall-cmd常用命令

firewalld有图像界面工具 firewall-config 和命令行工具 firewall-cmd,服务器上通常使用命令行工具 firewall-cmd

firewall-cmd 命令默认同时对IPv4和IPv6生效;

加参数 –zone=XXX 为指定命令操作区域,不加此参数对默认区域操作;

加参数 –permanent 为使命令在 firewalld 重载后永久生效,不加此参数命令立刻生效但 firewalld 重载后失效。

  • 查看帮助
1
firewall-cmd --help
  • 查询防火墙运行状态
1
firewall-cmd --state
  • 查询防火墙版本
1
firewall-cmd --version
  • 查询防火墙默认区域配置信息
1
firewall-cmd --list-all
  • 查看防火墙默认区域所有打开的端口
1
firewall-cmd --list-ports
  • 查询防火墙所有区域配置信息,且分屏显示
1
firewall-cmd --list-all-zones | more
  • 设置默认区域为 public,立刻生效
    (也可以修改 /etc/firewalld/firewalld.conf 文件中 DefaultZone=public ,重载后生效)
1
firewall-cmd --set-default-zone=public
  • 默认区域开启 TCP 8080 端口,重载后永久生效,可以设定端口号范围比如6000-7000
1
firewall-cmd --permanent --add-port=8080/tcp
  • 默认区域关闭 TCP 8080 端口,重载后永久生效
1
firewall-cmd --permanent --remove-port=8080/tcp
  • 默认区域开启 HTTP 服务(默认配置下等于开启 TCP 80 端口),重载后永久生效
1
firewall-cmd --permanent --add-service=http
  • 默认区域关闭 HTTP 服务(默认配置下等于关闭 TCP 80 端口),重载后永久生效
1
firewall-cmd --permanent --remove-service=http
  • 默认区域禁止 ping,重载后永久生效
1
firewall-cmd --permanent --add-icmp-block=echo-replyfirewall-cmd --permanent --add-icmp-block=echo-request

或者

1
firewall-cmd --permanent --add-rich-rule="rule protocol value=icmp drop"
  • 重置防火墙规则,使用参数 –reload 保持当前连接,使用参数 –complete-reload 重置连接
1
firewall-cmd --reloadfirewall-cmd --complete-reload
  • 拒绝所有包
1
firewall-cmd --panic-on
  • 取消拒绝状态
1
firewall-cmd --panic-off
  • 查看是否拒绝
1
firewall-cmd --query-panic

使用“Rich Rule” 配置防火墙规则

  • 使mysql服务的 3306 端口只允许 192.168.1.1/24 网段的服务器能访问,重载后永久生效。
1
#添加规则firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.1/24" port protocol="tcp" port="3306" accept"
  • 端口转发,将到本机的 3306 端口的访问转发到 192.168.1.1 服务器的 3306 端口,重载后永久生效。
1
2
# 开启伪装IPfirewall-cmd --permanent --add-masquerade
# 配置端口转发firewall-cmd --permanent --add-forward-port=port=3306:proto=tcp:toaddr=192.168.1.2:toport=13306

注意!

如果不开启伪装IP,端口转发会失败;其次,要确保源服务器上的端口(3306)和目标服务器上的端口(13306)是开启的。

  • 在IPv4拒绝来自IP地址 192.168.111.111 的访问,重载后永久生效。
1
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.111.111" reject'
  • 从默认区域移除上述 Rich Language 规则,重载后永久生效。
1
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.111.111" reject'
  • 从默认区域查询上述 Rich Language 规则是否存在
1
firewall-cmd --query-rich-rule='rule family="ipv4" source address="192.168.111.111" reject'

firewalld直接接口(firewall-cmd –direct 命令)

firewall-cmd –direct 命令主要用于使服务和应用程序能够增加规则,不推荐手动操作;命令立刻生效,但重载后失效。如果不熟悉 iptables ,使用直接接口非常危险,可能无意间导致防火墙被入侵。