分类 系统运维 下的文章

在上一篇文章中,我们探讨了如何在 Fedora 中用命令行控制防火墙

现在你将看到如何“添加”、“删除”和“列出”服务、协议和端口,以便“阻止”或“允许”它们。

简短回顾

首先,最好检查一下防火墙的状态,看它是否正在运行。如我们先前所学,你可以使用状态选项(firewall-cmd ‐‐state)来得到。

下一步是获取网络接口适用的 zone 。例如,我使用的桌面有两个网络接口:一个物理接口(enp0s3),代表我实际的网卡,和虚拟接口(virbr0),它由 KVM 等虚拟化软件使用。要查看哪些域处于活动状态,请运行 firewall-cmd ‐‐get-active-zones

现在,你知道了你感兴趣的域,可以使用 firewall-cmd ‐‐info-zone=FedoraWorkstation 这样的命令列出该域的规则。

读取区域信息

要显示特定域的信息,请运行 firewall-cmd ‐‐zone=ZoneName ‐‐list-all,或使用以下命令显示默认域的信息:

[dan@localhost ~]$ firewall-cmd --list-all
FedoraWorkstation (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3
sources:
services: dhcpv6-client mdns samba-client ssh
ports: 1025-65535/udp 1025-65535/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

现在,让我们查看输出。第一行表明以下信息关联的域以及该域当前是否在使用中。

target: default:告诉我们这是默认域。可以通过 ‐‐set-default-zone=ZoneName‐‐get-default-zone 设置或获取。

icmp-block-inversion 表明是否阻止 ICMP 请求。例如,如果机器响应来自网络上其他机器的 ping 请求。

interfaces 字段显示接受此域的所有接口。

处理服务、端口和协议

现在,重点关注 servicesportsprotocols 所在行。默认情况下,防火墙将阻止所有端口、服务和协议,而只允许列出的。

在这里,你可以看到允许的服务是非常基本的客户端服务。例如,访问网络上的共享文件夹(samba-client)、与 DNS 服务器通信或通过 SSH(ssh 服务)连接到计算机。你可以将 service 视为与端口组合的协议,例如 ssh 服务使用 SSH 协议,并且按照惯例使用 22 端口。通过允许 ssh 服务,你实际上所做的就是允许传入的连接在默认 22 端口上使用 SSH 协议。

请注意,根据经验,名称中带有 client 字样的服务是指传出连接,也就是你使用你的 IP 作为源对外部的连接,与之相反的是 ssh 服务,比如,它将接受传入连接(监听来自外部的连接)。

你可以在文件 /etc/services 中查找服务。例如,如果你想知道这些服务使用什么端口和协议:

[dan@localhost ~]$ cat /etc/services | grep ssh
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol

你可以看到 SSH 同时使用 TCP 和 UDP 的 22 端口。此外,如果你希望查看所有可用的服务,只需使用 firewall-cmd --get-services

打开端口

如果要阻止端口、服务或协议,请确保在此处未列出它们。展开来说,如果要允许服务,那么需要将它添加到列表中。

假设你要打开 5000 端口用于 TCP 连接。为此,请运行:

sudo firewall-cmd --zone=FedorwaWorkstation --permanent --add-port=5000/tcp

请注意,你需要指定规则适用的域。添加规则时,还需要如上指定它是 tcp 还是 udp 端口。--permanent 参数将规则设置为即使系统重启后也可以保留。

再次查看你所在区域的信息:

[dan@localhost ~]$ firewall-cmd --list-all
FedoraWorkstation (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3
sources:
services: dhcpv6-client mdns samba-client ssh
ports: 1025-65535/udp 1025-65535/tcp 5000/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

类似地,如果你想从列表删除该端口,请运行:

sudo firewall-cmd --zone=FedorwaWorkstation --permanent --remove-port=5000/tcp

相同的 remove‐‐remove-protocol‐‐remove-service) 和 add‐‐add-protocol‐‐add-service)选项同样适用于服务协议


via: https://fedoramagazine.org/how-to-manage-network-services-with-firewall-cmd/

作者:dan01 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

FRR(free range routing)给了你实现多种协议的选择。本指南将帮助你入门。

最近,我写了一篇文章,解释了如何使用 Quagga 路由套件实现 开放式最短路径优先 Open Shortest Path First (OSPF)。可以使用多个软件套件代替 Quagga 来实现不同的路由协议。其中一种是 FRR(free range routing)。

FRR

FRR 是一个路由软件套件,它衍生自 Quagga,并在 GNU GPL2 许可下分发。与 Quagga 一样,它为类 Unix 平台提供了所有主要路由协议的实现,例如 OSPF、 路由信息协议 Routing Information Protocol (RIP)、 边界网关协议 Border Gateway Protocol (BGP) 和 中间系统到中间系统 Intermediate system-to-intermediate system (IS-IS)。

开发了 Quagga 的一些公司,例如 Big Switch Networks、Cumulus、Open Source Routing 和 6wind,创建了 FRR 以在 Quagga 的良好基础上进行改善。

体系结构

FRR 是一组守护进程,它们可以共同构建路由表。每个主协议都在其自己的守护进程中实现,并且这些守护进程与独立于协议的核心守护进程 Zebra 通信,后者提供内核路由表更新、接口查找以及不同路由协议之间路由的重新分配。每个特定协议的守护进程负责运行相关协议并根据交换的信息构建路由表。

 title=

VTY shell

VTYSH 是 FRR 路由引擎的集成 shell。它将每个守护进程中定义的所有 CLI 命令合并,并在单个 shell 中将它们呈现给用户。它提供了类似于 Cisco 的命令行模式,并且许多命令与 Cisco IOS 命令相似。CLI 有不同的模式,某些命令仅在特定模式下可用。

设置

在本教程中,我们将使用 FRR 配置动态路由来实现路由信息协议(RIP)。我们可以通过两种方式来做到这一点:在编辑器中编辑协议守护进程配置文件或使用 VTY Shell。在此例中,我们将使用 VTY shell。我们的设置包括两个名为 Alpha 和 Beta 的 CentOS 7.7 主机。这两台主机都有两个网络接口,并共享对 192.168.122.0/24 网络的访问。我们将广播 10.12.11.0/24 和 10.10.10.0/24 网络的路由。

对于主机 Alpha:

  • eth0 IP:192.168.122.100/24
  • 网关:192.168.122.1
  • eth1 IP:10.10.10.12/24

对于主机 Beta:

  • eth0 IP:192.168.122.50/24
  • 网关:192.168.122.1
  • eth1 IP:10.12.11.12/24

安装软件包

首先,我们需要在两台主机上都安装 FRR 软件包。可以按照官方 FRR 文档中的说明进行操作。

启用 IP 转发

对于路由,我们需要在两台主机上都启用 IP 转发,因为这将由 Linux 内核执行:

sysctl -w net.ipv4.conf.all.forwarding = 1
sysctl -w net.ipv6.conf.all.forwarding = 1
sysctl -p

启用 RIPD 守护进程

安装后,所有配置文件将保存在 /etc/frr 目录中。 必须通过编辑 /etc/frr/daemons 文件显式启用守护进程。该文件确定启动 FRR 服务时激活哪些守护进程。要启用特定的守护进程,只需将相应的 no 改为 yes。之后的服务重启将启动守护进程。

 title=

