介绍
在设置新的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
来修改配置时,您都会收到显示更改的输出:
firewall_enable: NO -> YES
正如您所料,第一个命令启用ipfw
防火墙,在启动时自动启动并允许使用常用service
命令启动它。
现在运行以下命令:
sudo sysrc firewall_quiet="YES"
这告诉ipfw
在执行某些操作时不要输出任何标准输出。 这似乎是一个偏好问题,但实际上它会影响防火墙的功能。
两个因素相结合,使其成为一个重要的选择。 第一个是防火墙配置脚本在当前shell环境中执行,而不是作为后台任务执行。 第二个是当ipfw
命令读取没有"quiet"
标志的配置脚本时,它会依次读取并输出每一行到标准输出。 当它输出一行时,它会立即执行相关的操作。
大多数防火墙配置文件刷新脚本顶部的当前规则,以便从一个干净的平板开始。 如果ipfw
防火墙在没有quiet标志的情况下遇到这样的行,它将立即刷新所有规则并恢复其默认策略,这通常是拒绝所有连接。 如果您通过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
文件的这一部分如下所示:
firewall_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"
防火墙类型,因此请查找如下所示的部分:
. . .[Ww][Oo][Rr][Kk][Ss][Tt][Aa][Tt][Ii][Oo][Nn]). . .
此块中有一个部分专门用于处理您设置的firewall_allowservices
和firewall_myservices
值。 它看起来像这样:
for i in ${firewall_allowservices} ; do for j in ${firewall_myservices} ; do ${fwcmd} add pass tcp from $i to me $j donedone
在本节之后,您可以通过添加如下行来添加应接受UDP数据包的任何服务或端口:
${fwcmd} add pass udp from any to me port_num
在vi
,按i
切换到INSERT
模式并添加内容,然后按ESC
键保存并关闭文件,输入:wq
,然后按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 donedone${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"
:
...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千兆字节的交换空间 。 你可以输入以下内容来看到:
sudo swapinfo -g
它应该显示如下:
Device 1G-blocks Used Avail Capacity/dev/gpt/swapfs 1 0 1 0%
某些用户和应用程序可能需要更多的交换空间。 这是通过添加交换文件来完成的。
您需要做的第一件事是为要用于交换的文件分配一大块文件系统。 您将使用truncate
命令,它可以快速分配空间。
我们将交换文件放在/swapfile
用于本教程,但您可以将文件放在任何您想要的位置,例如/var/swapfile
。 此文件将提供额外的1千兆字节交换空间。 您可以通过修改给定于-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
):
Device 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同步和适当的交换空间等基本要素,您的服务器可以作为未来安装和服务的良好基础。