如何解决DigitalOcean防火墙问题

介绍

DigitalOcean Cloud防火墙通过根据一组可配置规则评估您的Droplet的流量来提高您的基础设施的安全性。 虽然DigitalOcean设计的防火墙是直观的,但多个网络策略的组合和与Droplet上活动的软件的交互有时会导致意想不到的结果。

在本指南中,我们将讨论收集有关您的网络策略的信息并解决DigitalOcean Cloud Firewall问题的策略。 我们将介绍如何查找您的活动防火墙以及如何查看适用于单个滴滴的全面规则。 我们还将讨论如何发现可能在Droplet上活动的基于主机的防火墙,以及如何减轻或解决冲突的策略。

在DigitalOcean控制面板中查找防火墙信息

诊断防火墙策略中的问题的第一步是了解正在应用哪些规则。 DigitalOcean控制面板包含有关各个防火墙的信息以及适用于每个Droplet的组合规则集。

显示有关所有防火墙的信息

要查看DigitalOcean控制面板中的所有防火墙,请单击主导航窗格中的网络项,然后选择防火墙子项:

DigitalOcean导航到防火墙

防火墙索引页面列出了有关每个防火墙的基本信息,如适用的“数滴”,其包含的规则数量以及创建时间的数量。

DigitalOcean防火墙索引

单击防火墙的名称将转到“防火墙详细信息”页面,您可以在其中查看策略的各个规则及其目标的“Droplet”:

DigitalOcean个人防火墙页面

查看每个防火墙应用的规则可以概述在整个基础架构上执行的网络策略的类型。

显示影响个别Droplet的防火墙策略

如果您对影响个别Droplet的政策感兴趣,则防火墙索引和详细信息页面不是最佳选择。 相反,请检查Droplet的详细页面。

从控制面板导航菜单主菜单中的Droplet项目中,单击Droplet的名称。 从那里,单击Droplet菜单中的网络:

DigitalOcean Droplet菜单

到页面底部,一个名为“ 防火墙”的部分列出了目标为“ 滴滴”的防火墙。 以下,每一个Droplet防火墙的策略都合并成一个综合表:

DigitalOcean组合规则集

这些入站和出站规则代表通过防火墙为Droplet所允许的所有流量。 如果您在应用防火墙策略后遇到连接到您的Droplet的问题,这是一个很好的选择。

显示基于主机的防火墙规则在舞台上生效

虽然DigitalOcean Cloud Firewall服务提供基于网络的防火墙解决方案,但许多管理员也可能在Droplet本身上拥有基于主机的防火墙。 热门的基于主机的防火墙包括IPTables,UFW和firewalld。 在排除连接问题时,重要的是检查这些可能会在Droplet级别上过滤流量的服务。

查找UFW防火墙设置

如果您的服务器运行UFW防火墙,则可以键入以下内容来查看当前的过滤规则:

sudo ufw status verbose
OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)

输出显示以下几点:

  • Status行表示防火墙正在积极地执行流量规则。
  • Default行表示传入策略是拒绝流量,传出策略是允许流量。
  • 底部的规则集表示在IPv4和IPv6地址都允许到端口22的传入连接。

如果您的DigitalOcean Cloud Firewall具有冲突的规则,您可以通过键入以下命令禁用UFW防火墙:

sudo ufw disable

如果您希望将UFW作为第二道防线,则应修改其规则以匹配DigitalOcean Cloud Firewall设置。 您可以通过遵循UFW Essentials:“通用防火墙规则和命令”指南来了解如何修改UFW规则。

查找防火墙防火墙设置

如果您的Droplet运行防火墙防火墙,您可以使用一系列检查来查看当前流量规则。

首先检查firewalld是否处于活动状态:

sudo firewall-cmd --state
Outputrunning

如果防火墙正在运行,请检查活动区域:

sudo firewall-cmd --get-active-zones
Outputpublic
  interfaces: eth0

如果firewalld具有活动区域,则表示它正在针对一组规则评估流量。 我们可以使用--info-zone选项显示与每个活动区域关联的端口和服务:

