centos7 的systemctl 和 防火墙 firewalld 的应用

一、systemctl是一个systemd工具

  systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。Systemd是一个系统管理守护进程、工具和库的集合,用于取代System V初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。在Linux生态系统中,Systemd被部署到了大多数的标准Linux发行版中,只有为数不多的几个发行版尚未部署。Systemd通常是所有其它守护进程的父进程,但并非总是如此。

是否安装有systemd并确定当前安装的版本:systemctl --version
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
重载一个服务:systemctl reload firewalld.service
注:当我们使用systemctl的start,restart,stop和reload命令时,我们不会从终端获取到任何输出内容,只有status命令可以打印输出。

显示一个服务的运行状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看某个服务是否开机启动:systemctl is-enabled firewalld.service

列出所有可用单元:systemctl list-unit-files
列出所有运行中单元:systemctl list-units

查看已启动的服务列表:systemctl list-unit-files | grep enabled
查看启动失败的服务列表:systemctl --failed
使用systemctl命令杀死服务:systemctl kill httpd

分析systemd启动进程:systemd-analyze
分析启动时各个进程花费的时间:systemd-analyze blame

检查systemd和systemctl的二进制文件和库文件的安装位置:whereis systemd
检查systemd是否运行:ps -eaf | grep [s]ystemd
注:systemd是作为父进程(PID=1)运行的。在上面带(-e)参数的ps命令输出中,选择所有进程,(-a)选择除会话前导外的所有进程,并使用(-f)参数输出完整格式列表(即 -eaf)。上例中后随的方括号和例子中剩余部分。方括号表达式是grep的字符类表达式的一部分。

分析启动时的关键链:systemd-analyze critical-chain
注:Systemctl接受服务(.service),挂载点(.mount),套接口(.socket)和设备(.device)作为单元。

获取当前某个服务的CPU分配额(如httpd):systemctl show -p CPUShares httpd.service
检查某个服务的所有配置细节:systemctl show httpd
分析某个服务(httpd)的关键链:systemd-analyze critical-chain httpd.service

列出当前使用的运行等级:systemctl get-default
注:
运行等级说明如下
Runlevel 0 : 关闭系统
Runlevel 1 : 救援、维护模式
Runlevel 3 : 多用户,无图形系统
Runlevel 4 : 多用户,无图形系统
Runlevel 5 : 多用户,图形化系统
Runlevel 6 : 关闭并重启机器

启动运行等级5,即图形模式:
systemctl isolate runlevel5.target

systemctl isolate graphical.target

设置多用户模式或图形模式为默认运行等级:
systemctl set-default runlevel3.target
systemctl set-default runlevel5.target

重启、停止、挂起、休眠系统或使系统进入混合睡眠:
systemctl reboot
systemctl halt
systemctl suspend
systemctl hibernate
systemctl hybrid-sleep

二、防火墙 firewalld 的安装

1、在CentOS7中安装 firewalld 的命令如下:

yum install firewalld

2、如果需要图形界面,需再安装:

yum install firewall-config

3、使用tab键补全命令提示:

yum install bash-completion

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

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

drop:丢弃所有进入的包,而不给出任何响应
block:拒绝所有外部发起的连接,允许内部发起的连接
public:允许指定的进入连接
external:同上,对伪装的进入连接,一般用于路由转发
dmz:允许受限制的进入连接
work:允许受信任的计算机被限制的进入连接,类似 workgroup
home:同上,类似 homegroup
internal:同上,范围针对所有互联网用户
trusted:信任所有连接

三、防火墙 firewalld 的应用

查看版本: firewall-cmd --version
查看帮助: firewall-cmd --help
查看状态: firewall-cmd --state
查看防火墙规则:firewall-cmd --list-all
查看所有打开的端口: firewall-cmd --list-ports
查看指定区域打开的端口: firewall-cmd --zone=public --list-ports
查询端口是否开放:firewall-cmd --query-port=8080/tcp
更新防火墙规则: firewall-cmd --reload (修改配置后要更新防火墙)
查看已被激活的 Zone 信息: firewall-cmd --get-active-zones
查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0
查看指定级别的接口:firewall-cmd --zone=public --list-interfaces
查看指定级别的所有信息:firewall-cmd --zone=public --list-all
查看所有级别被允许的信息:firewall-cmd --get-service
查看重启后所有 Zones 级别中永久放行的服务:firewall-cmd --get-service --permanent

查看区域:firewall-cmd --get-zones
查看默认区域:firewall-cmd --get-default-zone

一个区域可以绑定多个网卡,一个网卡只能绑定一个区域:
查看网卡和区域绑定:
firewall-cmd --get-zone-of-interface=ens33

区域添加网卡接口:
firewall-cmd --add-interface=ens34 --zone=public --permanent

区域删除网卡:
firewall-cmd --remove-interface=ens34 --zone=public --permanent