防火墙配置

由于 RIP 协议使用 UDP 作为传输协议,并被分配了 520 端口,因此我们需要在 firewalld 配置中允许该端口。

firewall-cmd --add-port=520/udp –permanent
firewalld-cmd -reload

现在,我们可以使用以下命令启动 FRR 服务:

systemctl start frr

使用 VTY 进行配置

现在,我们需要使用 VTY Shell 配置 RIP。

在主机 Alpha 上:

[root@alpha ~]# vtysh

Hello, this is FRRouting (version 7.2RPKI).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

alpha# configure terminal
alpha(config)# router rip
alpha(config-router)# network 192.168.122.0/24
alpha(config-router)# network 10.10.10.0/24
alpha(config-router)# route 10.10.10.5/24
alpha(config-router)# do write
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Configuration saved to /etc/frr/ripd.conf
Configuration saved to /etc/frr/staticd.conf
alpha(config-router)# do write memory
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Configuration saved to /etc/frr/ripd.conf
Configuration saved to /etc/frr/staticd.conf
alpha(config-router)# exit

类似地,在主机 Beta 上:

[root@beta ~]# vtysh

Hello, this is FRRouting (version 7.2RPKI).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

beta# configure terminal
beta(config)# router rip
beta(config-router)# network 192.168.122.0/24
beta(config-router)# network 10.12.11.0/24
beta(config-router)# do write
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Configuration saved to /etc/frr/zebra.conf
Configuration saved to /etc/frr/ripd.conf
Configuration saved to /etc/frr/staticd.conf
beta(config-router)# do write memory
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Configuration saved to /etc/frr/zebra.conf
Configuration saved to /etc/frr/ripd.conf
Configuration saved to /etc/frr/staticd.conf
beta(config-router)# exit

完成后,像下面这样检查两台主机路由:

[root@alpha ~]# ip route show
default via 192.168.122.1 dev eth0 proto static metric 100
10.10.10.0/24 dev eth1 proto kernel scope link src 10.10.10.12 metric 101
10.12.11.0/24 via 192.168.122.50 dev eth0 proto 189 metric 20
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.100 metric 100

我们可以看到 Alpha 上的路由表通过 192.168.122.50 包含了 10.12.11.0/24 的条目,它是通过 RIP 提供的。

类似地,在 Beta 上,该表通过 192.168.122.100 包含了 10.10.10.0/24 的条目。

[root@beta ~]# ip route show
default via 192.168.122.1 dev eth0 proto static metric 100
10.10.10.0/24 via 192.168.122.100 dev eth0 proto 189 metric 20
10.12.11.0/24 dev eth1 proto kernel scope link src 10.12.11.12 metric 101
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.50 metric 100

总结

如你所见,设置和配置相对简单。要增加复杂性,我们可以向路由器添加更多的网络接口,以为更多的网络提供路由。可以在编辑器中编辑配置文件来进行配置,但是使用 VTY Shell 在单个组合会话中为我们提供了所有 FRR 守护进程的前端。


via: https://opensource.com/article/20/5/vty-shell

作者:M Umer 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

FirewallD 是由红帽发起的提供了支持网络/防火墙 区域 zone 定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4、IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。

由于 FirewallD 项目本身的自由软件特性,像 Debian Linux 社区发行版已经默认在软件仓库中收录了该防火墙组件软件包。随着各个新 GNU/Linux 发行版中防火墙引擎逐步从 iptables 向 nftables 迁移,FirewallD 是目前唯一能够支持该两种防火墙后端引擎的前端服务组件,用户掌握以后可以方便的进行防火墙配置并很好的规避了从 iptables 向 nftables 迁移带来的学习恐慌。

笔者通过查阅 RedHat 8 发行版网络配置手册,并结合自己在 Debian Linux 10 社区版上进行 FirewallD 防火墙的实际配置使用,对该服务组件的功能和日常使用进行整理。希望通过该文能帮助其他 Linux 用户掌握该防火墙,并通过该防火墙提高主机测网络安全防御能力,打造可信的网络安全环境。

一、安装

在 Debian Linux 10 社区版中使用如下命令:

apt-get install firewall-applet firewall-config firewalld

就可以直接进行 FirewallD 防火墙软件组件包的安装,其中:

  • firewall-applet 为 FirewallD 托盘小程序,
  • firewall-config 为 FirewallD 图形化系统配置管理工具
  • firewalld 为 FirewallD 防火墙软件组件的主组件包,其中包含 firewall-cmdfirewall-offline-cmd 等命令行系统配置管理工具。

在 RedHat 8 下该防火墙组件默认已经进行了安装,如果用户进行特殊定制安装之后需要单独安装该软件组件可以使用命令

yum install firewall-config

直接进行安装即可。

笔者在两个系统装进行过安装对比,发现该软件组件包在两个系统上除了安装命令稍有差异外,其它从配置文件到 systemd 服务配置并没有任何区别。随后的内容将不再强调操作系统。

二、防火墙默认区域

  • Block(阻塞)
    任何对该区域的连接请求都会被以 IPv4 的 icmp-host-prohibited 信息或 IPv6 的 icmp6-adm-prohibited 信息所拒绝。只能从系统内部启动网络连接。
  • Dmz(隔离)
    用于你的隔离区内的电脑,此区域内可公开访问,可以有限地进入你的内部网络,仅仅接收经过选择的连接。
  • Drop(丢弃)
    对进入该区域的所有数据包丢弃,并且不进行任何回包,区域内主动发起连接的流入回程数据包允许通过,允许进行出方向的网络连接。
  • External(外部)
    用于在启用伪装的外部网络上使用,尤其路由器、防火墙认为在这个网络上的其它主机不可信。仅仅接收经过选择的连接。
  • Home(家庭)
    默认其他同区域内主机可信,仅仅接收经过选择的连接。同时默认放行 ssh、mdns、ipp-client、amba-client 与 dhcpv6-client 服务产生的连接。
  • Internal(内部)
    从描述中可以等同于家庭区域。
  • Public(公开)
    公共区域,也是防火墙配置的默认区域,防火墙认为该区域主机不可信。仅仅接收经过选择的连接。同时默认放行 ssh 与 dhcpv6-client 服务产生的连接。
  • Trusted(可信)
    可信区域,防火墙放行一切流量。等同于关闭防火墙功能。
  • Work(工作)
    工作区域,防火墙认为在这个网络上的其它主机不可信。仅仅接收经过选择的连接。同时默认放行 ssh、ipp-client 与 dhcpv6-client 服务产生的连接。

这些区域的命名不言自明,用户可以很快选择一个合适的安全区域,从而简化和避开很多安全问题。当然用户也可以根据自己的需要或者安全评估来根据自己的实际需求对相应安全域进行更个性化的配置,以适应自己的安全管理规范。尽管有些安全域的安全规则是相同的,但之所以还要在名字上有所区别,主要是为了从习惯上让用户更好区分不同域的独特使用场景,对用户来说更好理解和便于区分。

三、防火墙日常管理

3.1、查看防火墙当前状态

查询状态:

firewall-cmd --state

更多的防火墙系统服务状态信息可以使用

systemctl status firewalld

