第一的

第一的

我可以使用以下命令检查端口是否打开,但这并不能告诉我该端口是否仅在运行的机器(主机)上可访问,是否仅从 LAN 可访问,或者是否向 Internet 开放。

netstat -aon | findstr 8877
TCP    [::]:8877    [::]:0    LISTENING    160352

特别是,对于给定的端口,我感兴趣的是了解:

  • 如果端口已打开并正在监听(上述命令足以达到此目的);
  • LAN 上的其他计算机是否可以访问该端口? 如果不能,是什么阻止了它? (例如,它是否被主机的防火墙阻止了?)
  • 互联网上的其他计算机是否可以访问该端口? 如果不能,是什么阻止了它? (例如,它是否被路由器的防火墙阻止了?)

背景

通常,为了找到这些问题的答案,我会花几个小时检查不同的防火墙和访问策略。由于涉及不同类型的第三方防火墙和不同类型的路由器,这成为一项耗时的任务。理想情况下,内置的 Linux、Mac 或 Windows 命令或可以遍历网络并识别端口连接被阻止位置的第三方工具将非常有用。

答案1

从主机本身,您无法可靠地检查外部防火墙或安全规则是否阻止访问。

此外,外部检查无法轻易区分服务器本身或网络防火墙/ACL 阻止访问。

一般需要做一些更全面的调试。

但系统性方法往往可以避免 “花费数小时检查不同的防火墙和访问策略”尽管。

如果你有条不紊,你应该能够快速找出更准确的原因。不可否认的是,当存在多层安全保护且你无法访问完整的安全基础设施时,解决问题仍然会很耗时。

第一的

当你自己的工作站完全被锁定时,能够访问内部测试系统/服务器例如,您可以在其中运行数据包捕获和其他调试工具,例如端口扫描器。

要调试服务的互联网访问,类似外部测试系统 至关重要。您自己的公司网络通常即使不是完全值得信赖的来源,至少也不会被视为敌对。我经常使用我的手机(作为第二台笔记本电脑的热点)和便宜的 VPS 来实现这一点。

您能复制该问题吗?或者连接问题是否特定于客户端?

尽量避免调试聚乙二醇单乙基己基丙烯酸酯以及其他错误级别的问题。请注意,即使是其他方面能力较强的用户也可能制作不完整的错误报告和/或包含错误使用术语的报告,从而将您引向错误的方向。

您应该大致了解您的基础设施和网络设计以及有问题的客户端和服务器/服务的功能。(例如,您是否需要考虑 IPv4 NAT 构造、分层企业防火墙、DMZ、VPN 互连、云提供商和安全组、用于集成收购公司 XYZ 的双 NAT(仍使用重叠的 RFC 1918 网络范围)、水平分割 DNS、负载平衡器和反向代理服务器、普通代理服务器等。)

在服务器上启动数据包捕获

服务器上的数据包捕获将看到所有传入数据包。当没有服务在端口上侦听时,仍会收到传入数据包。无论基于主机的防火墙是否处于活动状态,数据包捕获都会显示数据包它们会被基于主机的防火墙处理,也可能会被拒绝。Linux
参考这里或 Windows这里

  • 合适的数据包捕获工具/命令取决于操作系统,且各不相同。
    例如,在 Linux 上启动低级tcpdump数据包捕获(使用附加标志选择正确的接口/IP 地址并减少输出)

然后尝试从远程测试系统连接到您的服务器或运行端口扫描。

例如,要测试 Web 服务器,请使用以下命令发出 Web 请求curl -v http://name-or-IP-of-server

当没有外部 ACL/防火墙阻止请求时,您可以看到类似以下内容:

    tcpdump -n port 80  
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

    15:33:49.255233 IP 10.131.160.119.56176 > 10.171.2.119.http: Flags [S], seq 805155927, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 251872860 ecr 0,sackOK,eol], length 0
    15:33:49.255390 IP 10.171.2.119.http > 10.131.160.119.56176: Flags [S.], seq 2225282760, ack 805155928, win 28960, options [mss 1460,sackOK,TS val 448523422 ecr 251872860,nop,wscale 7], length 0
    15:33:49.267951 IP 10.131.160.119.56176 > 10.171.2.119.http: Flags [.], ack 1, win 2058, options [nop,nop,TS val 251872873 ecr 448523422], length 0
    15:33:49.269340 IP 10.131.160.119.56176 > 10.171.2.119.http: Flags [P.], seq 1:129, ack 1, win 2058, options [nop,nop,TS val 251872873 ecr 448523422], length 128: HTTP: GET / HTTP/1.1

初步结论是客户端和服务器之间的某处没有出现访问阻塞的情况,需要对服务器进行进一步的调查。

当您没有看到任何数据包到达时:问题就出在您的网络的其他地方。

收到数据包时:检查服务器健康状况

当服务器上没有任何内容在监听时,您无法从任何客户端建立连接。