修改网卡的区域:
firewall-cmd --change-interface=ens33 --zone=public --permanent

trusted区域的所有服务都被允许:

网卡如果不属于任何区域,那么来自该接口的所有数据包将使用默认的区域规则:
区域添加来源地址,如果接口不属于某个区域,那么来自于该接口的流量如果匹配来源地址,那么流量将从来源的区域通过:

所有的配置操作如果想永久生效,则需要加--permanent选项,否则配置只会在当前运行环境生效。

四、firewalld的工作过程

firewalld将所有传入流量划分区域,每个区域都有自己的一套规则。为检查哪个区域用于传入连接。firewalld使用以下逻辑,第一个匹配规则胜出:
1、传入包的源地址与区域的某个源规则设置匹配,该包将通过该区域进行路由。
2、包的传入接口与区域的过滤器设置匹配,则将使用该区域。
3、否则将使用默认区域。默认区域不是单独的区域,而是指向系统上定义的某个其他区域。
除非管理员NetworkManager配置所覆盖,否则,任何新网络接口的默认区域都将设置为public区域。

防火墙的网络区域定义了网络连接的可信等级(共9个区域),我们可以根据不同场景来调用不同的firewalld区域,区域规则如下:

centos7 的systemctl 和 防火墙 firewalld 的应用

五、使用示例如下:

1、添加tcp的80端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --add-port=80/tcp --permanent 
2、删除tcp的80端口:
firewall-cmd --remove-port=80/tcp --permanent
firewall-cmd --zone= public --remove-port=80/tcp --permanent

参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;

# firewall-cmd --panic-on # 丢弃
# firewall-cmd --panic-off # 取消丢弃
$ firewall-cmd --query-panic # 查看丢弃状态
# firewall-cmd --reload # 更新规则,不重启服务
# firewall-cmd --complete-reload # 更新规则,重启服务
添加某接口至某信任等级,譬如添加 eth0 至 public,再永久生效

# firewall-cmd --zone=public --add-interface=eth0 --permanent

设置 public 为默认的信任级别

# firewall-cmd --set-default-zone=public

a. 管理端口
列出 dmz 级别的被允许的进入端口

# firewall-cmd --zome=dmz --list-ports
允许 tcp 端口 8080 至 dmz 级别

# firewall-cmd --zone=dmz --add-port=8080/tcp
允许某范围的 udp 端口至 public 级别,并永久生效

# firewall-cmd --zome=public --add-port=5060-5059/udp --permanent
b. 管理服务
添加 smtp 服务至 work zone

# firewall-cmd --zone=work --add-service=smtp
移除 work zone 中的 smtp 服务

# firewall-cmd --zone=work --remove-service=smtp
c. 配置 ip 地址伪装
查看

# firewall-cmd --zone=external --query-masquerade
打开伪装

# firewall-cmd --zone=external --add-masquerade
关闭伪装

# firewall-cmd --zone=external --remove-masquerade
d. 端口转发
要打开端口转发,则需要先

# firewall-cmd --zone=external --add-masquerade
然后转发 tcp 22 端口至 3753

# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3753
转发 22 端口数据至另一个 ip 的相同端口上

# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.100
转发 22 端口数据至另一 ip 的 2055 端口上

# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.100

六、firewalld 的 rich 规则

1、rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率

rich语法:
    rule
[source]

[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
man 5 firewalld.richlanguage

man 5 firewalld.richlanguage
规则

规则实施顺序:
该区域的端口转发,伪装规则
该区域的日志规则
该区域的允许规则
该区域的拒绝规则
每个匹配的规则生效,所有规则都不匹配,该区域默认规则生效

2、rich规则示例

拒绝从192.168.0.11的所有流量,当address 选项使用source 或 destination时,必须用family= ipv4 |ipv6
  firewall-cmd --permanent --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject‘

限制每分钟只有两个连接到ftp服务
  firewall-cmd --add-rich-rule=‘rule service name=ftp limit value=2/m accept’

抛弃esp( IPsec 体系中的一种主要协议)协议的所有数据包
  firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'

接受所有192.168.1.0/24子网端口5900-5905范围的TCP流量
  firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=5900-5905 protocol=tcp accept'

rich日志规则

log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]
<LOGLEVEL> 可以是emerg,alert, crit, error, warning, notice, info, debug.
<DURATION> s:秒, m:分钟, h:小时, d:天
audit [limit value="<RATE/DURATION>"]

rich日志规则实例

接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept

从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每小时最大记录一条信息
  firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300

规则示例

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.X.10/32 service name="http" log level=notice prefix="NEW HTTP " limit value="3/s" accept'
firewall-cmd --reload
tail -f /var/log/messages
curl http://serverX.example.com

伪装和端口转发

NAT网络地址转换,firewalld支持伪装和端口转发两种NAT方式

伪装NAT
firewall-cmd --permanent --zone=<ZONE>
firewall-cmd --query-masquerade 检查是否允许伪装
firewall-cmd --add-masquerade 允许防火墙伪装IP
firewall-cmd --remove-masquerade 禁止防火墙伪装IP
示例:
firewall-cmd --add-rich-rule='rule family=ipv4 address=192.168.0.0/24 masquerade'

端口转发

端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址伪装才能实现
firewall-cmd --permanent --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>] 说明:toport= 和toaddr= 至少要指定一个
示例:
转发传入的连接9527/TCP,到防火墙的80/TCP到public zone 的192.168.0.254
firewall-cmd --add-masquerade 启用伪装
firewall-cmd --zone=public --add-forward-
port=port=9527:proto=tcp:toport=80:toaddr=192.168.0.254

rich规则

rich规则语法:
forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
示例:
转发从192.168.0.0/24来的,发往80/TCP的流量到防火墙的端口8080/TCP
firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080'

rich规则示例

firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=172.25.X.10/32 forward-port port=443 protocol=tcp to-port=22'
firewall-cmd --reload
ssh -p 443 serverX.example.com

1、启动防火墙
systemctl start firewalld.service

2、指定IP与端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="5432" accept"

3、重新载入,使配置生效
systemctl restart firewalld.service

4、查看配置结果
firewall-cmd --list-all

5、删除规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="11300" accept"

6、防火墙的FTP策略配置

放行20、21端口还是不能连接FTP,因为在PASV模式下,建立数据传输会随机开放端口,这个端口显然是没有处于firewall的允许策略之下的,因为需要修改配置文件,指定端口范围。

vi /etc/vsftpd/vsftpd.conf
在最后加入以下内容,端口尽量选择高范围,提高安全性

pasv_enable=YES #开启被动模式
pasv_min_port=30000 #随机最小端口
pasv_max_port=31000 #随机最大端口
然后对指定的IP开放指定的端口段

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="30000-31000" accept"
然后重启ftp、firewall,即可正常连接

七、服务和其他构件

在区域中有一些基本的构件块,其中服务是最重要的。防火墙使用管理员创建在/usr/lib/firewalld/services(系统默认服务) 和/etc/firewalld/services文件下的XML文件,配置的自身服务集。XML文件时通过列表3中的例子创建的。

firewall-cmd --add-service=ftp #开放 ftp 服务规则 
firewall-cmd --add-service=mysql # 开放mysql端口规则 
firewall-cmd --add-service=http # 开放http端口规则 
firewall-cmd --add-service=ssh # 开放ssh端口规则 

  以上四个规则重启服务会消失,只能临时生效,也是立刻生效的,如果要永久保存的规则就要添加参数:--permanent,添加此参数后不会立刻生效。需要重载或重启服务才生效。

八、其他

特别注意:
iptables服务与firewalld服务都不是真正的防火墙,他们都只是用来定义防火墙规则功能的“防火墙管理工具”。
由netfilter即网络过滤器来读取,从而真正实现防火墙功能。
firewalld与iptables是冲突。如果使用firewall-cmd,应该把iptables和其他防火墙服务屏蔽。

可以通过三种方式来管理firewalld:
1、使用命令行工具firewall-cmd
2、使用图形工具firewall-config
3、使用/etc/firewalld/中的配置文件
在大部分情况下,不建议直接编辑配置文件,但是在使用配置管理工具时,以这种方法copy配置会很有用。

请注意:
1、除非另外指定,否则几乎所有命令都作用于运行时配置,当指定--permanent(永久配置)选项时除外(Runtime模式)。
2、列出的许多命令都采用 --zone=选项来确定所影响的区域,如果在这些命令中省略--zone,则将使用默认区域。
3、使用--permanent配置的所有更改,若要使其生效,必须使用firewall-cmd --reload(重新加载防火墙规则)
4、推荐在测试新的并且可能有危险的规则时,可以使用额外选项以一定时间后自动删除某个规则,从而防止管理员意外锁定某个系统:--timemout

firewalld的特点是拥有运行时配置(RunTime)与永久配置(Permanent)选项且能够支持动态更新以及“zone”的区域功能概念。相比iptables,firewalld的使用效能更高,处理速度更快,对用户透明,而且跟加稳定。firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。

firewalld和iptables service 之间最本质的不同是:iptables service 在 /etc/sysconfig/iptables 中储存置,而firewalld将配置储存在/usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种XML文件里.

以上都是一些常用方法,更多高级方法,请参考:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html
https://fedoraproject.org/wiki/FirewallD

参考:
https://firewalld.org/documentation/man-pages/firewalld.richlanguage.html
https://www.cnblogs.com/moxiaoan/p/5683743.html
https://www.cnblogs.com/zqifa/p/linux-firewall-1.html
https://linux.cn/article-5926-1.html
https://www.cnblogs.com/duanxin1/p/9860913.html
https://www.cnblogs.com/qige2017/p/7710920.html
https://www.58jb.com/html/187.html