在你配置新的防火墙规则之前,你需要了解如何通过命令查看当前防火墙配置。查看防火墙当前配置可以通过图形界面或者在终端模式下使用命令进行。

在图形界面下可以直接通过点击应用程序“firewall-config”图标或者在终端窗口中输入 firewall-config 命令进行防火墙配置。如果当前用户为非 root 用户,系统将弹出管理员认证窗口,用户正确输入管理员密码后,防火墙配置窗口就会打开,用户即可以按照窗口界面提供的功能进行操作。

用户也可以在命令行下使用 firewall-cmd工具进行防火墙配置。命令行工具虽然学习起来需要一定的时间,不过该工具可以完全在系统处于终端模式下进行各种复杂的防火墙全功能配置,用户有必要进行认真的学习和掌握。

3.2、防火墙基础命令

FirewallD 使用了区域进行数据流的管理,当用户使用 firewall-cmd --list-all 命令时,如果没有使用 --zone 指定区域,那么系统将返回默认区域的当前配置状态。

默认区域由配置文件 /etc/firewalld/firewalld.conf 中的字段 DefaultZone 定义,初始状态下,默认区域被定义为 public(公共区域)。

用户可以使用命令:

firewall-cmd --get-zones

查看当前系统防火墙设置的的区域名列表,也可以使用命令:

firewall-cmd --get-default-zone

查看防火墙当前的默认区域;同时,可使用命令:

firewall-cmd --set-default-zone=[zonename]

或者通过直接编辑配置文件中 DefaultZone 字段的值进行默认区域的修改。

启动防火墙:

systemctl unmask firewalld
systemctl start firewalld

让防火墙随系统启动一起启动:

systemctl enable firewalld

停止防火墙:

systemctl stop firewalld

停止随系统启动:

systemctl disable firewalld

停止通过访问 firewalld D-Bus 接口和其他服务需要 firewalld 依赖导致的 firewalld 自动启动,更加干净的关闭 firewalld 服务:

systemctl mask firewalld

按照 RedHat 的官方文档定义,防火墙运行之后被称为运行时状态,保存了启动默认参数之后的配置被称为永久状态。在当前运行状态对防火墙进行的所有配置修改,系统即时生效,但重启后防火墙会恢复到它之前的永久状态,其实这一过程就是从保存之后的配置文件中加载相应配置参数的过程。

用户可以使用命令:

fiewall-cmd --runtime-to-permanent

对当前修改过的规则即时保存为永久配置,也可以使用命令 firewall-cmd --permanent 并在其后添加其它参数永久进行修改。

重新启动 firewalld 将关闭所有打开的端口并停止网络通信,需要使用命令:

firewall-cmd --reload

重新加载永久配置使之生效。

FirewallD 提供了一种系统受到攻击的紧急操作功能。假设攻击者对系统进行攻击,用户可以直接使用命令:

firewall-cmd --panic-on

关闭网络通信并且切断攻击者,而不用像之前那样通过物理拔除网线来进行断网操作,防止了系统在多网口环境中一次性插拔所有网线可能带来的混乱以及由此引发的系统恢复后延续问题。

需要恢复网络通信时用户只要使用命令:

firewall-cmd --panic-off

关闭恐慌模式即可,用户也可以使用命令:

firewall-cmd --query-panic

查询防火墙当前恐慌模式的状态。

3.2、防火墙服务管理命令

用户可以通过命令行工具添加预定义的服务类型,防火墙会自动根据所需的端口并将其他设置修改为服务定义文件。

使用命令:

firewall-cmd --list-services

可以查看当前区域内被允许的服务。使用命令:

firewall-cmd --get-services

可以列出所有防火墙已经给定的预定义服务名称。使用命令:

firewall-cmd --add-service=<service-name>

可以添加具体服务,服务名称用户可以根据自己的实际需求从预定义服务名称中选取合适的服务名进行添加。完成之后用户可以使用命令:

firewall-cmd --runtime-to-permanent

将对运行时的修改保存为永久。用户可以通过命令 firewall-configfirewall-cmdfirewall-offline-cmd,或者通过直接将 /usr/lib/firewalld/services 目录的默认模板 XML 文件复制到 /etc/firewalld/services 目录中进行编辑来添加一个自定义服务类型。具体过程如下:

方法一:执行 firewall-cmd –new-service=service-name,系统将直接在 /etc/firewalld/services 目录下创建一个以 .xml 结尾的同名文件,自定义服务类型添加完成。

方法二:在相应目录使用编辑软件直接编辑好 XML 文件并执行 firewall-cmd --new-service-from-file=service-name.xml,系统将自动完成同名自定服务类型的添加。

端口作为特定系统服务的接收和区分网络流量并将其转发到系统服务的逻辑设备,系统守护进程通常侦听特定的服务端口。防火墙在默认的服务类型配置中已经定义了相应服务需要放行的对应的端口。当用户还需要在某个服务中放行特定的自定义端口或者端口段的时候可以通过 firewall-cmd 完成,格式如下:

firewall-cmd [--zone=zone_name] [--service=service_name] --add-port=port-number/port-type

这里需要说明的是 --zone--service 为可选参数,如果用户不添加这两个参数执行命令时相当与在默认区域中直接添加了端口,当只选取了 --zone 参数时,命令执行的结果是在指定区域直接添加端口,此时与服务状态无关。只有在使用 --service 参数时才是在相应的服务中添加端口。

当用户需要删除一个端口时可以使用如下命令:

# firewall-cmd [--zone=zone_name] [--service=service_name] --remove-port=port-number/port-type

当用户需要向不同区域添加服务时,用户可以通过如下步逐进行:

# firewall-cmd --add-service=ssh --zone=drop

该命令将向区域 drop 中添加 ssh 服务,其实质就是放行 ssh 服务定义中的默认 22 端口入站方向的流量及连接。

在多网络接口主机中,可以使用如下方法将指定的网络接口添加到需要的区域中,从而实现每个接口的安全连接区域要求,实现真正的区域化网络安全管理。

使用命令:

firewall-cmd --get-active-zones

查看当前激活的安全区域和相应的网络接口配置。使用命令

firewall-cmd --zone=work --change-interface=ens3p0

则将网卡 ens3p0 加入到了 work 区域,之后所有通过该网卡的流量将受到区域安全规则的约束和限制,该配置是即时生效的并且会自动保存为永久配置。

用户需要将某个网卡加入到特定安全区域也可以直接使用:

vi /etc/sysconfig/network-scripts/ifcfg-connection-name

并在该文件下加入 ZONE=zone-name 行,该网卡即属于特定的安全区域。

用户可以对安全区域进行默认规则设置,默热规则包括三个选项 ACCEPTREJECTDROP,其中 ACCEPT 选项将放行所有流量,REJECTDROP 选项将阻止所有进入该安全区域的流量,与 REJECT 不同的是 DROP 选项直接丢弃进入安全区域的数据包,并不会向该数据包的发起者回复任何信息。用户可以使用命令:

firewall-cmd --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>

进行相应安全区域的默认规则设置。

3.3、使用区域根据来源来管理传入流量

你可以使用区域根据来源管理流入流量,这使你可以对传入流量进行排序,并将其路由到不同区域,以允许或禁止该流量可以到达的服务。

如果将源添加到区域,则该区域将变为活动状态,并且来自该源的任何传入流量将通过它。你可以为每个区域指定不同的设置,该设置将应用于来自给定来源的流量。即使你只有一个网络接口,也可以使用更多区域。

通过以下实例,我们可以将特定网段对 HTTP 的请求流量进行更细致的管理,使用命令:

firewall-cmd --zone=trusted --add-source=192.168.1.0/24

将该网段作为资源加入到 trusted 区中,通过命令:

firewall-cmd --zone=trusted --add-service=http

将 Web 服务添加到相同区域中,随后该目标地址产生的访问 Web 服务流量将可以顺利通过。

3.4、防火墙锁机制

为了防止本地程序比如 KVM 虚拟机组件对防火墙的修改,FirewallD 还提供了一种锁闭机制来防止本地程序或者服务组件对防火墙配置的修改,并且该命令只有 root 用户本身才可以执行。

用户可以使用命令:

firewall-cmd --query-lockdown

查询防火墙锁闭状态,当需要锁闭时可以直接执行命令:

firewall-cmd --lockdown-on

恢复到非锁闭状态时可以执行命令:

firewall-cmd --lockdown-off

四、后记

FirewallD 防火墙组件作为 RedHat 对自由软件社区的贡献之一,具有很好的普适性,希望通过本文的讲解使更多的用户开始熟悉该防火墙软件组件,并将其作为主机本地侧防护很好的技术手段,不断提高主机自身的 IPS 能力。在当今网络环境复杂的形势下让主机具有更好的安全性和可用性。

通过理解安全证书来保护你的 Linux 邮件服务。

通常,不管你是通过 简单邮件传输协议 Simple Mail Transport Protocol (SMTP)或者 互联网消息访问协议 Internet Message Access Protocol (IMAP)或 邮局协议 Post Office Protocol (POP)发送或者接受邮件,邮件服务默认都是以无保护的明文来传输数据。近来随着数据加密成为越来越多程序的共识,你需要 安全套接层 Secure Sockets Layer / 传输层安全性 Transport Layer Security (SSL/TLS)的安全证书来保护你的邮件服务。

首先,快速回顾一下邮件服务和协议的基本流程。邮件通过 SMTP 从 TCP 端口 25 发出。这个协议依靠 DNS 邮件交换服务器 Mail eXchanger (MX)记录的地址信息来传输邮件。当邮件到达邮件服务器后,可以被以下两种服务中的任意一种检索:使用 TCP 端口 143 的 IMAP,或者使用 TCP 端口 110 的 POP3(邮局协议第 3 版)。然而,以上服务都默认使用明文传输邮件和认证信息。这非常的不安全!

为了保护电子邮件数据和认证,这些服务都增加了一个安全功能,使它们可以利用 SSL/TLS 证书对数据流和通讯进行加密封装。SSL/TLS 是如何加密数据的细节不在本文讨论范围,有兴趣的话可以阅读 Bryant Son 关于互联网安全的文章了解更多细节。概括的说,SSL/TLS 加密是一种基于公钥和私钥的算法。

通过加入这些安全功能后,这些服务将监听在新的 TCP 端口:

服务默认 TCP 端口SSL/TLS 端口
SMTP25587
IMAP143993
POP3110995

生成 SSL/TLS 证书

OpenSSL 可以生成免费的 SSL/TLS 证书,或者你也可以从公共 证书颁发机构 Certificate Authoritie (CA)购买。过去,生成自签发证书十分简单而且通用,但是由于安全被日益重视,大部分的邮件客户端是不信任自签发证书的,除非手动设置。

如果你只是自己使用或者做做测试,那就使用自签发证书省点钱吧。但是如果很多人或者客户也需要使用的话,那最好还是从受信任的证书颁发机构购买。

不管是哪种情况,开始请求新证书的过程是使用 Linux 系统上的 OpenSSL 工具来创建一个 证书签发请求 Certificate Signing Request (CSR):

$ openssl req -new -newkey rsa:2048 -nodes -keyout mail.mydomain.key -out mail.mydomain.csr

这个命令会为你想保护的服务同时生成一个新的 CSR 文件和一个私匙。它会询问你一些证书相关的问题,如:位置、服务器的 完全合规域名 Fully Qualified Domain Name (FQDN)、邮件联系信息等等。当你输入完这些信息后,私钥和 CSR 文件就生成完毕了。

如果你想生成自签发证书

如果你想要生成自签发证书的话,在运行以上 CSR 命令之前,你必须先创建一个自己的根 CA。你可以通过以下方法创建自己的根 CA。

$ openssl genrsa -des3 -out myCA.key 2048

命令行会提示你输入一个密码。请输入一个复杂点的密码而且不要弄丢了,因为这将会是根 CA 私钥的密码,正如其名称所示,它是你的证书中所有信任关系的根。

接下来,生成根 CA 证书:

$ openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

在回答完一些问题后,你就拥有一个有效期为 5 年的根 CA 证书了。

用之前生成的 CSR 文件,你可以请求生成一个新证书,并由您刚才创建的根 CA 签名。

$ openssl x509 -req -in mail.mydomain.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out mail.mydomain.pem -days 1825 -sha256

输入你的根 CA 私钥的密码来创建和签署证书。

现在你有了配置电子邮件服务以增强安全性所需的两个文件:私匙文件 mail.mydomain.key 和公开证书文件 mail.mydomain.pem

如果你愿意购买证书

如果你愿意从机构购买证书,则需要上传 CSR 文件到证书颁发机构的系统中,它将会被用于生成 SSL/TLS 证书。证书可作为文件下载,比如 mail.mydomain.pem。很多 SSL 机构也需要你下载一个中间证书。如果是这样的话,你必须把这个两个证书合并成一个,这样电子邮件服务就可以将这两个证书结合起来处理。可以使用以下命令把你的证书和第三方中间证书合并在一起:

$ cat mail.mydomain.pem gd_bundle-g2-g1.crt > mail.mydomain.pem

值得一提的是 .pem 文件后缀代表 隐私增强邮件 Privacy-Enhanced Mail

现在你就有全部的设置邮件服务安全所需文件了:私匙文件 mail.mydomain.key 和组合的公开证书文件 mail.mydomain.pem

为你的文件生成一个安全的文件夹

不管你是的证书是自签发的或者从机构购买,你都需要生成一个安全的,管理员拥有的文件夹用于保存这两个文件。可以使用以下命令来生成:

$ mkdir /etc/pki/tls
$ chown root:root /etc/pki/tls
$ chmod 700 /etc/pki/tls

在复制文件到 /etc/pki/tls 后,再次设置这些文件的权限:

$ chmod 600 /etc/pki/tls/*

配置你的 SMTP 和 IMAP 服务

接下来,让 SMTP 和 IMAP 服务使用新的安全证书。我们用 postfixdovecot 来作为例子。

用你顺手的编辑器来编辑 /etc/postfix/main.cf 文件。添加以下几行:

smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/mail.mydomain.pem
smtpd_tls_key_file = /etc/pki/tls/mail.mydomain.key

自定义选项

以下选项可以启用或禁用各种加密算法,协议等等:

smtpd_tls_eecdh_grade = strong
smtpd_tls_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = high
smtpd_tls_security_level=may
smtpd_tls_ciphers = high
tls_preempt_cipherlist = yes
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtpd_tls_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

编辑 /etc/dovecot/dovecot.conf 文件,添加以下三行:

ssl = required
ssl_cert = &lt;/etc/pki/tls/mail.mydomain.pem
ssl_key = &lt;/etc/pki/tls/mail.mydomain.key

添加下列更多选项来启用或禁用各种加密算法、协议等等(我把这些留给你来理解):

ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:ALL:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SSLv2
ssl_prefer_server_ciphers = yes
ssl_protocols = !SSLv2 !SSLv3 !TLSv1 !TLSv1.1
ssl_min_protocol = TLSv1.2

设置 SELinux 上下文

如果你的 Linux 发行版启用了 SELinux,请为你的新证书文件设置正确的 SELinux 上下文。

对于 Postfix 设置 SELinux:

$ chcon -u system_u -t cert_t mail.mydomain.*

对于 Dovecot 设置 SELinux:

$ chcon -u system_u -t dovecot_cert_t mail.mydomain.*

重启这些服务,并与你相应更新过的电子邮件客户端配置连接。有些电子邮件客户端会自动探测到新的端口,有些则需要你手动更新。

测试配置

openssl 命令行和 s_client 插件来简单测试一下:

$ openssl s_client -connect mail.mydomain.com:993
$ openssl s_client -starttls imap -connect mail.mydomain.com:143
$ openssl s_client -starttls smtp -connect mail.mydomain.com:587

这些测试命令会打印出很多信息,关于你使用的连接、证书、加密算法、会话和协议。这不仅是一个验证新设置的好方法,也可以确认你使用了适当的证书,以及在 postfix 或 dovecot 配置文件中定义的安全设置正确。

保持安全!


via: https://opensource.com/article/20/4/securing-linux-email

作者:Marc Skinner 选题:lujun9972 译者:Acceleratorrrr 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

systemd 是所有进程之母,负责将 Linux 主机启动到可以做生产性任务的状态。

systemd(是的,全小写,即使在句子开头也是小写),是初始化程序(init)和 SystemV 初始化脚本的现代替代者。此外,它还有更多功能。

当我想到 init 和 SystemV 初始化时,像大多数系统管理员一样,我想到的是 Linux 的启动和关闭,而不是真正意义上的管理服务,例如在服务启动和运行后对其进行管理。像 init 一样,systemd 是所有进程之母,它负责使 Linux 主机启动到可以做生产性任务的状态。systemd 设定的一些功能比老的初始化程序要广泛得多,它要管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。

本系列文章是基于我的三期 Linux 培训课程《使用和管理 Linux:从零开始进行学习系统管理》部分内容的摘录,探讨了 systemd 在启动和启动完成后的功能。

Linux 引导

Linux 主机从关机状态到运行状态的完整启动过程很复杂,但它是开放的并且是可知的。在详细介绍之前,我将简要介绍一下从主机硬件被上电到系统准备好用户登录的过程。大多数时候,“引导过程”被作为一个整体来讨论,但这是不准确的。实际上,完整的引导和启动过程包含三个主要部分:

  • 硬件引导:初始化系统硬件
  • Linux 引导 boot :加载 Linux 内核和 systemd
  • Linux 启动 startup :systemd 为主机的生产性工作做准备

Linux 启动阶段始于内核加载了 init 或 systemd(取决于具体发行版使用的是旧的方式还是还是新的方式)之后。init 和 systemd 程序启动并管理所有其它进程,它们在各自的系统上都被称为“所有进程之母”。

将硬件引导与 Linux 引导及 Linux 启动区分开,并明确定义它们之间的分界点是很重要的。理解它们的差异以及它们每一个在使 Linux 系统进入生产状态所起的作用,才能够管理这些进程,并更好地确定大部分人所谓的“启动”问题出在哪里。

启动过程按照三步引导流程,使 Linux 计算机进入可进行生产工作的状态。当内核将主机的控制权转移到 systemd 时,启动环节开始。

systemd 之争

systemd 引起了系统管理员和其它负责维护 Linux 系统正常运行人员的广泛争议。在许多 Linux 系统中,systemd 接管了大量任务,这在某些开发者和sysadmins群体中引起了反对和不和谐。

SystemV 和 systemd 是执行 Linux 启动环节的两种不同的方法。SystemV 启动脚本和 init 程序是老的方法,而使用 目标 target 的 systemd 是新方法。尽管大多数现代 Linux 发行版都使用较新的 systemd 进行启动、关机和进程管理,但仍有一些发行版未采用。原因之一是某些发行版维护者和系统管理员喜欢老的 SystemV 方法,而不是新的 systemd。

我认为两者都有其优势。

为何我更喜欢 SystemV

我更喜欢 SystemV,因为它更开放。使用 Bash 脚本来完成启动。内核启动 init 程序(这是一个编译后的二进制)后,init 启动 rc.sysinit 脚本,该脚本执行许多系统初始化任务。rc.sysinit 执行完后,init 启动 /etc/rc.d/rc 脚本,该脚本依次启动 /etc/rc.d/rcX.d 中由 SystemV 启动脚本定义的各种服务。其中 X 是待启动的运行级别号。

除了 init 程序本身之外,所有这些程序都是开放且易于理解的脚本。可以通读这些脚本并确切了解整个启动过程中发生的事情,但是我不认为有太多系统管理员真正做到这一点。每个启动脚本都被编了号,以便按特定顺序启动预期的服务。服务是串行启动的,一次只能启动一个服务。

systemd 是由 Red Hat 的 Lennart Poettering 和 Kay Sievers 开发的,它是一个由大型的、编译的二进制可执行文件构成的复杂系统,不访问其源码就无法理解。它是开源的,因此“访问其源代码”并不难,只是不太方便。systemd 似乎表现出对 Linux 哲学多个原则的重大驳斥。作为二进制文件,systemd 无法被直接打开供系统管理员查看或进行简单更改。systemd 试图做所有事情,例如管理正在运行的服务,同时提供明显比 SystemV 更多的状态信息。它还管理硬件、进程、进程组、文件系统挂载等。systemd 几乎涉足于现代 Linux 主机的每个方面,使它成为系统管理的一站式工具。所有这些都明显违反了“程序应该小,且每个程序都应该只做一件事并做好”的原则。

为何我更喜欢 systemd

我更喜欢用 systemd 作为启动机制,因为它会根据启动阶段并行地启动尽可能多的服务。这样可以加快整个的启动速度,使得主机系统比 SystemV 更快地到达登录屏幕。

systemd 几乎可以管理正在运行的 Linux 系统的各个方面。它可以管理正在运行的服务,同时提供比SystemV 多得多的状态信息。它还管理硬件、进程和进程组、文件系统挂载等。systemd 几乎涉足于现代 Linux 操作系统的每方面,使其成为系统管理的一站式工具。(听起来熟悉吧?)

systemd 工具是编译后的二进制文件,但该工具包是开放的,因为所有配置文件都是 ASCII 文本文件。可以通过各种 GUI 和命令行工具来修改启动配置,也可以添加或修改各种配置文件来满足特定的本地计算环境的需求。

真正的问题

你认为我不能喜欢两种启动系统吗?我能,我会用它们中的任何一个。

我认为,SystemV 和 systemd 之间大多数争议的真正问题和根本原因在于,在系统管理层面没有选择权。使用 SystemV 还是 systemd 已经由各种发行版的开发人员、维护人员和打包人员选择了(但有充分的理由)。由于 init 极端的侵入性,挖出并替换 init 系统会带来很多影响,会带来很多在发行版设计过程之外难以解决的后果。

尽管该选择实际上是为我而选的,但我的Linux主机能不能开机、能不能工作,这是我平时最关心的。作为最终用户,甚至是系统管理员,我主要关心的是我是否可以完成我的工作,例如写我的书和这篇文章,安装更新以及编写脚本来自动化所有事情。只要我能做我的工作,我就不会真正在意发行版中使用的启动系统。

在启动或服务管理出现问题时,我会在意。无论主机上使用哪种启动系统,我都足够了解如何沿着事件顺序来查找故障并进行修复。

替换SystemV

以前曾有过用更现代的东西替代 SystemV 的尝试。大约在两个版本中,Fedora 使用了一个叫作 Upstart 的东西来替换老化的 SystemV,但是它没有取代 init,也没有提供我所注意到的任何变化。由于 Upstart 并未对 SystemV 的问题进行任何显著的改变,所以在这个方向上的努力很快就被放弃了,转而使用 systemd。

尽管大部分 Linux 开发人员都认可替换旧的 SystemV 启动系统是个好主意,但许多开发人员和系统管理员并不喜欢 systemd。与其重新讨论人们在 systemd 中遇到的或曾经遇到过的所有所谓的问题,不如带你去看两篇好文章,尽管有些陈旧,但它们涵盖了大多数内容。Linux 内核的创建者 Linus Torvalds 对 systemd 似乎不感兴趣。在 2014 年 ZDNet 的一篇文章《Linus Torvalds 和其他人对 Linux 上的 systemd 的看法》中,Linus 清楚地表达了他的感受。

“实际上我对 systemd 本身没有任何特别强烈的意见。我对一些核心开发人员有一些问题,我认为他们在对待错误和兼容性方面过于轻率,而且我认为某些设计细节是疯狂的(例如,我不喜欢二进制日志),但这只是细节,不是大问题。”

如果你对 Linus 不太了解的话,我可以告诉你,如果他不喜欢某事,他是非常直言不讳的,很明确,而且相当明确的表示不喜欢。他解决自己对事物不满的方式已经被社会更好地接受了。

2013 年,Poettering 写了一篇很长的博客,他在文章驳斥了关于 systemd 的迷思,同时对创建 systemd 的一些原因进行了深入的剖析。这是一分很好的读物,我强烈建议你阅读。

systemd 任务

根据编译过程中使用的选项(不在本系列中介绍),systemd 可以有多达 69 个二进制可执行文件执行以下任务,其中包括:

  • systemd 程序以 1 号进程(PID 1)运行,并提供使尽可能多服务并行启动的系统启动能力,它额外加快了总体启动时间。它还管理关机顺序。
  • systemctl 程序提供了服务管理的用户接口。
  • 支持 SystemV 和 LSB 启动脚本,以便向后兼容。
  • 服务管理和报告提供了比 SystemV 更多的服务状态数据。
  • 提供基本的系统配置工具,例如主机名、日期、语言环境、已登录用户的列表,正在运行的容器和虚拟机、系统帐户、运行时目录及设置,用于简易网络配置、网络时间同步、日志转发和名称解析的守护进程。
  • 提供套接字管理。
  • systemd 定时器提供类似 cron 的高级功能,包括在相对于系统启动、systemd 启动时间、定时器上次启动时间的某个时间点运行脚本。
  • 它提供了一个工具来分析定时器规范中使用的日期和时间。
  • 能感知分层的文件系统挂载和卸载功能可以更安全地级联挂载的文件系统。
  • 允许主动的创建和管理临时文件,包括删除。
  • D-Bus 的接口提供了在插入或移除设备时运行脚本的能力。这允许将所有设备(无论是否可插拔)都被视为即插即用,从而大大简化了设备的处理。
  • 分析启动环节的工具可用于查找耗时最多的服务。
  • 它包括用于存储系统消息的日志以及管理日志的工具。

架构

这些以及更多的任务通过许多守护程序、控制程序和配置文件来支持。图 1 显示了许多属于 systemd 的组件。这是一个简化的图,旨在提供概要描述,因此它并不包括所有独立的程序或文件。它也不提供数据流的视角,数据流是如此复杂,因此在本系列文章的背景下没用。

 title=

图 1:systemd 的架构,作者 Shmuel Csaba Otto Traian (CC BY-SA 3.0)

如果要完整地讲解 systemd 就需要一本书。你不需要了解图 1 中的 systemd 组件是如何组合在一起的细节。只需了解支持各种 Linux 服务管理以及日志文件和日志处理的程序和组件就够了。但是很明显, systemd 并不是某些批评者所宣称的那样,它是一个单一的怪物。

作为 1 号进程的 systemd

systemd 是 1 号进程(PID 1)。它的一些功能,比老的 SystemV3 init 要广泛得多,用于管理正在运行的 Linux 主机的许多方面,包括挂载文件系统以及启动和管理 Linux 生产主机所需的系统服务。与启动环节无关的任何 systemd 任务都不在本文讨论范围之内(但本系列后面的一些文章将探讨其中的一些任务)。

首先,systemd 挂载 /etc/fstab 所定义的文件系统,包括所有交换文件或分区。此时,它可以访问位于 /etc 中的配置文件,包括它自己的配置文件。它使用其配置链接 /etc/systemd/system/default.target 来确定将主机引导至哪个状态或目标。default.target 文件是指向真实目标文件的符号链接。对于桌面工作站,通常是 graphical.target,它相当于 SystemV 中的运行级别 5。对于服务器,默认值更可能是 multi-user.target,相当于 SystemV 中的运行级别 3。emergency.target 类似于单用户模式。 目标 target 服务 service 是 systemd 的 单元 unit

下表(图 2)将 systemd 目标与老的 SystemV 启动运行级别进行了比较。systemd 提供 systemd 目标别名以便向后兼容。目标别名允许脚本(以及许多系统管理员)使用 SystemV 命令(如 init 3)更改运行级别。当然,SystemV 命令被转发给 systemd 进行解释和执行。

systemd 目标SystemV 运行级别目标别名描述
default.target 此目标总是通过符号连接的方式成为 multi-user.targetgraphical.target 的别名。systemd 始终使用 default.target 来启动系统。default.target 绝不应该设为 halt.targetpoweroff.targetreboot.target 的别名。
graphic.target5runlevel5.target带有 GUI 的 multi-user.target
4runlevel4.target未用。在 SystemV 中运行级别 4 与运行级别 3 相同。可以创建并自定义此目标以启动本地服务,而无需更改默认的 multi-user.target
multi-user.target3runlevel3.target所有服务在运行,但仅有命令行界面(CLI)。
2runlevel2.target多用户,没有 NFS,其它所有非 GUI 服务在运行。
rescue.target1runlevel1.target基本系统,包括挂载文件系统,运行最基本的服务和主控制台的恢复 shell。
emergency.targetS 单用户模式:没有服务运行;不挂载文件系统。这是最基本的工作级别,只有主控制台上运行的一个紧急 Shell 供用户与系统交互。
halt.target 停止系统而不关闭电源。
reboot.target6runlevel6.target重启。
poweroff.target0runlevel0.target停止系统并关闭电源。

图 2:SystemV 运行级别与 systemd 目标和一些目标别名的比较

每个目标在其配置文件中都描述了一个依赖集。systemd 启动必须的依赖项,这些依赖项是运行 Linux 主机到特定功能级别所需的服务。当目标配置文件中列出的所有依赖项被加载并运行后,系统就在该目标级别运行了。在图 2 中,功能最多的目标位于表的顶部,从顶向下,功能逐步递减。

systemd 还会检查老的 SystemV init 目录,以确认是否存在任何启动文件。如果有,systemd 会将它们作为配置文件以启动它们描述的服务。网络服务是一个很好的例子,在 Fedora 中它仍然使用 SystemV 启动文件。

图 3(如下)是直接从启动手册页复制来的。它显示了 systemd 启动期间一般的事件环节以及确保成功启动的基本顺序要求。

                                        cryptsetup-pre.target
                                                   |
 (various low-level                                v
     API VFS mounts:                 (various cryptsetup devices...)
  mqueue, configfs,                                |    |
  debugfs, ...)                                    v    |
  |                                  cryptsetup.target  |
  |  (various swap                                 |    |    remote-fs-pre.target
  |   devices...)                                  |    |     |        |
  |    |                                           |    |     |        v
  |    v                       local-fs-pre.target |    |     |  (network file systems)
  |  swap.target                       |           |    v     v                 |
  |    |                               v           |  remote-cryptsetup.target  |
  |    |  (various low-level  (various mounts and  |             |              |
  |    |   services: udevd,    fsck services...)   |             |    remote-fs.target
  |    |   tmpfiles, random            |           |             |             /
  |    |   seed, sysctl, ...)          v           |             |            /
  |    |      |                 local-fs.target    |             |           /
  |    |      |                        |           |             |          /
  \____|______|_______________   ______|___________/             |         /
                              \ /                                |        /
                               v                                 |       /
                        sysinit.target                           |      /
                               |                                 |     /
        ______________________/|\_____________________           |    /
       /              |        |      |               \          |   /
       |              |        |      |               |          |  /
       v              v        |      v               |          | /
  (various       (various      |  (various            |          |/
   timers...)      paths...)   |   sockets...)        |          |
       |              |        |      |               |          |
       v              v        |      v               |          |
 timers.target  paths.target   |  sockets.target      |          |
       |              |        |      |               v          |
       v              \_______ | _____/         rescue.service   |
                              \|/                     |          |
                               v                      v          |
                           basic.target         rescue.target    |
                               |                                 |
                       ________v____________________             |
                      /              |              \            |
                      |              |              |            |
                      v              v              v            |
                  display-    (various system   (various system  |
              manager.service     services        services)      |
                      |         required for        |            |
                      |        graphical UIs)       v            v
                      |              |            multi-user.target
 emergency.service    |              |              |
         |            \_____________ | _____________/
         v                          \|/
 emergency.target                    v
                              graphical.target

图 3: systemd 启动图

sysinit.targetbasic.target 目标可以看作启动过程中的检查点。尽管 systemd 的设计目标之一是并行启动系统服务,但是某些服务和功能目标必须先启动,然后才能启动其它服务和目标。直到该检查点所需的所有服务和目标被满足后才能通过这些检查点。

sysinit.target 所依赖的所有单元都完成时,就会到达 sysinit.target。所有这些单元,包括挂载文件系统、设置交换文件、启动 Udev、设置随机数生成器种子、启动低层服务以及配置安全服务(如果一个或多个文件系统是加密的)都必须被完成,但在 sysinit.target 中,这些任务可以并行执行。

sysinit.target 启动了系统接近正常运行所需的所有低层服务和单元,它们也是进入 basic.target 所需的。

在完成 sysinit.target 之后,systemd 会启动实现下一个目标所需的所有单元。basic.target 通过启动所有下一目标所需的单元来提供一些额外功能。包括设置为各种可执行程序目录的路径、设置通信套接字和计时器之类。

最后,用户级目标 multi-user.targetgraphical.target 被初始化。要满足 graphical.target 的依赖必须先达到 multi-user.target。图 3 中带下划线的目标是通常的启动目标。当达到这些目标之一时,启动就完成了。如果 multi-user.target 是默认设置,那么你应该在控制台上看到文本模式的登录界面。如果 graphical.target 是默认设置,那么你应该看到图形的登录界面。你看到的具体的 GUI 登录界面取决于你的默认显示管理器。

引导手册页还描述并提供了引导到初始化 RAM 磁盘和 systemd 关机过程的图。

systemd 还提供了一个工具,该工具列出了完整的启动过程或指定单元的依赖项。单元是一个可控的 systemd 资源实体,其范围可以从特定服务(例如 httpd 或 sshd)到计时器、挂载、套接字等。尝试以下命令并滚动查看结果。

systemctl list-dependencies graphical.target

注意,这会完全展开使系统进入 graphical.target 运行模式所需的顶层目标单元列表。也可以使用 --all 选项来展开所有其它单元。

systemctl list-dependencies --all graphical.target

你可以使用 less 命令来搜索诸如 targetslicesocket 之类的字符串。

现在尝试下面的方法。

systemctl list-dependencies multi-user.target

systemctl list-dependencies rescue.target

systemctl list-dependencies local-fs.target

systemctl list-dependencies dbus.service

这个工具帮助我可视化我正用的主机的启动依赖细节。继续花一些时间探索一个或多个 Linux 主机的启动树。但是要小心,因为 systemctl 手册页包含以下注释:

“请注意,此命令仅列出当前被服务管理器加载到内存的单元。尤其是,此命令根本不适合用于获取特定单元的全部反向依赖关系列表,因为它不会列出被单元声明了但是未加载的依赖项。”

结尾语

即使在没有深入研究 systemd 之前,很明显能看出它既强大又复杂。显然,systemd 不是单一、庞大、独体且不可知的二进制文件。相反,它是由许多较小的组件和旨在执行特定任务的子命令组成。

本系列的下一篇文章将更详细地探讨 systemd 的启动,以及 systemd 的配置文件,更改默认的目标以及如何创建简单服务单元。

资源

互联网上有大量关于 systemd 的信息,但是很多都很简短、晦涩甚至是带有误导。除了本文提到的资源外,以下网页还提供了有关 systemd 启动的更详细和可靠的信息。

  • Fedora 项目有一个很好的实用的 systemd 指南。它有你需要知道的通过 systemd 来配置、管理和维护 Fedora 主机所需的几乎所有知识。
  • Fedora 项目还有一个不错的速记表,将老的 SystemV 命令与对比的 systemd 命令相互关联。
  • 有关 systemd 的详细技术信息及创建它的原因,请查看 Freedesktop.orgsystemd 描述
  • Linux.com 的“systemd 的更多乐趣”提供了更高级的 systemd 信息和技巧

还有针对 Linux 系统管理员的一系列技术性很强的文章,作者是 systemd 的设计师和主要开发者 Lennart Poettering。这些文章是在 2010 年 4 月至 2011 年 9 月之间撰写的,但它们现在和那时一样有用。关于 systemd 及其生态的其它许多好文都基于这些论文。


via: https://opensource.com/article/20/4/systemd

作者:David Both 选题:lujun9972 译者:messon007 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

随着各 GNU/Linux 系统厂商以及社区逐步开始采用新的内核作为其发行版本的默认内核,防火墙机制采用了更新的 nftables 防火墙机制。

尽管红帽公司提供了 firewalld.service 防火墙服务组件以及相关的配置管理命令 firewall-configfirewall-cmd 来对防火墙进行管理,但该服务组件目前还没有在其他发行版或者社区版本内得到统一使用。

为了更好的帮助读者朋友们理解该防火墙机制,笔者将自己在工作中直接使用 nftables 进行手工创建配置,从而使系统具有本地 IPS 能力的过程进行总结。

目前多数主流的新发行版 GNU/Linux 系统,默认安装完成后 systemd 系统和服务管理器中已经添加了新的 nftables.serivce 子服务配置文件。同时依然支持 iptables 规则和 iptables 命令,不过为了彻底将防火墙升级到 nftables 机制,我们可以在没有 firewalld.service 的发行版系统中直接启用 nftables.service 服务来使用新的防火墙。

通过执行命令 vi /lib/systemd/system/nftables.service,从该文件中的语句 ExecStart=/usr/sbin/nft -f /etc/nftables.conf 我们可以清楚的看到,nftables 防火墙的默认配置和规则文件一般都放置在系统的 /etc/nftables.conf 目录中,不过该默认配置文件中只包含一个名为 inet filter 的简单 IPv4/IPv6 防火墙列表。

inet 过滤器可以同时适用于 IPv4 和 IPv6 的规则,但不能用于 NAT 类型的链,只能用于过滤器类型的链。

为了保持和 iptables 防火墙的规则类比,便于用户熟悉,我们可以使用如下 nftables 命令创建相应的表和链来建立一个类似于传统 iptables 防火墙框架,创建过程如下:

1、创建 nft 表

与 iptables 中的表不同,nftables 中没有内置表,表的数量和名称由用户决定。但是,每个表只有一个地址簇,并且只适用于该簇的数据包。

表可以指定五个(ip、ip6、inet、arp、bridge)簇中的一个,用户可以依次执行如下命令:

nft add table ip filter
nft add table ip6 filter
nft add table bridge filter”

nftables 将为我们分别建立三个 ipipv6bridge 簇并且表名均为 filter 的防火墙框架。

2、创建链

表包含链,链的目的是保存规则。

与 iptables 中的链不同,nftables 也没有内置链。这意味着与 iptables 不同,如果链不匹配 nftables 框架中的簇或钩子,则流经这些链的数据包不会被 nftables 触及。

链有两种类型。基础链是来自网络栈的数据包的入口点,其中指定了钩子,其实可以理解为 iptables 防火墙的默认规则。常规链可以理解为其它用户自定义的规则链。

使用如下命令为每一个表建立 INPUTFORWARDOUTPUT 链,并且设置基础链,其中 ipfilterINPUT 链默认为丢弃所有数据包的相应的命令格式如下。

添加 ipfilter 表相应链命令集:

nft add chain ip filter INPUT { type filter hook input priority 0\; policy drop\; }  

nft add chain ip filter FORWARD { type filter hook forward priority 0\; policy accept\; }  

nft add chain ip filter OUTPUT { type filter hook output priority 0\; policy accept\; }

添加 ipv6filter 表相应链命令集:

nft add chain ip6 filter INPUT { type filter hook input priority 0\; policy accept\; }  

nft add chain ip6 filter FORWARD { type filter hook forward priority 0\; policy accept\; }  

nft add chain ip6 filter OUTPUT { type filter hook output priority 0\; policy accept\; }

添加 bridgefilter 表相应链命令集:

nft add chain bridge filter INPUT { type filter hook input priority 0\; policy accept\; }  

nft add chain bridge filter FORWARD { type filter hook forward priority 0\; policy accept\; }  

nft add chain bridge filter OUTPUT { type filter hook forward priority 0\; policy accept\; }

3、添加规则

规则由语句或表达式构成,包含在链中。

将一条规则添加到链中使用如下语法:

nft add rule family table chain handle statement

规则添加到 handle 处,这是可选的。如果不指定,则规则添加到链的末尾,类似于 iptables -A 方法。

将规则插入到指定位置使用如下语法:

nft insert rule family table chain handle statement

如果未指定handle,则规则插入到链的开头,类似于 iptables -I 方法。

以下是用户根据自己的实际情况添加的具体规则:

放行本地回环接口 lo 的所有流量:

nft add rule ip filter INPUT iif lo accept

放行 establishedrelated 状态的数据包,这一点很重要,因为多数对外访问的数据包在收到对端主机回包时多为这两种状态,如果在 INPUT 链中不放行该类型数据包,即使本机的 OUTPUT 链默认为 ACCEPT,让所有数据包出站,系统也会主动在 INPUT 链中丢弃掉相应的回包而导致数据无法交互。具体命令如下:

nft add rule ip filter INPUT ct state established,related accept

阻断存在重大安全隐患的系统端口,包括已经公布的比如勒索病毒等端口。nftables 在配置过程中,当用户使用端口进行添加后,nftables 会自动将端口转换为 service 模式,用户可以通过使用命令 nft describe tcp dport 对照查看。阻断安全隐患的系统端口具体命令如下:

nft add rule ip filter INPUT meta l4proto tcp tcp dport { loc-srv, 136, netbios-ns, netbios-dgm, netbios-ssn, microsoft-ds, 3389, radmin-port } counter drop

nft add rule ip filter INPUT meta l4proto udp udp dport { loc-srv, 136, netbios-ns, netbios-dgm, netbios-ssn, microsoft-ds, 3389, radmin-port } counter drop

对服务进行限流控制,防止 DDoS 攻击或者 CC 攻击造成系统服务中断,可以通过 limit 限制通信速率,以下是接受一个每秒最多 10 个 web 或者 https 或者 dns 查询请求的数据包,同时可以有 2 个包超出限制的规则具体命令:

nft add rule ip filter INPUT meta l4proto tcp tcp dport { 80,443,53 } ct state new limit rate 10/second burst 4 packets accept
  
nft add rule ip filter INPUT meta l4proto udp udp dport { 80,443,53 } ct state new limit rate 10/second burst 4 packets accept

总结

经过以上配置后,我们的主机就具有了很好的本机 IPS 能力。应对不论是面向南北跨路由器的访问流量,还是本地网络内的东西访问流量,常规的恶意扫描或者恶意攻击基本是够用了。

之后用户可以使用命令 nft list ruleset > /etc/nftables.conf 将这些规则保存在 nftables 的默认配置文件中,并使用 systemctl enable nftables.service 打开该服务的默认启动模式,之后系统将在开机时自动启动 nftables 防火墙并应用相应规则。

用户也可以通过命令 vi /etc/nftables.conf 来直接按照相应规则编辑该文件来修改防火墙配置,以确保自己的系统处于本机防火墙 IPS 能力的保护之下。

希望本文对你有用并能帮助到你。