Firewall(防火墙)
别名:iptables(redhat6),Firewalld(redhat7)
注:以下全是以redhat7使用为主,6和具体的文档见《Linux就该这么学——防火墙篇》
概述:
RHEL 7 系统中集成了多款防火墙管理工具,其中 firewalld(Dynamic Firewall Manager of Linux systems,Linux 系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于 CLI(命令行界面)和基于 GUI(图形用户界面)的两种管理方式
相较于传统的防火墙管理配置工具,firewalld 支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是 firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换
安装配置:
/etc/firewalld/firewalld.conf 主配置文件
如何使用:
查看 firewalld 服务当前所使用的区域:
[root@cs-A ~]# firewall-cmd --get-default-zone
public
查询 ens32网卡在 firewalld 服务中的区域:
[root@cs-A ~]# firewall-cmd --get-zone-of-interface=ens32
public
把 firewalld 服务中 ens32 网卡的默认区域修改为 external,并立即生效:
[root@cs-A ~]# firewall-cmd --permanent --zone=external --change-interface=ens32
The interface is under control of NetworkManager, setting zone to 'external'.
success
[root@cs-A ~]# firewall-cmd --reload
success
[root@cs-A ~]# firewall-cmd --get-zone-of-interface=ens32
external
把 firewalld 服务的当前默认区域设置为 public:
[root@cs-A ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success
[root@cs-A ~]# firewall-cmd --get-default-zone
public
(因为默认本来就是public,所以会Warning)
启动/关闭 firewalld 防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用):
[root@cs-A ~]# firewall-cmd --panic-on
success
[root@cs-A ~]# firewall-cmd --panic-off
success
查询 public 区域是否允许请求 SSH 和 HTTPS 协议的流量:
[root@cs-A ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@cs-A ~]# firewall-cmd --zone=public --query-service=https
no
把 firewalld 服务中请求 HTTPS 协议的流量设置为永久允许,并立即生效:
[root@cs-A ~]# firewall-cmd --zone=public --add-service=https
success (临时)
[root@cs-A ~]# firewall-cmd --permanent --zone=public --add-service=https
success (永久)
[root@cs-A ~]# firewall-cmd --reload
success
把 firewalld 服务中请求 HTTP 协议的流量设置为永久拒绝,并立即生效:
[root@cs-A ~]# firewall-cmd --permanent --zone=public --remove-service=https
success
[root@cs-A ~]# firewall-cmd --reload
success
把在 firewalld 服务中访问 8080 和 8081 端口的流量策略设置为允许,但仅限当前生效:
[root@cs-A ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@cs-A ~]# firewall-cmd --zone=public --list-all
[root@cs-A ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
把原本访问本机 888 端口的流量转发到 22 端口,要且求当前和长期均有效:
[root@cs-A ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.230.15
success
[root@cs-A ~]# firewall-cmd --reload
success
在客户端使用 ssh 命令尝试访问 192.168.230.15 主机的 888 端口:
[root@cs-B ~]# ssh -p 888 192.168.230.15
root@192.168.230.15's password:
Last login: Mon Jan 7 12:56:39 2019 from 192.168.230.16
[root@cs-A ~]#
firewalld 中的富规则
表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有正对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比如,我们可以在 firewalld 服务中配置一条富规则,使其拒绝192.168.10.0/24 网段的所有用户访问本机的 ssh 服务(22 端口):
[root@cs-A ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.230.0/24" service name="ssh" reject"
success
[root@cs-A ~]# firewall-cmd --reload
success
验证:
[root@cs-B ~]# ssh root@192.168.230.15
ssh: connect to host 192.168.230.15 port 22: Connection refused
注意:--permanent选项必须要加
改为接受:
[root@cs-A ~]# firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.230.0/24" service name="ssh" reject"
success
[root@cs-A ~]# firewall-cmd --reload
success
验证:
[root@cs-B ~]# ssh root@192.168.230.15
root@192.168.230.15's password:
Last login: Mon Jan 7 14:26:48 2019 from 192.168.230.16
[root@cs-A ~]#
注:(若想移除某一条规则,把那条命令里面的add改为remove即可)
查看某个区域所有的配置:
[root@cs-A ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules: