新FreeBSD12.0服务器的推荐步骤
介绍
在设置新的 FreeBSD 服务器时,您可以采取许多可选步骤来使您的服务器进入对生产更友好的状态。 在本指南中,我们将介绍一些最常见的示例。
我们将设置一个简单、易于配置的防火墙来拒绝大多数流量。 我们还将确保您服务器的时区准确反映其位置。 我们将设置 NTP 轮询以保持服务器的时间准确,最后演示如何为您的服务器添加一些额外的交换空间。
在开始使用本指南之前,您应该登录并按照您喜欢的方式配置您的 shell 环境。 您可以按照 本指南 了解如何执行此操作。
如何配置简单的 IPFW 防火墙
第一项任务是设置一个简单的防火墙来保护您的服务器。
FreeBSD 支持并包括三个独立的防火墙。 这些称为 pf
、ipfw
和 ipfilter
。 在本指南中,我们将使用 ipfw 作为我们的防火墙。 ipfw
是作为 FreeBSD 的一部分编写和维护的安全、有状态的防火墙。
配置基本防火墙
几乎所有的配置都将在 /etc/rc.conf
文件中进行。 要修改配置,您将使用 sysrc
命令,它允许用户以安全的方式更改 /etc/rc.conf
中的配置。 在此文件中,您将添加许多不同的行来启用和控制 ipfw
防火墙的运行方式。 您将从基本规则开始; 运行以下命令开始:
sudo sysrc firewall_enable="YES"
每次运行 sysrc
来修改配置时,您都会收到显示更改的输出:
Outputfirewall_enable: NO -> YES
如您所料,第一个命令启用 ipfw
防火墙,在引导时自动启动它并允许使用通常的 service
命令启动它。
现在运行以下命令:
sudo sysrc firewall_quiet="YES"
这告诉 ipfw
在执行某些操作时不要将任何内容输出到标准输出。 这似乎是一个偏好问题,但它实际上会影响防火墙的功能。
两个因素相结合,使其成为一个重要的选择。 首先是防火墙配置脚本是在当前shell环境中执行的,而不是作为后台任务。 第二个是当 ipfw
命令读取没有 "quiet"
标志的配置脚本时,它依次读取并输出每一行到标准输出。 当它输出一行时,它立即执行相关的动作。
大多数防火墙配置文件都会在脚本顶部刷新当前规则,以便重新开始。 如果 ipfw
防火墙遇到这样的没有安静标志的行,它将立即刷新所有规则并恢复其默认策略,通常是拒绝所有连接。 如果您通过 SSH 配置防火墙,这将断开连接,关闭当前的 shell 会话,并且不会处理任何后续规则,从而有效地将您锁定在服务器之外。 quiet 标志允许防火墙将规则作为一组来处理,而不是单独实施每个规则。
在这两行之后,您可以开始配置防火墙的行为。 现在选择 "workstation"
作为您要配置的防火墙类型:
sudo sysrc firewall_type="workstation"
这会将防火墙设置为保护您使用有状态规则配置防火墙的服务器。 有状态防火墙 随着时间的推移监控网络连接的状态,并将有关这些连接的信息存储在内存中一小段时间。 因此,不仅可以定义防火墙应该允许哪些连接的规则,而且状态防火墙还可以使用它所了解的有关先前连接的数据来评估可以建立哪些连接。
/etc/rc.conf
文件还允许您使用 firewall_myservices
和 firewall_allowservices
选项自定义您希望客户端能够访问的服务。
运行以下命令打开服务器上应可访问的端口,例如用于 SSH 连接的端口 22
和用于传统 HTTP Web 服务器的端口 80
。 如果您在 Web 服务器上使用 SSL,请确保添加端口 443
:
sudo sysrc firewall_myservices="22/tcp 80/tcp 443/tcp"
firewall_myservices
选项设置为 TCP 端口或服务的列表,以空格分隔,应该可以在您的服务器上访问。
注意: 您也可以通过名称使用服务。 FreeBSD 通过名称知道的服务列在 /etc/services
文件中。 例如,您可以将前面的命令更改为如下所示:
firewall_myservices="ssh http https"
这将产生相同的结果。
firewall_allowservices
选项列出了应允许访问所提供服务的项目。 因此,它允许您将对暴露的服务(从 firewall_myservices
)的访问限制到特定的机器或网络范围。 例如,如果您希望机器托管公司内部网络的 Web 内容,这可能会很有用。 关键字 "any"
表示任何 IP 都可以访问这些服务,使它们完全公开:
sudo sysrc firewall_allowservices="any"
firewall_logdeny
选项告诉 ipfw
记录所有被拒绝到位于 /var/log/security
的文件的连接尝试。 运行以下命令进行设置:
sudo sysrc firewall_logdeny="YES"
要检查您对防火墙配置所做的更改,请运行以下命令:
grep 'firewall' /etc/rc.conf
/etc/rc.conf
文件的这一部分将如下所示:
Outputfirewall_enable="YES" firewall_quiet="YES" firewall_type="workstation" firewall_myservices="22 80 443" firewall_allowservices="any" firewall_logdeny="YES"
请记住调整 firewall_myservices
选项以引用您希望向客户端公开的服务。
允许 UDP 连接(可选)
/etc/rc.conf
文件的 firewall_myservices
选项中列出的端口和服务允许访问 TCP 连接。 如果您希望公开使用 UDP 的服务,则需要编辑 /etc/rc.firewall
文件:
sudo vi /etc/rc.firewall
您将防火墙配置为使用 "workstation"
防火墙类型,因此请查找如下所示的部分:
/etc/rc.firewall
. . . [Ww][Oo][Rr][Kk][Ss][Tt][Aa][Tt][Ii][Oo][Nn]) . . .
此块中有一个部分专门用于处理您设置的 firewall_allowservices
和 firewall_myservices
值。 它看起来像这样:
/etc/rc.firewall
for i in ${firewall_allowservices} ; do for j in ${firewall_myservices} ; do ${fwcmd} add pass tcp from $i to me $j done done
在本节之后,您可以通过添加如下行来添加应该接受 UDP 数据包的任何服务或端口:
${fwcmd} add pass udp from any to me port_num
在vi
中,按i
切换到INSERT
模式并添加您的内容,然后按ESC
保存并关闭文件,输入[ X143X],然后按 ENTER
。 在前面的示例中,如果应允许所有客户端连接或将其更改为特定的 IP 地址或网络范围,您可以保留 "any"
关键字。 port_num
应替换为您希望允许 UDP 访问的端口号或服务名称。 例如,如果您正在运行 DNS 服务器,您可能希望有如下所示的行:
for i in ${firewall_allowservices} ; do for j in ${firewall_myservices} ; do ${fwcmd} add pass tcp from $i to me $j done done ${fwcmd} add pass udp from 192.168.2.0/24 to me 53
这将允许 192.168.2.0/24
网络范围内的任何客户端访问在标准端口 53
上运行的 DNS 服务器。 请注意,在此示例中,您还希望为 TCP 连接打开此端口,因为 DNS 服务器使用该端口进行更长的回复。
完成后保存并关闭文件。
启动防火墙
完成配置后,您可以通过键入以下命令启动防火墙:
sudo service ipfw start
防火墙将正确启动,阻止不需要的流量,同时遵守您允许的服务和端口。 此防火墙将在每次启动时自动启动。
您还想对每个 IP 地址记录的拒绝次数进行限制。 这将防止您的日志被单个持久用户填满。 您可以在 /etc/sysctl.conf
文件中执行此操作:
sudo vi /etc/sysctl.conf
在文件的底部,您可以通过添加以下行将日志记录限制为 "5"
:
/etc/sysctl.conf
... net.inet.ip.fw.verbose_limit=5
完成后保存并关闭文件。 这将在下次启动时配置该设置。
要在不重新启动当前活动会话的情况下实现相同的行为,您可以使用 sysctl
命令本身,如下所示:
sudo sysctl net.inet.ip.fw.verbose_limit=5
这应该立即实施此引导的限制。
如何为您的服务器设置时区
为您的服务器正确设置时区是个好主意。 这是您在下一节中配置 NTP 时间同步时的重要步骤。
FreeBSD 带有一个名为 tzsetup
的基于菜单的工具,用于配置时区。 要为您的服务器设置时区,请使用 sudo
权限调用此命令:
sudo tzsetup
首先,您将被要求选择您的服务器所在的世界区域:
接下来,您需要选择一个子区域或国家:
注意: 要导航这些菜单,您需要使用 PAGE UP
和 PAGE DOWN
键。 如果您的键盘上没有这些,您可以使用 FN
+ DOWN
或 FN
+ UP
。
最后,选择适合您的服务器的特定时区:
确认根据您的选择显示的时区选择。
此时,您的服务器的时区应该与您所做的选择相匹配。
如何配置 NTP 以保持准确的时间
现在您已经在服务器上配置了时区,您可以设置 NTP 或网络时间协议。 这将有助于使您的服务器时间与世界各地的其他人保持同步。 这对于时间敏感的客户端-服务器交互以及准确的日志记录非常重要。
同样,您可以通过调整 /etc/rc.conf
文件在您的服务器上启用 NTP 服务。 运行以下命令将 ntpd_enable="YES"
行添加到文件中:
sudo sysrc ntpd_enable="YES"
您还需要添加第二行,以便在启动时将您机器上的时间与远程 NTP 服务器同步。 这是必要的,因为它允许您的服务器在初始化时超过正常的漂移限制。 您的服务器可能会在启动时超出漂移限制,因为您的时区将在 NTP 守护程序启动之前应用,这将抵消您的系统时间:
sudo sysrc ntpd_sync_on_start="YES"
如果您没有此行,则您的 NTP 守护程序在启动时将失败,因为时区设置会在启动过程之前扭曲您的系统时间。
您可以通过键入以下命令启动 ntpd
服务:
sudo service ntpd start
这将通过与 /etc/ntp.conf
中列出的 NTP 服务器同步来保持服务器的时间。
如何配置额外的交换空间
在 DigitalOcean 上配置的 FreeBSD 服务器上,无论您的服务器大小如何,都会自动配置 1 GB 的 交换空间 。 您可以通过键入以下内容来查看:
sudo swapinfo -g
它应该显示如下内容:
OutputDevice 1G-blocks Used Avail Capacity /dev/gpt/swapfs 1 0 1 0%
一些用户和应用程序可能需要比这更多的交换空间。 这是通过添加交换文件来完成的。
您需要做的第一件事是为要用于交换的文件分配一块文件系统。 您将使用 truncate
命令,它可以快速分配空间。
在本教程中,我们会将交换文件放在 /swapfile
中,但您可以将文件放在您希望的任何位置,例如 /var/swapfile
。 该文件将提供额外的 1 GB 交换空间。 您可以通过修改 -s
选项的值来调整此数字:
sudo truncate -s 1G /swapfile
分配空间后,您需要锁定对文件的访问。 普通用户不应对该文件有任何访问权限:
sudo chmod 0600 /swapfile
接下来,将伪设备与您的文件相关联,并通过键入以下命令将其配置为在启动时挂载:
echo "md99 none swap sw,file=/swapfile,late 0 0" | sudo tee -a /etc/fstab
此命令将如下所示的行添加到 /etc/fstab
文件:
md99 none swap sw,file=/swapfile,late 0 0
将该行添加到您的 /etc/fstab
文件后,您可以通过键入以下内容来激活会话的交换文件:
sudo swapon -aqL
您可以再次使用 swapinfo
命令验证交换文件是否正在工作:
sudo swapinfo -g
您应该会看到与您的交换文件关联的附加设备 (/dev/md99
):
OutputDevice 1G-blocks Used Avail Capacity /dev/gpt/swapfs 1 0 1 0% /dev/md99 1 0 1 0% Total 2 0 2 0%
此交换文件将在每次启动时自动挂载。
结论
本指南中概述的步骤可用于使您的 FreeBSD 服务器进入更适合生产的状态。 通过配置防火墙、NTP 同步和适当的交换空间等基本要素,您的服务器可以用作未来安装和服务的良好基础。