sudo firewall-cmd --info-zone=public 
Outputpublic (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports:
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules:

检查任何端口是否打开:

  • target :如果设置为DROP%%REJECT%% ,则所有流量将被拒绝,而不管其他设置如何。
  • ports值:这将列出通过防火墙显式允许的端口
  • services价值:这里列出允许通过的服务。 这些是可以作为一个单元允许的特定集合规则。

在这里,我们可以看到通过防火墙允许dhcpv6-clientssh服务。 我们可以通过键入以下内容来检查与这些服务关联的端口:

sudo firewall-cmd --permanent --get-ports --service=dhcpv6-client
sudo firewall-cmd --permanent --get-ports --service=ssh
Output546/udp
22/tcp

如果您的DigitalOcean Cloud Firewall具有冲突的规则,您可以通过键入以下命令来禁用防火墙防火墙:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

如果要将防火墙保持在第二道防线,则应修改其规则以匹配DigitalOcean Cloud Firewall设置。 您可以通过按照如何使用CentOS 7上的FirewallD设置防火墙来了解如何修改防火墙规则。

查找IPTables防火墙设置

如果您使用IPTables防火墙,可以键入以下内容来查看当前的IPv4过滤规则:

sudo iptables --line-numbers -vL
OutputChain INPUT (policy DROP 1 packets, 40 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
2      764 56512 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
3        9   540 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         


Chain OUTPUT (policy ACCEPT 374 packets, 97673 bytes)
num   pkts bytes target     prot opt in     out     source               destination

输出表示:

  • 传入和传出流量的默认policy (DROP为传入,ACCEPT为传出)
  • 默认策略的例外。 在这里,我们可以看到对端口22和80的传入TCP流量的免除(以及与本地接口的现有连接和流量相关的流量)

如果您对IPTables配置语法更加舒适,您可能会发现基于规则的视图更有帮助:

sudo iptables -S
Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

iptables命令只显示过滤IPv4流量的规则。 要显示IPv6过滤规则,请使用ip6tables而不是iptables重新运行上述命令。

如果您的DigitalOcean Cloud Firewall具有与您的IPTables防火墙冲突的规则,则可以键入以下命令来禁用IPTables防火墙:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
sudo ip6tables -P INPUT ACCEPT
sudo ip6tables -P OUTPUT ACCEPT
sudo ip6tables -P FORWARD ACCEPT
sudo ip6tables -F

如果您正在使用像iptables-persistent这样的服务,或者在引导时加载了一个脚本加载IPTables规则,那么您也可能需要禁用这些规则。

如果您希望将IPTables作为第二道防线,则应修改其规则以匹配DigitalOcean Cloud Firewall设置。 您可以通过遵循Iptables Essentials:常见防火墙规则和命令指南来了解如何修改IPTables规则。

查看正在运行的服务

如果您遇到连接问题,请验证您的Droplet上实际运行的服务是有用的。 有时服务可能会下降或负载过重,这可能会导致与封闭端口相同的症状。

在您的Droplet上,您可以键入以下内容查看当前绑定到端口的服务:

sudo netstat -plunt
OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13704/nginx -g daem
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1762/sshd       
tcp6       0      0 :::80                   :::*                    LISTEN      13704/nginx -g daem
tcp6       0      0 :::22                   :::*                    LISTEN      1762/sshd

检查Local Address部分中的端口号和接口是否符合预期的服务。 如果您的预期服务之一不在netstat输出中,则您的服务未运行。 这将导致连接尝试失败。

从外部来源评估连接性

收集有关DigitalOcean Cloud Firewall规则状态和任何基于主机的防火墙规则的信息对于了解预期的网络访问非常重要。 但是,通过测试来验证实际的流量过滤行为也很重要。

通过在外部主机上安装nmap工具,我们可以检查我们可以在我们的Droplet上连接哪些端口。 如果您具有基于始发主机限制访问权限的防火墙规则,则可能需要在多台计算机(允许的组和外部的计算机上)上安装nmap才能获得完整的映像。

注意:如果您只希望允许来自某些主机的连接, 则使用标签指定防火墙规则将使管理和测试显着简化。 您可以在单个测试Droplet上安装nmap ,然后从该服务器添加或删除标签,以更改哪些规则与连接请求匹配。

有关使用nmap扫描主机的更完整信息,请参阅如何使用Nmap和Tcpdump测试防火墙配置的指南

安装Nmap

要开始,您将需要在不是您要扫描的基础架构的一部分的Droplet上安装nmap

要在Ubuntu或Debian测试Droplet上安装nmap ,请键入:

sudo apt-get update
sudo apt-get install nmap

要在CentOS测试Droplet上安装nmap ,请键入:

sudo yum install nmap

您现在应该可以检查目标基础架构。

扫描TCP端口

安装扫描仪后,您可以通过键入以下内容扫描打开的TCP端口:

sudo nmap -sS -Pn -p- -T4 -vv --reason Droplet_IP_address

扫描将尝试与目标Droplet上每个端口的SYN TCP连接。 如果要限制扫描端口的数量以加快扫描速度,则可以替换-p-选项与范围或序列的端口:

sudo nmap -sS -Pn -p 1-5000 -T4 -vv --reason Droplet_IP_address

如果您完全删除-p选项, nmap将扫描1000个最常用的端口,当您有限的时间或只对普通服务端口的状态感兴趣时,这是很好的:

sudo nmap -sS -Pn -T4 -vv --reason Droplet_IP_address

如果您有根据来源限制流量的规则,请确保从应该允许连接的主机针对目标基础设施运行此测试,并从连接被拒绝的主机重新启动。

扫描UDP端口

因为UDP是无连接协议,所以使用UDP进行扫描比TCP扫描显着更容易出错,耗时大。 由于Cloud Firewalls通过静默地丢弃违规数据包来阻止流量,因此通过端口扫描来区分打开的和过滤的UDP端口是困难或不可能的。

这在大多数情况下都是有益的,因为它使外界更难了解您的基础架构上运行的服务。 但是,这干扰您审核UDP防火墙规则的能力,因此无法为此可靠地使用。

在我们关于使用nmap和tcpdump测试防火墙文章中,您可以阅读有关UDP扫描的局限性

一般故障排除信息

到目前为止,我们已经演示了如何收集有关您的网络策略的信息并进行审核。 如果您仍然无法跟踪问题的根源,本节中的某些信息可能会有所帮助。

DigitalOcean云防火墙阻塞的连接将超时

尝试连接到服务器时收到的消息通常包含有关您遇到的问题的来源或类型的有价值的信息。 根据您正在使用的客户端类型,确切的面向用户的消息可能会有所不同。 例如,SSH客户端将具有与Web浏览器不同的故障消息,而Web浏览器将各自拥有自己的消息传递风格。

当DigitalOcean Cloud Firewalls过滤流量时,会丢弃不符合任何异常规则的数据包。 最终,尝试重复失败后,客户端连接通常会超时。 如果您在尝试连接到您的Droplet时看到连接超时消息,则可能是由您的DigitalOcean Cloud Firewalls规则引起的。

请记住,许多其他类型的场景也可能导致连接超时。 例如,许多基于主机的防火墙也通过丢弃数据包进行过滤。 这也是您尝试访问的服务不运行或服务器本身已经停机的状态。 如果连接被路由组件重定向不正确,这也可能是响应。

如果您看到超时错误,您的“云端防火墙”策略可能是负责任的。 仔细检查您的规则,以确保允许适当的入站和出站流量。

如果您立即收到不是超时的错误消息,则该请求被除了防火墙之外的其他东西阻止。 以下某些信息属于此类别:

  • 拒绝连接
  • 目的地不可达
  • 端口不可达
  • 主机不可达
  • 净不可达
  • 协议不可达
  • 净禁止
  • 主持人被禁止
  • 管理员禁止
  • 没有路线
  • 地址不可达
  • TCP重置

这些都是连接被其他软件拒绝的指示器。 例如,大多数基于主机的防火墙包括一个拒绝具有ICMP拒绝消息的流量的选项,而不是静默地丢弃数据包。 接收这些消息的客户端可以立即出错,而不是重试,直到达到超时限制。

DigitalOcean Cloud Firewall不会发送拒绝信息,所以如果你看到一个,这意味着你的请求被阻止在其他地方。

DigitalOcean Cloud防火墙规则是附加的

DigitalOcean Cloud Firewall将所有流量都作为一项政策。 要允许流量通过,您必须通过添加规则来定义异常。

因为所有规则都是默认的丢弃策略的例外,所以规则集完全是加法的。 这意味着一旦你允许一个规则中的流量,就不可能在另一个规则中将其锁定。

当多个规则适用于连接时,这可能会导致意外的结果,特别是如果它们来自单独的云端防火墙。 如果连接符合任何规则,则可以通过防火墙。 您可以通过查看Droplet详细信息页面上的“ 网络”部分来查看应用于您的Droplet的聚合规则。

按源或目的地限制连接需要静态IP地址

云防火墙能够根据目的地IP地址,根据源IP地址和出站流量来限制入站流量。 当第二方是具有静态IP地址的另一台服务器时,这样做很好。

但是,如果您尝试使用此功能来限制与家庭连接的连接,可能会遇到麻烦。 许多互联网服务提供商随着时间推移轮换客户IP地 这意味着虽然限制与您的家庭IP地址的连接的规则可能现在可以工作,但可能会在将来停止工作。

如果您具有限制连接的Cloud Firewall规则,请记住这一点。 如果地址或网络范围不稳定,规则将无法正常工作。

应用程序有时需要额外的网络访问

重要的是要记住,一些应用程序和服务需要比常规监听端口更广泛的网络访问。 不考虑这些情况可能导致难以调试的问题。

一些可能不会立即显现的额外所需网络访问的示例:

  • DigitalOcean监控代理 :Dig​​italOcean监控代理需要端口80和443上的出站 TCP访问才能向监控服务进行身份验证并发送指标。 如果您限制这些端口上的出站流量,DigitalOcean Monitoring将不再工作。
  • DNS查找 :许多应用程序需要DNS访问才能正常工作。 阻止出站DNS(TCP和UDP端口53)可能导致许多难以诊断的问题。
  • 服务协调 :许多应用程序使用其他端口与其他服务器协调或接受特殊类型的流量。 例如,数据库使用指定的端口进行集群或复制。

不考虑这些附加要求可能会导致问题,因此请务必使用sudo netstat -plunt检查您的服务正在使用哪些端口。

结论

在本指南中,我们介绍了如何查找有关您的DigitalOcean Cloud Firewall设置的信息,如何检查您的Droplet上是否存在冲突规则,以及如何从外部位置审核连接。 我们还讨论了设计或故障排除网络连接时要注意的一些重要信息。

虽然DigitalOcean Cloud Firewall设计简单易用,但是管理网络访问可能很困难。 学习如何诊断问题可以帮助您识别连接问题的原因。 为了避免防火墙的一些常见问题,请考虑采用“ 指南中 。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