Debian 10上使用UFW设置防火墙
<h3 id="introduction">介绍</h3><p>UFW或Uncomplicated Firewall是<code>iptables</code>一个接口,旨在简化配置防火墙的过程。 虽然<code>iptables</code>是一个可靠而灵活的工具,但初学者很难学会如何使用它来正确配置防火墙。 如果您希望开始保护网络并且不确定使用哪种工具,UFW可能是您的正确选择。</p>
<p>本教程将向您展示如何在Debian 10上使用UFW设置防火墙。</p>
<h2 id="prerequisites">先决条件</h2>
<p>要学习本教程,您需要一台带有<code>sudo</code>非root用户的Debian 10服务器,您可以按照Debian 10初始服务器设置教程中的第1步-3进行设置 。</p>
<h2 id="step-1-–-installing-ufw">第1步 - 安装UFW</h2>
<p>Debian默认不安装UFW。 如果您遵循整个初始服务器安装教程 ,则您将安装并启用UFW。 如果没有,请使用<code>apt</code>立即安装:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo apt install ufw</span></code></pre>
<p>我们将设置UFW并按以下步骤启用它。</p>
<h2 id="step-2-—-using-ipv6-with-ufw-optional">第2步 - 将IPv6与UFW一起使用(可选)</h2>
<p>本教程是以IPv4编写的,但只要您启用它就适用于IPv6。 如果您的Debian服务器启用了IPv6,您需要确保将UFW配置为支持IPv6; 这将确保UFW除了IPv4之外还将管理IPv6的防火墙规则。 要配置它,请使用<code>nano</code>或您喜欢的编辑器打开UFW配置文件<code>/etc/default/ufw</code> :</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo nano <span class="pun">/<span class="pln">etc<span class="pun">/<span class="kwd">default<span class="pun">/<span class="pln">ufw</span></span></span></span></span></span></span></code></pre>
<p>然后确保<code>IPV6</code>值为<code>yes</code> 。 它应该如下所示:</p>
<div class="code-label " title="/ etc / default / ufw摘录">/ etc / default / ufw摘录</div>
<pre class="code-pre prettyprint prettyprinted"><code><span class="pln">IPV6<span class="pun">=<span class="highlight"><span class="pln">yes
</span></span></span></span></code></pre>
<p>保存并关闭文件。 现在,当启用UFW时,它将配置为同时写入IPv4和IPv6防火墙规则。 但是,在启用UFW之前,您需要确保将防火墙配置为允许您通过SSH进行连接。 让我们从设置默认策略开始。</p>
<h2 id="step-3-—-setting-up-default-policies">第3步 - 设置默认策略</h2>
<p>如果您刚开始使用防火墙,则要定义的第一个规则是您的默认策略。 这些规则处理未明确匹配任何其他规则的流量。默认情况下,UFW设置为拒绝所有传入连接并允许所有传出连接。 这意味着任何尝试访问您服务器的人都无法连接,而服务器中的任何应用程序都可以访问外部世界。</p>
<p>让我们将您的UFW规则设置回默认值,以便我们确保您能够按照本教程进行操作。 要设置UFW使用的默认值,请使用以下命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw <span class="kwd">default<span class="pln"> deny incoming
sudo ufw <span class="kwd">default<span class="pln"> allow outgoing</span></span></span></span></span></code></pre>
<p>这些命令将默认值设置为拒绝传入并允许传出连接。 仅这些防火墙默认值可能足以用于个人计算机,但服务器通常需要响应来自外部用户的传入请求。 我们接下来会调查一下。</p>
<h2 id="step-4-—-allowing-ssh-connections">第4步 - 允许SSH连接</h2>
<p>如果我们现在启用了我们的UFW防火墙,它将拒绝所有传入的连接。 这意味着,如果我们希望服务器响应这些类型的请求,我们将需要创建明确允许合法传入连接的规则 - 例如SSH或HTTP连接。 如果您使用的是云服务器,则可能需要允许传入的SSH连接,以便连接和管理服务器。</p>
<p>要将服务器配置为允许传入SSH连接,可以使用以下命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow ssh</span></code></pre>
<p>这将创建防火墙规则,允许端口<code>22</code>上的所有连接,这是SSH守护程序默认监听的端口。 UFW知道什么端口<code>allow ssh</code>意思,因为它在<code>/etc/services</code>文件中列为<code>/etc/services</code> 。</p>
<p>但是,我们实际上可以通过指定端口而不是服务名来编写等效规则。 例如,此命令产生与上面相同的结果:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow <span class="lit">22</span></span></code></pre>
<p>如果将SSH守护程序配置为使用其他端口,则必须指定相应的端口。 例如,如果SSH服务器正在监听端口<code>2222</code> ,则可以使用此命令允许该端口上的连接:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow <span class="highlight"><span class="lit">2222
</span></span></span></code></pre>
<p>现在您的防火墙已配置为允许传入SSH连接,您可以启用它。</p>
<h2 id="step-5-—-enabling-ufw">第5步 - 启用UFW</h2>
<p>要启用UFW,请使用以下命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw enable</span></code></pre>
<p>您将收到一条警告,指出该命令可能会破坏现有的SSH连接。 我们已经设置了允许SSH连接的防火墙规则,因此可以继续。 用<code>y</code>回应提示<code>ENTER</code> 。</p>
<p>防火墙现在处于活动状态。 运行<code>sudo ufw status verbose</code>命令以查看已设置的规则。 本教程的其余部分将介绍如何更详细地使用UFW,包括允许和拒绝不同类型的连接。</p>
<h2 id="step-6-—-allowing-other-connections">第6步 - 允许其他连接</h2>
<p>此时,您应该允许服务器需要的所有其他连接正常运行。 您应该允许的连接取决于您的特定需求。 幸运的是,您已经知道如何编写允许基于服务名称或端口的连接的规则; 我们已经在端口<code>22</code>上为SSH做了这个。 你也可以这样做:</p>
<ul>
<li>端口<code>80</code>上的HTTP,这是未加密的Web服务器使用的。 要允许此类流量,您可以键入<code>sudo ufw allow http</code>或<code>sudo ufw allow 80</code> 。</li>
<li>端口<code>443</code>上的HTTPS,这是加密的Web服务器使用的。 要允许此类流量,您可以键入<code>sudo ufw allow https</code>或<code>sudo ufw allow 443</code> 。</li>
</ul>
<p>但是,除了指定端口或已知服务之外,还有其他方法可以允许连接。 我们将讨论下一步。</p>
<h3 id="specific-port-ranges">特定端口范围</h3>
<p>您可以使用UFW指定端口范围。 例如,某些应用程序使用多个端口而不是单个端口。</p>
<p>例如,要允许使用端口<code>6000</code> - <code>6007</code> <code>X11</code>连接,请使用以下命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow <span class="highlight"><span class="lit">6000<span class="pun">:<span class="highlight"><span class="lit">6007<span class="pun">/<span class="pln">tcp
sudo ufw allow <span class="highlight"><span class="lit">6000<span class="pun">:<span class="highlight"><span class="lit">6007<span class="pun">/<span class="pln">udp</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>使用UFW指定端口范围时,必须指定规则应适用的协议( <code>tcp</code>或<code>udp</code> )。 我们之前没有提到这一点,因为没有指定协议会自动允许两种协议,这在大多数情况下都可以。</p>
<h3 id="specific-ip-addresses">特定的IP地址</h3>
<p>使用UFW时,您还可以指定IP地址。 例如,如果要允许来自特定IP地址的连接(例如工作或家庭IP地址<code>203.0.113.4</code>,则需要指定IP地址,然后指定IP地址:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow <span class="kwd">from<span class="pln"> <span class="highlight"><span class="lit">203.0<span class="pun">.<span class="lit">113.4
</span></span></span></span></span></span></span></code></pre>
<p>您还可以通过添加<code>to any port</code>后跟端口号<code>to any port</code>指定允许IP地址连接的特定端口。 例如,如果要允许<code>203.0.113.4</code>连接到端口<code>22</code> (SSH),请使用以下命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow <span class="kwd">from<span class="pln"> <span class="highlight"><span class="lit">203.0<span class="pun">.<span class="lit">113.4<span class="pln"> to any port <span class="highlight"><span class="lit">22
</span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="subnets">子网</h3>
<p>如果要允许IP地址子网,可以使用CIDR表示法指定网络掩码。 例如,如果要允许所有IP地址范围从<code>203.0.113.1</code>到<code>203.0.113.254</code> ,则可以使用此命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow <span class="kwd">from<span class="pln"> <span class="highlight"><span class="lit">203.0<span class="pun">.<span class="lit">113.0<span class="pun">/<span class="highlight"><span class="lit">24
</span></span></span></span></span></span></span></span></span></span></code></pre>
<p>同样,您也可以指定允许子网<code>203.0.113.0/24</code>连接的目标端口。 同样,我们将使用端口<code>22</code> (SSH)作为示例:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow <span class="kwd">from<span class="pln"> <span class="highlight"><span class="lit">203.0<span class="pun">.<span class="lit">113.0<span class="pun">/<span class="highlight"><span class="lit">24<span class="pln"> to any port <span class="lit">22</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="connections-to-a-specific-network-interface">与特定网络接口的连接</h3>
<p>如果要创建仅适用于特定网络接口的防火墙规则,可以通过指定<code>allow in on</code> ,然后指定网络接口的名称来执行此操作。</p>
<p>您可能希望在继续之前查找网络接口。 为此,请使用以下命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">ip addr</span></code></pre>
<pre class="code-pre prettyprint prettyprinted"><code><label class="secondary-code-label" title="Output"><span class="typ">Output</span></label><span class="typ">2<span class="pun">:<span class="pln"> <span class="highlight"><span class="pln">eth0<span class="pun">:<span class="pln"> <span class="pun"><<span class="pln">BROADCAST<span class="pun">,<span class="pln">MULTICAST<span class="pun">,<span class="pln">UP<span class="pun">,<span class="pln">LOWER_UP<span class="pun">><span class="pln"> mtu <span class="lit">1500<span class="pln"> qdisc pfifo_fast state
<span class="pun">.<span class="pln"> <span class="pun">.<span class="pln"> <span class="pun">.<span class="pln">
<span class="lit">3<span class="pun">:<span class="pln"> <span class="highlight"><span class="pln">eth1<span class="pun">:<span class="pln"> <span class="pun"><<span class="pln">BROADCAST<span class="pun">,<span class="pln">MULTICAST<span class="pun">><span class="pln"> mtu <span class="lit">1500<span class="pln"> qdisc noop state DOWN <span class="kwd">group<span class="pln"> <span class="kwd">default<span class="pln">
<span class="pun">.<span class="pln"> <span class="pun">.<span class="pln"> <span class="pun">.</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>突出显示的输出表示网络接口名称。 它们通常被命名为<code>eth0</code>或<code>enp3s2</code> 。</p>
<p>例如,如果您的服务器具有名为<code>eth0</code>的公共网络接口,则可以使用以下命令允许HTTP流量:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow <span class="kwd">in<span class="pln"> on <span class="highlight"><span class="pln">eth0<span class="pln"> to any port <span class="highlight"><span class="lit">80
</span></span></span></span></span></span></span></span></code></pre>
<p>这样做将允许您的服务器从公共互联网接收HTTP请求。</p>
<p>或者,如果您希望MySQL数据库服务器(端口<code>3306</code> )监听专用网络接口<code>eth1</code>上的连接,则可以使用以下命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw allow <span class="kwd">in<span class="pln"> on <span class="highlight"><span class="pln">eth1<span class="pln"> to any port <span class="highlight"><span class="lit">3306
</span></span></span></span></span></span></span></span></code></pre>
<p>这将允许专用网络上的其他服务器连接到MySQL数据库。</p>
<h2 id="step-7-—-denying-connections">第7步 - 拒绝连接</h2>
<p>如果尚未更改传入连接的默认策略,则UFW配置为拒绝所有传入连接。 通常,这会通过要求您创建明确允许特定端口和IP地址的规则来简化创建安全防火墙策略的过程。</p>
<p>有时您会想要根据源IP地址或子网拒绝特定连接,但是,可能是因为您知道您的服务器正在受到攻击。 此外,如果要将默认传入策略更改为<strong>允许</strong> (不建议这样做),则需要为不希望允许连接的任何服务或IP地址创建<strong>拒绝</strong>规则。</p>
<p>要编写<strong>拒绝</strong>规则,您可以使用上述命令,将<strong>allow</strong>替换为<strong>deny</strong> 。</p>
<p>例如,要拒绝HTTP连接,可以使用以下命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw deny http</span></code></pre>
<p>或者,如果要拒绝来自<code>203.0.113.4</code>所有连接,可以使用此命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw deny <span class="kwd">from<span class="pln"> <span class="highlight"><span class="lit">203.0<span class="pun">.<span class="lit">113.4
</span></span></span></span></span></span></span></code></pre>
<p>现在让我们来看看如何删除规则。</p>
<h2 id="step-8-—-deleting-rules">第8步 - 删除规则</h2>
<p>了解如何删除防火墙规则与了解如何创建它们同样重要。 有两种方法可以指定要删除的规则:规则编号或规则本身。这与创建规则时的规则类似。 我们首先通过<strong>规则编号</strong>方法解释<strong>删除</strong> 。</p>
<h3 id="by-rule-number">按规则编号</h3>
<p>如果您使用规则编号删除防火墙规则,那么您要做的第一件事就是获取防火墙规则列表。 UFW <code>status</code>命令具有<code>numbered</code>选项,该选项显示每个规则旁边的数字:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw status numbered</span></code></pre>
<pre class="code-pre prettyprint prettyprinted"><code><label class="secondary-code-label" title="Output"><span class="typ">Output</span></label><span class="typ">Status<span class="pun">:<span class="pln"> active
<span class="typ">To<span class="pln"> <span class="typ">Action<span class="pln"> <span class="typ">From<span class="pln">
<span class="pun">--<span class="pln"> <span class="pun">------<span class="pln"> <span class="pun">----<span class="pln">
<span class="pun">[<span class="pln"> <span class="lit">1<span class="pun">]<span class="pln"> <span class="lit">22<span class="pln"> ALLOW IN <span class="lit">15.15<span class="pun">.<span class="lit">15.0<span class="pun">/<span class="lit">24<span class="pln">
<span class="pun">[<span class="pln"> <span class="lit">2<span class="pun">]<span class="pln"> <span class="lit">80<span class="pln"> ALLOW IN <span class="typ">Anywhere</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>如果我们决定要删除允许端口<code>80</code>上的HTTP连接的规则<code>2</code> ,我们可以在以下UFW <code>delete</code>命令中指定:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw <span class="kwd">delete<span class="pln"> <span class="highlight"><span class="lit">2
</span></span></span></span></span></code></pre>
<p>这将显示确认提示,您可以使用<code>y/n</code>回答。 输入<code>y</code>将删除规则<code>2</code> 。 请注意,如果启用了IPv6,则还需要删除相应的IPv6规则。</p>
<h3 id="by-actual-rule">按实际规则</h3>
<p>规则编号的替代方法是指定要删除的实际规则。 例如,如果要删除<code>allow http</code>规则,可以这样写:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw <span class="kwd">delete<span class="pln"> <span class="highlight"><span class="pln">allow http
</span></span></span></span></span></code></pre>
<p>您还可以使用<code>allow 80</code>而不是服务名称指定规则:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw <span class="kwd">delete<span class="pln"> <span class="highlight"><span class="pln">allow <span class="lit">80
</span></span></span></span></span></span></code></pre>
<p>此方法将删除IPv4和IPv6规则(如果存在)。</p>
<h2 id="step-9-—-checking-ufw-status-and-rules">第9步 - 检查UFW状态和规则</h2>
<p>您可以随时使用以下命令检查UFW的状态:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw status verbose</span></code></pre>
<p>如果禁用UFW,这是默认设置,您将看到如下内容:</p>
<pre class="code-pre prettyprint prettyprinted"><code><label class="secondary-code-label" title="Output"><span class="typ">Output</span></label><span class="typ">Status<span class="pun">:<span class="pln"> inactive</span></span></span></code></pre>
<p>如果UFW处于活动状态,如果您按照第3步进行操作,则输出将表明它处于活动状态并将列出您设置的所有规则。 例如,如果防火墙设置为允许来自任何地方的SSH(端口<code>22</code> )连接,则输出可能如下所示:</p>
<pre class="code-pre prettyprint prettyprinted"><code><label class="secondary-code-label" title="Output"><span class="typ">Output</span></label><span class="typ">Status<span class="pun">:<span class="pln"> active
<span class="typ">To<span class="pln"> <span class="typ">Action<span class="pln"> <span class="typ">From<span class="pln">
<span class="pun">--<span class="pln"> <span class="pun">------<span class="pln"> <span class="pun">----<span class="pln">
<span class="lit">22<span class="pun">/<span class="pln">tcp ALLOW IN <span class="typ">Anywhere</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>如果要检查UFW如何配置防火墙,请使用<code>status</code>命令。</p>
<h2 id="step-10-—-disabling-or-resetting-ufw-optional">第10步 - 禁用或重置UFW(可选)</h2>
<p>如果您决定不想使用UFW,可以使用以下命令禁用它:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw disable</span></code></pre>
<p>您使用UFW创建的任何规则将不再处于活动状态。 如果您需要稍后激活,可以随时运行<code>sudo ufw enable</code> 。</p>
<p>如果您已经配置了UFW规则但是您决定要重新开始,则可以使用reset命令:</p>
<pre class="code-pre command prettyprint prettyprinted"><code><span class="pln">sudo ufw reset</span></code></pre>
<p>这将禁用UFW并删除您之前定义的任何规则。 请注意,如果您在任何时候修改默认策略,默认策略都不会更改为原始设置。 这应该会让你重新开始使用UFW。</p>
<h2 id="conclusion">结论</h2>
<p>您的防火墙现在配置为允许(至少)SSH连接。 确保允许服务器需要的任何其他传入连接,同时限制不必要的连接。这将确保您的服务器既实用又安全。</p>
<p>要了解更常见的UFW配置,请查看有关UFW Essentials:通用防火墙规则和命令的本教程。</p>
</div>
<div id="MySignature" role="contentinfo">
他强由他强,清风拂山冈。他横任他横,明月照大江。<br><br>
来源:https://www.cnblogs.com/gucb/p/12880466.html
頁:
[1]