适用于: .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 已安装并正在运行,但没有定义的规则。
此处的目标是仅允许 HTTP 和 SSH(安全外壳)流量从外部访问 VM。 若要实现此目的,请执行以下步骤:
- 在启用
ufw
之前,请确保默认策略规则设置为 允许。 否则,将面临与 VM 的 SSH 连接丢失的风险。 默认规则是未匹配其他规则时处理的规则。 启用默认的“允许”规则可确保不会阻止传入的 SSH 流量。 此时,根本不存在“拒绝”规则。 因此,允许所有传入流量。 -
重要
显式添加 SSH 和 HTTP“允许”规则。 另请注意,如果将 SSH 端口配置为与默认值 22 不同的值,则应允许该端口。 例如,如果将 SSH 端口更改为 2222,则应运行以下命令:
sudo ufw allow 2222
- 将默认规则设置为“拒绝”规则。 这可确保如果协议不同于 SSH 或 HTTP,则默认的“拒绝”规则将拒绝流量。 例如,将拒绝传入的 HTTP 流量。
ufw
启用 .
以下步骤的命令在以下屏幕截图中列出。
这是每个步骤中发生的情况。
通过运行
sudo ufw status verbose
命令来检查 ufw 的状态。 默认情况下,ufw 未启用且处于非活动状态。runs
sudo ufw default allow
命令。 由于没有默认“允许”规则以外的其他规则,因此 VM 上的每个端口都将被视为打开。-
重要
通过运行
sudo ufw allow ssh
命令将 SSH 协议添加到允许的列表。 Protocol.ssh 是已知的协议,它在 /etc/services 文件中定义。 因此,可以使用“ssh”而不是“22”。 请记住,如果将 SSH 服务配置为侦听默认端口 22 以外的端口,则应显式添加另一个端口。 例如,如果将 SSH 配置为侦听端口 2222,请运行以下命令:sudo ufw allow 2222
通过运行
sudo ufw allow http
来允许 HTTP 协议。 HTTP 是在 /etc/services 文件中定义的已知协议。 因此,可以使用协议名称,并且可以sudo ufw allow http
运行命令。 运行sudo ufw allow 80
也是完全有效的。注意
允许 SSH 和 HTTP 协议后,需要将所有其他协议添加到“拒绝”列表。
可以通过运行
sudo ufw default deny
命令将默认规则更改为拒绝来执行此操作。 仅允许 SSH 和 HTTP 协议。 其他协议将被拒绝。启用
ufw
。
完成此过程后, 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。
再次打开浏览器,然后尝试访问在 Linux 中运行的 ASP.NET Core 应用程序。
此屏幕截图显示了预期结果。
可以使用命令直接在 Linux VM wget
中运行类似的测试。 以下屏幕截图显示了通过运行 wget
同一测试所需的步骤。
这是每个步骤中发生的情况。
添加了 HTTP 协议的“拒绝”规则。
该
wget buggyamb-external
命令已运行。 正如你猜到的,“buggyamb-external”主机名解析 Linux VM 的公共 IP 地址。 为此,请使用 vi 编辑/etc/hosts
文件。 如图所示,wget
尝试连接到它,但从未成功。 若要中断操作,必须按 Ctrl+C。添加了 HTTP 协议的“允许”规则。
wget buggyamb-external
再次运行该命令会生成不同的结果。 这一次,wget
由于允许 HTTP 协议,因此能够进行连接。 如图所示,wget
将Index.html文件下载到当前目录。
现在,你离完成调试 ASP.NET Core 应用程序所需的配置更近一步。 转到下一部分之前,请确保在本地防火墙中同时允许 SSH 和 HTTP。