状态: 已弃用
本文介绍了不再受支持的 CentOS 版本。 如果您目前正在运行运行 CentOS 6 的服务器,我们强烈建议您升级或迁移到受支持的 CentOS 版本。
原因: CentOS 6 已于 2020 年 11 月 30 日结束生命周期 (EOL) and no longer receives security patches or updates. For this reason, this guide is no longer maintained.
请参阅:
本指南可能仍可用作参考,但可能不适用于其他 CentOS 版本。 如果可用,我们强烈建议使用为您正在使用的 CentOS 版本编写的指南。
以下 DigitalOcean 教程涵盖了与本指南中涵盖的主题相关的主题,您可能会感兴趣:
介绍
本文将展示如何在 Centos VPS 上创建简单的防火墙。 它只会打开我们想要的端口并关闭其他服务。 我还将展示如何防止更简单的攻击,以及如果您意外拒绝访问自己,如何让自己回到 VPS。
本教程绝不是详尽无遗的,只展示了如何打开几个传入端口:对于 apache、SSH 和电子邮件,并关闭所有其他端口。 我们不会阻止任何传出流量,只会创建一些最常见的规则来阻止寻找易受攻击的 VPS 的常用脚本和机器人。
iptables 是安装在大多数 linux 发行版上的简单防火墙。 iptables 的 linux 手册页 说它是用于 IPv4 数据包过滤和 NAT 的 管理工具,在翻译中意味着它是一个过滤掉的工具并阻止互联网流量。 iptables 防火墙默认包含在 DigitalOcean 提供的 Centos 6.4 linux 镜像中。
我们将一一设置防火墙规则。 简化:防火墙是 规则 的列表,因此当传入连接打开时,如果它匹配任何规则,则该规则可以接受或拒绝该连接。 如果不满足任何规则,我们使用默认规则。
笔记: 本教程涵盖 IPv4 安全性。 在 Linux 中,IPv6 的安全性与 IPv4 分开维护。 例如,“iptables”仅维护 IPv4 地址的防火墙规则,但它有一个称为“ip6tables”的 IPv6 对应项,可用于维护 IPv6 网络地址的防火墙规则。
如果您的 VPS 配置为 IPv6,请记住使用适当的工具保护您的 IPv4 和 IPv6 网络接口。 有关 IPv6 工具的更多信息,请参阅本指南:如何配置工具以在 Linux VPS 上使用 IPv6
决定打开哪些端口和服务
首先,我们想知道我们想要向公众开放哪些服务。 让我们使用典型的 Web 托管服务器:它是一个 Web 和电子邮件服务器,我们还需要通过 SSH 服务器让自己进入。
首先,我们想让 SSH 端口保持打开状态,这样我们就可以远程连接到 VPS:即端口 22。
此外,我们需要端口 80 和 443(SSL 端口)用于 Web 流量。 对于发送电子邮件,我们将打开端口 25(常规 SMTP)和 465(安全 SMTP)。 为了让用户接收电子邮件,我们将打开通常的端口 110(POP3)和 995(安全 POP3 端口)。
此外,如果我们安装了 IMAP 端口,我们 ' 将打开:IMAP 为 143,基于 SSL 的 IMAP 为 993。注意:建议仅允许安全协议,但这可能不是一个选项,如果我们不能影响邮件服务用户更改他们的电子邮件客户端。
阻止最常见的攻击
DigitalOcean VPS 通常带有空配置:允许所有流量。 为了确保这一点,我们可以 flush 防火墙规则——也就是说,将它们全部删除:
iptables -F
然后我们可以添加一些简单的防火墙规则来阻止最常见的攻击,以保护我们的 VPS 免受脚本小子的攻击。 我们不能仅仅依靠 iptables 来保护我们免受全面 DDOS 或类似攻击,但我们至少可以推迟通常的网络扫描机器人,它们最终会找到我们的 VPS 并开始寻找可以利用的安全漏洞。 首先,我们从阻塞空包开始。
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
我们告诉防火墙接收所有带有 tcp 标志 NONE 的传入数据包,然后丢弃它们。 空包简单来说就是侦察包。 攻击模式使用这些来尝试查看我们如何配置 VPS 并找出弱点。 下一个要拒绝的模式是 syn-flood 攻击。
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
Syn-flood 攻击 表示攻击者打开一个新连接,但没有说明他们想要什么(即。 SYN、ACK 等等)。 他们只是想占用我们服务器的资源。 我们不会接受这样的包裹。 现在我们转向一种更常见的模式:XMAS 数据包,也是一个侦察数据包。
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
我们已经排除了至少一些在我们的 VPS 中发现漏洞的常见模式。
为选定的服务打开端口
现在我们可以开始将选定的服务添加到我们的防火墙过滤器中。 第一个这样的事情是 localhost 接口:
iptables -A INPUT -i lo -j ACCEPT
我们告诉 iptables 向传入 (INPUT) 过滤表添加 (-A) 一条规则,任何来自 localhost 接口 (-i lo) 的流量并接受 (-j ACCEPT) 它。 localhost 常用于,即。 您的网站或电子邮件服务器与本地安装的数据库进行通信。 这样我们的 VPS 可以使用数据库,但数据库对来自互联网的攻击是封闭的。
现在我们可以允许 Web 服务器流量:
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
我们将两个端口(http 端口 80 和 https 端口 443)添加到 ACCEPT 链 - 允许这些端口上的流量。 现在,让我们允许用户使用我们的 SMTP 服务器:
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
如前所述,如果我们可以影响我们的用户,我们宁愿使用安全版本,但通常我们无法指定条款,客户端将使用端口 25 连接,这更容易嗅探密码。 我们现在继续允许用户在他们的服务器上阅读电子邮件:
iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
这两条规则将允许 POP3 流量。 同样,我们可以通过使用服务的安全版本来提高电子邮件服务器的安全性。 现在我们还需要允许 IMAP 邮件协议:
iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
限制 SSH 访问
我们还应该允许 SSH 流量,这样我们就可以远程连接到 VPS。 执行此操作的简单方法是使用以下命令:
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
我们现在告诉 iptables 添加一个规则来接受传入端口 22(默认 SSH 端口)的 tcp 流量。 建议将 SSH 配置更改为不同的端口,并且此防火墙过滤器应相应更改,但配置 SSH 不是本文的一部分。
然而,我们可以用防火墙本身做一件事。 如果我们的办公室有一个永久 IP 地址,我们只能允许从这个来源连接到 SSH。 这将只允许我们所在位置的人进行连接。
首先,找出您的外部 IP 地址。 确保它不是来自您的 LAN 的地址,否则它将不起作用。 您只需访问 whatismyip.com 站点即可。 另一种查找方法是键入:
w
在终端中,我们应该看到我们已登录(如果我们是唯一登录的人)并且我们的 IP 地址被记下。
输出看起来像这样:
root@iptables# w 11:42:59 up 60 days, 11:21, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 213.191.xxx.xxx 09:27 0.00s 0.05s 0.00s w
现在,您可以创建防火墙规则以仅允许来自一个来源的 SSH 端口的流量:您的 IP 地址:
iptables -A INPUT -p tcp -s YOUR_IP_ADDRESS -m tcp --dport 22 -j ACCEPT
当然,将 YOUR_IP_ADDRESS 替换为实际 IP。
我们可以根据需要通过更改端口号在防火墙上打开更多端口。 这样,我们的防火墙将只允许访问我们想要的服务。 现在,我们需要再添加一条允许我们使用传出连接的规则(即。 从 VPS ping 或运行软件更新);
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
它将允许任何已建立的传出连接从该连接另一端的 VPS 接收回复。 当我们完成所有设置后,我们将阻止其他所有内容,并允许所有传出连接。
iptables -P OUTPUT ACCEPT iptables -P INPUT DROP
现在我们有了防火墙规则。
保存配置
现在我们已经完成了所有配置,我们可以列出规则以查看是否缺少任何内容。
iptables -L -n
这里的-n开关是因为我们只需要ip地址,不需要域名。 IE。 如果规则中有这样的 IP: 69.55.48.33:防火墙会去查找它,发现它是 digitalocean.com 的 IP。 我们不需要那个,只需要地址本身。 现在我们终于可以保存我们的防火墙配置了:
iptables-save | sudo tee /etc/sysconfig/iptables
CentOS 上的 iptables 配置文件位于 /etc/sysconfig/iptables。 上述命令将我们创建的规则保存到该文件中。 为了确保一切正常,我们可以重新启动防火墙:
service iptables restart
即使重新启动 VPS,保存的规则也会保留。
冲洗以解锁自己
如果我们在配置中发生意外,我们可能会阻止自己访问 VPS。 也许我们输入了错误的 IP 地址,因此防火墙不允许来自我们的工作站的连接。 现在我们无法达到这些规则,如果我们保存了它们,即使重新启动也无济于事。 幸运的是,DO Web 界面允许我们通过控制台连接到服务器:
连接后,我们以 root 身份登录并发出以下命令:
iptables -F
这将刷新过滤器,我们将能够再次进入 VPS。
结论
这篇文章并不详尽,它只是触及了在 linux 机器上运行一个简单的防火墙的皮毛。 对于不熟悉 linux 命令行或 iptables 的开发人员来说,它对于典型的 Web 和电子邮件服务器场景来说已经足够了。
然而,还有很多事情可以做。 互联网上有很好的教程和示例,可以帮助我们提供更强大的配置。 对于生产环境,建议创建更详细的配置或让安全专家准备配置。
希望简短的说明将为新的 VPS 提供基本的安全性。