第 2.4 部分 - 使用本地防火墙保护 Linux 并允许远程访问

适用于: .NET Core 2.1、.NET Core 3.1、.NET 5

本文介绍如何配置本地防火墙来保护 Linux 虚拟机(VM)。

先决条件

完成本教程的这一部分没有任何先决条件。

本部分的目标

你将了解如何通过配置防火墙来保护 Linux VM。

尽管此部分没有先决条件,但理想的设置将遵循上一部分的指导。 应具有以下各项:

  • Nginx 自动运行并侦听端口 80 上发送的请求
  • Nginx 配置为反向代理,并将传入请求路由到侦听端口 5000 的 ASP.NET Core 应用程序。
  • 配置为在服务器重启或进程停止或崩溃后自动启动的 ASP.NET Core 应用程序

配置本地防火墙以允许从远程计算机进行访问

几乎所有 Linux 分发版都包含名为 iptables 的本地防火墙。 此 初学者指南 足以快速入门。 Iptables 是一种轻型但功能强大的防火墙,它使用策略链允许或阻止流量。

根据 Ubuntu 社区帮助页,默认情况下,iptable 安装在所有官方 Ubuntu 分发版上,并配置为允许所有流量。

虽然 iptable 是轻型防火墙,但管理持久性规则并不容易。 幸运的是,有几个防火墙配置工具可以更轻松地在 Linux 中配置防火墙规则。 根据 官方的 Ubuntu 防火墙文档,Ubuntu 的默认防火墙配置工具为 ufw。 此工具提供了比 iptables 提供的更易用户的方法来创建基于 IPv4 或 IPv6 主机的防火墙。

注意

ufw 最初在默认情况下处于禁用状态。 因此,必须启用它才能使用它。

本教程中使用的 Linux VM 不受任何防火墙规则的保护。 这是因为,虽然 iptable 已安装并正在运行,但没有定义的规则。

sudo iptables 命令的屏幕截图。

此处的目标是仅允许 HTTP 和 SSH(安全外壳)流量从外部访问 VM。 若要实现此目的,请执行以下步骤:

  1. 在启用 ufw之前,请确保默认策略规则设置为 允许。 否则,将面临与 VM 的 SSH 连接丢失的风险。 默认规则是未匹配其他规则时处理的规则。 启用默认的“允许”规则可确保不会阻止传入的 SSH 流量。 此时,根本不存在“拒绝”规则。 因此,允许所有传入流量。
  2. 重要

    显式添加 SSH 和 HTTP“允许”规则。 另请注意,如果将 SSH 端口配置为与默认值 22 不同的值,则应允许该端口。 例如,如果将 SSH 端口更改为 2222,则应运行以下命令: sudo ufw allow 2222

  3. 将默认规则设置为“拒绝”规则。 这可确保如果协议不同于 SSH 或 HTTP,则默认的“拒绝”规则将拒绝流量。 例如,将拒绝传入的 HTTP 流量。
  4. ufw启用 .

以下步骤的命令在以下屏幕截图中列出。

六个 sudo 命令的屏幕截图。

这是每个步骤中发生的情况。

  1. 通过运行 sudo ufw status verbose 命令来检查 ufw 的状态。 默认情况下,ufw 未启用且处于非活动状态。

  2. runs sudo ufw default allow 命令。 由于没有默认“允许”规则以外的其他规则,因此 VM 上的每个端口都将被视为打开。

  3. 重要

    通过运行 sudo ufw allow ssh 命令将 SSH 协议添加到允许的列表。 Protocol.ssh 是已知的协议,它在 /etc/services 文件中定义。 因此,可以使用“ssh”而不是“22”。 请记住,如果将 SSH 服务配置为侦听默认端口 22 以外的端口,则应显式添加另一个端口。 例如,如果将 SSH 配置为侦听端口 2222,请运行以下命令: sudo ufw allow 2222

  4. 通过运行 sudo ufw allow http来允许 HTTP 协议。 HTTP 是在 /etc/services 文件中定义的已知协议。 因此,可以使用协议名称,并且可以 sudo ufw allow http 运行命令。 运行 sudo ufw allow 80 也是完全有效的。

    注意

    允许 SSH 和 HTTP 协议后,需要将所有其他协议添加到“拒绝”列表。

  5. 可以通过运行 sudo ufw default deny 命令将默认规则更改为拒绝来执行此操作。 仅允许 SSH 和 HTTP 协议。 其他协议将被拒绝。

  6. 启用 ufw

完成此过程后, sudo ufw status verbose 输出如下所示。

sudo ufw status verbose 命令的屏幕截图。

配置防火墙后,测试防火墙是否正常工作。

测试本地防火墙

测试防火墙非常简单:为 HTTP 协议创建“拒绝”规则,然后尝试从另一台计算机访问站点。 应阻止请求。

在创建此“拒绝”规则之前,请确保应用程序的当前配置中可供浏览器访问。 为此,请通过添加 buggyamb 主机名并使用 Linux VM 的公共 IP 地址,在客户端计算机上编辑 C:\Windows\System32\drivers\etc\hosts 文件。 buggyamb 主机名解析 Linux VM IP 地址。 可以将任何主机名添加到主机文件,也可以尝试直接连接到 Linux VM 的公共 IP 地址。

欢迎页的屏幕截图。

验证 HTTP 请求是否可以到达 VM 后,请尝试启用阻止 HTTP 流量的规则。 这可确保防火墙正常工作。 为此,请运行 sudo ufw deny http 为 HTTP 添加“拒绝”规则。 这将为 HTTP 协议(端口 80 上)添加两个“拒绝”规则。 一个用于 IPv4,另一个用于 IPv6。

sudo ufw deny http 命令的屏幕截图。

再次打开浏览器,然后尝试访问在 Linux 中运行的 ASP.NET Core 应用程序。

无效页面的屏幕截图。

此屏幕截图显示了预期结果。

可以使用命令直接在 Linux VM wget 中运行类似的测试。 以下屏幕截图显示了通过运行 wget同一测试所需的步骤。

sudo 四个命令的屏幕截图。

这是每个步骤中发生的情况。

  1. 添加了 HTTP 协议的“拒绝”规则。

  2. wget buggyamb-external 命令已运行。 正如你猜到的,“buggyamb-external”主机名解析 Linux VM 的公共 IP 地址。 为此,请使用 vi 编辑 /etc/hosts 文件。 如图所示, wget 尝试连接到它,但从未成功。 若要中断操作,必须按 Ctrl+C

  3. 添加了 HTTP 协议的“允许”规则。

  4. wget buggyamb-external再次运行该命令会生成不同的结果。 这一次, wget 由于允许 HTTP 协议,因此能够进行连接。 如图所示, wget 将Index.html文件下载到当前目录。

现在,你离完成调试 ASP.NET Core 应用程序所需的配置更近一步。 转到下一部分之前,请确保在本地防火墙中同时允许 SSH 和 HTTP。

sudo ufw status 命令的屏幕截图。

后续步骤

第 2.5 部分 - 将文件从开发环境复制到 Linux VM,然后提取 Linux 中的文件。