4.Linux防火墙的基本配置与管理
CentOS 7中使用firewall-config图形界面管理的防火墙策略。也可以使用firewall-cmd命令行工具进行管理, firewall-cmd 支持全部防火墙特性,对于状态和查询模式,命令只返回状态,没有其它输出。另外还可以直接编辑/etc/firewalld/中的配置文件用来管理firewalld的策略。
- 使用firewalld可以通过图形界面工具 firewall-config 或者命令行客户端 firewall-cmd 启用或者关闭防火墙特性。
- 使用firewall-cmd命令行工具 firewall-cmd 支持全部防火墙特性。
对于状态和查询模式,命令只返回状态,没有其它输出。
4.1 firewall-cmd命令行工具
firewall-cmd支持防火墙的所有特性,管理员可以用它来改变系统或用户策略,通过 firewall-cmd用户可以配置防火墙允许通过的服务、端口、伪装、端口转发、和ICMP过滤器和调整 zone(区域)设置等功能。
firewall-cmd工具支持两种策略管理方式,运行时和永久设置,需要分别设置两者:
- 处理运行时区域,运行时模式下对区域进行的修改不是永久有效的,但是即时生效,重新加载或者重启系统后修改将失效。
- 处理永久区域,永久选项不直接影响运行时的状态,这些选项仅在重载或者重启系统时可用。
防火墙启动与关闭
- 启动防火墙:
systemctl start firewalld - 查询防火墙状态:
systemctl status firewalld - 开机启动防火墙:
systemctl enable firewalld - 停止防火墙:
systemctl stop firewalld - 开机关闭防火墙:
systemctl disable firewalld
防火墙管理命令格式:
firewall-cmd [Options…]
firewall-cmd支持上百参数,下表为常用Options说明,如表所示:
firewall-cmd命令 | 说明 |
—get-default-zone | 查询当前默认区域 |
—set-default-zone= | 设置默认区域,会更改运行时和永久配置 |
—get-zones | 列出所有可用区域 |
—get-active-zones | 列出正在使用的所有区域(具有关联的接口或源)机器接口和源信息 |
—add-source=[—zone=] | 将来自IP地址或网络/子网掩码的所有流量路由到指定区域。 |
—remove-source=[—zone=] | 从指定区域中删除用于路由来自IP地址或网络/子网掩码的所有流量的规则 |
—add-interface=[—zone=] | 将来自的所有流量路由到指定区域 |
—change-interface=[—zone=] | 将接口与而非其当前区域关联 |
—list-all [—zone=] | 列出的所有已配置接口、源、服务和端口 |
—list-all-zones | 检索所有区域的所有信息(接口、源、端口、服务等) |
—add-service=[—zone=] | 允许到的流量 |
—add-port=[—zone=] | 允许到端口的流量 |
—remove-service=[—zone=] | 从区域允许列表中删除 |
—remove-port=[—zone=] | 从区域允许列表中删除端口 |
—reload | 丢弃运行时配置,并应用持久配置 |
4.2 firewall-config图形工具
firewall-config支持防火墙的所有特性,管理员可以用它来改变系统或用户策略,通过 firewall-config 用户可以配置防火墙允许通过的服务、端口、伪装、端口转发、和ICMP过滤器和调整 zone(区域)设置等功能以使防火墙设置更加的自由、安全和强健。
firewall-config工作界面。如图4所示。
firewall-config工作界面分成三个部分:上面是主菜单,中间是配置选项卡,包括区域、服务设置选项卡,底部是状态栏,状态栏从左到右依次是连接状态、默认区域、锁定状态、应急模式。
在左下方角落寻找“已连接”字符,这标志着 firewall-config工具已经连接到用户区后台程序 firewalld。
(1).firewall-config 主菜单
firewall-config 主菜单包括四个选项:文件,选项,查看,帮助。其中选项子菜单是最主要的,它包括几个部分:
- 重载防火墙:
重载防火墙规则。
例如所有现在运行的配置规则如果没有在永久配置中操作,那么系统重载后会丢失。 - 更改连接区域:
更改网络连接的默认区域。 - 改变默认区域:
更改网络连接的所属区域和接口。 - 应急模式:
应急模式意味着丢弃所有的数据包。 - 锁定:
锁定可以对防火墙配置进行加锁,只允许白名单上的应用程序进行改动。
锁定特性为 firewalld 增加了锁定本地应用或者服务配置的简单配置方式。
它是一种轻量级的应用程序策略。
(2)firewall-config配置选项卡
firewall-config 配置选项卡包括:运行时和永久。
- 运行时:
运行时配置为当前使用的配置规则。
运行时配置并非永久有效,在重新加载时可以被恢复,而系统或者服务重启、停止时,这些选项将会丢失。 - 永久:
永久配置规则在系统或者服务重启的时候使用。
永久配置存储在配置文件中,每次机器重启或者服务重启、重新加载时将自动恢复。
(3) firewall-config区域选项卡
区域选项卡是一个主要设置界面,firewalld 提供了10种预定义的区域,区域配置选项和通用配置信息可以在 firewall.zone(5) 的手册里查到,
区域选项卡有八个子选项卡,分别是服务、端口、伪装、端口转发、ICMP过滤器、富规则、接口、来源,如图3-1-5所示。
- 服务:
定义区域中哪些服务是可信的。 - 端口:
定义区域中允许访问的主机或网络访问的附加端口或端口范围。 - 伪装:
NAT伪装,是否启用IP转发,是地址转发的一种,仅支持IPv4。 - 端口转发:
NAT转发,将指向单个端口的流量将转发到相同计算机上的不同端口,或者转发到不同计算机上的端口 - ICMP过滤器:
设置可通过的ICMP数据包类型。 - 富规则:
是一种表达性语言,可表达firewalld基本语法中未涵盖的自定义防火墙规则,可用于表达基本的允许/拒绝规则,可用于配置记录(面向syslog和auditd)及端口转发、伪装和速率限制 - 接口:
增加入口到区域。 - 来源:绑定来源地址或范围。
(4)firewall-config 服务选项卡
预定义了几十种重要服务,可通过命令firewall-cmd —get-services查询,服务是端口、协议、模块和目标地址的集合,该选项卡配置只能在永久配置视图中修改服务,不能在运行时配置中修改。
服务选项卡底下包含端口和协议、模块、目标地址三种子选项卡,如图3-1-6所示。。
端口和协议:
定义需要被所有主机或网络访问的额外端口或端口区间。
模块:
添加网络过滤辅助模块。
目标地址:
如果指定了目的地址,服务项目将仅限于目的地址和类型。
5 当前的firewalld特性
- D-BUS接口:
D-BUS 接口提供防火墙状态的信息,使防火墙的启用.停用或查询设置成为可能。 - 区域:
网络或者防火墙区域定义了连接的可信程度。
firewalld 提供了几种预定义的区域。
区域配置选项和通用配置信息可以在firewall.zone(5)的手册里查到。 - 服务:
服务可以是一系列本端口.目的以及附加信息,也可以是服务启动时自动增加的防火墙助手模块。
预定义服务的使用使启用和禁用对服务的访问变得更加简单。
服务配置选项和通用文件信息在 firewalld.service(5) 手册里有描述。 - ICMP类型:
Internet控制报文协议 (ICMP) 被用以交换报文和互联网协议 (IP) 的错误报文。
在 firewalld 中可以使用 ICMP 类型来限制报文交换。
ICMP 类型配置选项和通用文件信息可以参阅 firewalld.icmptype(5) 手册。 - 直接接口:
直接接口主要用于服务或者应用程序增加特定的防火墙规则。
这些规则并非永久有效,并且在收到 firewalld 通过 D-Bus 传递的启动.重启.重载信号后需要重新应用。 - 运行时配置:
运行时配置并非永久有效,在重新加载时可以被恢复,而系统或者服务重启.停止时,这些选项将会丢失。 - 永久配置:
永久配置存储在配置文件中,每次机器重启或者服务重启.重新加载时将自动恢复。 - 托盘小程序:
托盘小程序 firewall-applet 为用户显示防火墙状态和存在的问题。
它也可以用来配置用户允许修改的设置。 - 图形化配置工具:
firewall daemon 主要的配置工具是 firewall-config 。
它支持防火墙的所有特性(除了由服务/应用程序增加规则使用的直接接口)。
管理员也可以用它来改变系统或用户策略。 - 命令行客户端:
firewall-cmd是命令行下提供大部分图形工具配置特性的工具。 - 对于ebtables的支持:
要满足libvirt daemon的全部需求,在内核 netfilter 级上防止 ip*tables 和 ebtables 间访问问题,ebtables 支持是需要的。
由于这些命令是访问相同结构的,因而不能同时使用。 - /usr/lib/firewalld中的默认/备用配置:
该目录包含了由 firewalld 提供的默认以及备用的 ICMP 类型.服务.区域配置。
由 firewalld 软件包提供的这些文件不能被修改,即使修改也会随着 firewalld 软件包的更新被重置。
其它的 ICMP 类型.服务.区域配置可以通过软件包或者创建文件的方式提供。 - /etc/firewalld中的系统配置设置:
存储在此的系统或者用户配置文件可以是系统管理员通过配置接口定制的,也可以是手动定制的。
这些文件将重载默认配置文件。
为了手动修改预定义的 icmp 类型,区域或者服务,从默认配置目录将配置拷贝到相应的系统配置目录,然后根据需求进行修改。
如果加载了有默认和备用配置的区域,在 /etc/firewalld下的对应文件将被重命名为
.old 然后启用备用配置。
6.用户策略支持
管理员可以规定哪些用户可以使用用户交互模式和限制防火墙可用特性。
端口元数据信息(由 Lennart Poettering 提议),拥有一个端口独立的元数据信息是很好的。应用程序或服务的端口是动态的,因而端口本身并不能描述使用情况,所以对 /etc/services 的端口和协议静态分配模型不是个好的解决方案,也没有反映当前使用情况。。
元数据信息可以用来为防火墙制定简单的规则。下面是一些例子:
- 允许外部访问文件共享应用程序或服务;
- 允许外部访问音乐共享应用程序或服务;
- 允许外部访问全部共享应用程序或服务;
- 允许外部访问 torrent 文件共享应用程序或服务;
- 允许外部访问 http 网络服务。
这里的元数据信息不只有特定应用程序,还可以是一组使用情况。例如:组“全部共享”或者组“文件共享”可以对应于全部共享或文件共享程序(如:torrent 文件共享)。这些只是例子,因而,可能并没有实际用处。
这里是在防火墙中获取元数据信息的两种可能途径:
- 第一种是添加到 netfilter (内核空间)。
好处是每个人都可以使用它,但也有一定使用限制。
还要考虑用户或系统空间的具体信息,所有这些都需要在内核层面实现。 - 第二种是添加到 firewall daemon 中。
这些抽象的规则可以和具体信息(如:
网络连接可信级。
作为具体个人/主机要分享的用户描述.管理员禁止完全共享的应归则等)一起使用。
第二种解决方案的好处是不需要为有新的元数据组和纳入改变(可信级.用户偏好或管理员规则等等)重新编译内核。这些抽象规则的添加使得 firewall daemon 更加自由。即使是新的安全级也不需要更新内核即可轻松添加。
7.sysctld的错误设置
实际应用中对sysctl 设置经常出现错误。
一个例子是,在 rc.sysinit 正运行时,而提供设置的模块在启动时没有装载或者重新装载该模块时会发生问题。
另一个例子是 net.ipv4.ip_forward ,防火墙设置.libvirt 和用户/管理员更改都需要它。如果有两个应用程序或守护进程只在需要时开启 ip_forwarding ,之后可能其中一个在不知道的情况下关掉服务,而另一个正需要它,此时就不得不重启它。
sysctl daemon 可以通过对设置使用内部计数来解决上面的问题。此时,当请求者不再需要时,它就会再次回到之前的设置状态或者是直接关闭它。
8 iptables 的与firewalld区别
firewalld 和 iptables service 之间最本质区别是:
- iptables service 在 /etc/sysconfig/iptables 中储存配置,而 firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里,要注意,当 firewalld 在Linux上安装失败时, /etc/sysconfig/iptables 文件就不存在。
- 使用 iptables service,每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables里读取所有新的规则,然而使用 firewalld 却不会再创建任何新的规则;仅仅运行规则中的不同之处。
因此,firewalld 可以在运行时间内,改变设置而不丢失现行连接。
9 常用命令
(1) firewalld的基本使用
启动:systemctl start firewalld
关闭:systemctl stop firewalld
查看状态:systemctl status firewalld
开机禁用 :systemctl disable firewalld
开机启用 :systemctl enable firewalld
(2) systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl —failed
(3) 配置firewalld-cmd
#《实例一》防火墙查询 firewall-cmd --version //查看版本 firewall-cmd --help // 查看帮助 firewall-cmd --state // 显示状态 firewall-cmd --get-services //获取支持服务列表(firewalld内置服务支持) firewall-cmd --zone=public --list-ports //查看所有打开的端口 firewall-cmd --list-forward-ports //查看转发的端口 fierewall-cmd –reload //重新加载防火墙策略 firewall-cmd --get-active-zones //查看区域信息 firewall-cmd --list-all-zones //列出全部启用的区域的特性 firewall-cmd --list-services //显示防火墙当前服务 firewall-cmd --get-zone-of-interface=eth0 //查看指定接口所属区域 firewall-cmd --panic-on //拒绝所有包 firewall-cmd --panic-offfir //取消拒绝状态 firewall-cmd --query-panic //查看是否拒绝 # 《实例二》 运行时区域策略设置示例(注:以下示例不加zone的为默认区域public) firewall-cmd --add-service=ssh //允许 ssh 服务通过 firewall-cmd --remove-service=ssh //禁止 ssh 服务通过 firewall-cmd --add-service=samba --timeout=600 //临时允许 samba 服务通过 600 秒 firewall-cmd --add-service=http --zone=work //允许http服务通过work区域 firewall-cmd --zone=work --add-service=http //从work区域打开http服务 firewall-cmd --zone=internal --add-port=443/tcp //打开 443/tcp 端口在内部区域(internal) firewall-cmd --zone=internal --remove-port=443/tcp //关闭443/tcp 端口在内部区域(internal) firewall-cmd --add-interface=eth0 //打开网卡eth0 firewall-cmd --remove-interface=eth0 //关闭网卡eth0 #《 实例三》 永久区域策略设置示例(注:以下示例不加zone的为默认区域public;永久设置均需重新加载防火墙策略或重启系统) firewall-cmd --permanent --add-service=ftp //永久允许 ftp 服务通过 firewall-cmd --permanent --remove-service=ftp //永久禁止 ftp 服务通过 firewall-cmd --permanent --add-service=http --zone=external //永久允许http服务通过external区域 firewall-cmd --permanent --add-service=http --zone=external //永久允许http服务通过external区域 firewall-cmd --permanent --zone=internal --add-port=111/tcp //打开 111/tcp 端口在内部区域(internal) firewall-cmd --permanent --zone=internal --remove-port=111/tcp //关闭 111/tcp 端口在内部区域(internal) firewall-cmd --permanent --add-interface=eth0 //永久打开网卡eth0 firewall-cmd --permanent --remove-interface=eth0 //永久关闭网卡eth0 firewall-cmd --permanent --zone=public --add-port=8080-8083/tcp //添加多个端口 firewall-cmd --permanent --zone=public --remove-port=81/tcp //删除某个端口 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 --reload //添加操作后别忘了执行重载才会生效