通常情况下,我希望监控能够针对发生故障的服务发送警报,但绝不能仅仅依靠假设。因此,请验证:

  1. 服务已启动并正在运行

    • 检查服务是否正在运行并能够在系统启动时启动。

    • 合适的检查命令取决于操作系统,并且会有所不同。在现代 Linux 发行版中,例如,您可以使用systemctl或更通用的ps
      要查看我的 Web 服务器是否正在运行,我会使用sudo systemctl status httpd并检查包含以下内容的输出,例如 “httpd.service;已启用”“活动:自...以来一直处于活动(运行)状态”

  • 在某些情况下,可能需要运行其他服务。您可能需要对这些服务重复相同的检查。例如,只有当 portmap 守护程序启动并运行时,才能找到像传统 NFS 这样的 RPC 服务。
  1. 服务监听正确的接口/IP 地址即客户将要使用的。

    • 检查服务是否不只绑定到本地主机(IPv4127.0.0.1和/或 IPv6[::1]或环回接口的名称)。

    • 检查服务是否绑定到正确的 IPv4 和/或 IPv6 地址。这可以是any客户端预期使用的特定接口/IP 地址。

    • 合适的检查命令取决于操作系统,且各不相同。
      许多操作系统都支持某种形式的检查netstat。在现代 Linux 发行版中,您可以使用ss。例如sudo netstat -tnlp& sudo ss -tnlp

       sudo netstat -tnlp 
      
       Active Internet connections (only servers)
       Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
       tcp6       0      0 :::80                   :::*                    LISTEN      896/httpd
      
  2. 服务响应迅速在客户端将要使用的接口/IP 地址上。
    您应该避免在调试时遇到“灯亮着,但没人在家”设想。

    • 合适的检查命令取决于操作系统,并根据您正在调试的服务而有所不同。不要只调试,localhost尤其要调试服务器的外部 IP 地址/主机名。
      要查看我的 Web 服务器是否正在运行,我会使用curl -vv http://hostnamecurl -kvv https://localhost和,但 venerabletelnet在许多情况下都很有用,就像openssl s_client -connect ip:portTLS 服务一样。

收到数据包时:检查服务器上的基于主机的防火墙

无论如何,当您登录时:通常可以快速轻松地检查是否存在活动基于主机的防火墙。

具体方法再次取决于操作系统和安装的软件,但有一些示例:

  • 对于 Linux 合适的命令是

    • [sudo] iptables -L -v -n --line-numbers 如果基于经典 netfilter 主机的防火墙处于活动状态且已配置,则将显示规则
    • [sudo] nft list ruleset当你的系统可能(也)正在使用较新的基于 nftables 的防火墙时,将显示规则
    • 为了完整性:[sudo] ipchains -L必须在真正的遗留系统上使用。
  • 对于 Windows

    • 例如,可以使用图形工具和命令检查 Windows Defender 防火墙的状态netsh advfirewall show allprofiles state

当防火墙处于活动状态且配置正确且规则简单时,您可能能够立即发现有问题的规则并解决它们。否则,您可能需要花费更多时间和精力。

我在这里描述了我在 Linux 上的方法:调试 iptables 和常见的防火墙陷阱?

当没有收到数据包时:流量在其他地方被阻止。

测试系统上看到的确切错误消息可能非常重要:

curl -v http://host.example.com

*   Trying 10.171.2.119:80...
* Failed to connect to host.example.com port 80 after 17485 ms: Operation timed out
* Closing connection 0

相对

curl -v http://host.example.com

*   Trying 10.171.2.119:80...
* Failed to connect to host.example.com port 80 after 17 ms: Connection refused
* Closing connection 0

第一种是防火墙(悄无声息地)丢弃不允许的流量的典型结果。这种防火墙配置似乎是安全倡导者所偏爱的。调试起来很麻烦。

第二个是防火墙阻止并拒绝使用适当ICMP 协议错误消息。这种防火墙配置对我作为管理员很有帮助。

(注意:我们已经排除了导致“连接被拒绝”错误的另一个常见原因,即当端口打开但未配置和激活任何侦听器时,服务器会生成该错误。这通常会触发 TCP 重置 RST 响应。)

捕获“连接被拒绝”ICMP 消息

您需要在测试系统上运行数据包捕获,同时尝试连接服务器。

tcpdump -n icmp

IP 10.171.2.1 > 192.168.178.22: ICMP host 10.171.2.119 unreachable - admin prohibited, length 72

源 10.171.2.1 发送了连接拒绝消息,这是一个非常明确的“管理员禁止” 这就是首先需要调查的防火墙。

捕获“连接被拒绝” TCP 重置消息

您需要在测试系统上运行数据包捕获,同时尝试连接服务器。

tcpdump -n -v 'tcp[tcpflags] & (tcp-rst) != 0'

IP (tos 0x0, ttl 57, id 9273, offset 0, flags [DF], proto TCP (6), length 40)
    10.171.2.1.80 > 192.168.178.22.57231: Flags [R.], cksum 0xe3a0 (correct), seq 0, ack 4064031175, win 0, length 0

当一切都失败时

您需要在基础设施的不同位置运行数据包捕获,直到发现数据包在何处被停止。

答案2

我会使用类似 wireshark 或 nmap 之类的工具,就互联网而言,你需要在路由器中使用 portforward 端口 8877 到你的服务器 IP 地址

答案3

使用 nmap、netstat 和 tracert 等工具。

Netstat 会共享其所在机器的本地开放端口状态。Tracert 是穿越网络的跟踪路由,共享 IP 和端口是否可访问。Nmap 是一款瑞士军用工具,可用于测试端口状态。

相关内容