证明客户端网络上的 DNS/网络问题

证明客户端网络上的 DNS/网络问题

问题

大约 150 个服务器客户端(位于不同位置,具有不同的网络设置)中,有 1 个未通过我的 Apache 服务重定向。我需要知道问题出在哪里,但无法找出原因。

所有客户端访问虚拟主机并向代理发送相同的请求:

  <VirtualHost *:80>
  ServerName update.***.tld
  ServerAdmin [email protected]

  CustomLog /var/log/apache2/update.***.tld_access.log combined
  ErrorLog  /var/log/apache2/update.***.tld_error.log

  # redirect all http request to https
  RewriteEngine on
  Options +FollowSymLinks
  RewriteCond %{SERVER_PORT} !^443$
  RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
  </VirtualHost>

  <VirtualHost *:443>
  ServerName update.***.tld

  LogLevel warn
  SSLEngine on
  SSLCertificateFile /etc/ssl/certs/wildcard.***.tld.cert
  SSLCertificateKeyFile /etc/ssl/private/wildcard.***.tld.key
  SSLCertificateChainFile /etc/ssl/certs/wildcard.***.tld.combined.cert

  CustomLog /var/log/apache2/update.***.tld_access.log combined
  ErrorLog  /var/log/apache2/update.***.tld_error.log

  TimeOut 3600
  KeepAlive On

  AddDefaultCharset UTF-8

  SSLProxyEngine on
  ProxyPreserveHost Off
  SetEnv force-proxy-request-1.0 1
  SetEnv proxy-nokeepalive 1
  ProxyTimeout 15

  ProxyRequests Off
  ProxyPass /         https://***-***-prod.aws.tld/
  ProxyPassReverse /  https://***-***-prod-prod.aws.tld/

  <Proxy *>
     AddDefaultCharset UTF-8
     Require all granted
  </Proxy>
  </VirtualHost>

调试

  • 将客户端更改为使用 Google DNS 服务器的静态 IP 设置
  • 检查日志文件
    • 似乎来自该特殊客户端的所有请求均未正确重定向
    • 来自该客户端的请求记录在 default_access.log 中,并且没有到达我的自定义日志,所以我猜测转发不起作用,但是为什么其他 150 个客户端却不起作用呢?
    • 默认访问日志:clientipaddress - - [23/Jul/2020:20:23:17 +0200] "GET /api/agent/ping HTTP/1.1" 400 301 "-" "-"
    • 当我从客户端向端口 443 上的代理发送 wget 时,它会被正确转发到虚拟主机并记录在我的自定义日志中
    • 我检查了 tcpdump,发现客户端尝试使用正确的端口(443)发送到正确的服务器

损坏的客户端上的 tcpdump:

tcpdump -i eth0 -vvv host update.***.tld  > dump

https://gist.github.com/herz0g/e02ef883688c904667164a175955ecc0

结论

我猜测这是客户端网络的问题,否则它将无法为其他 150 个客户端工作,但我不确定如何证明这一点或者可以进一步调试什么。

答案1

您实际上部分回答了您自己的问题:

当我从客户端向端口 443 上的代理发送 wget 时,它会被正确转发到虚拟主机并记录在我的自定义日志中

您遇到的问题是由于您依赖于明确的端口号,而这种情况并不常见,因此 Apache 重定向不正确。

重写条件 %{SERVER_PORT} !^443$

这表明客户端在 API 调用的 URI 中没有端口号,并且当不存在时它会失败。

尝试将 Apache 中的重定向配置更改为此处的建议回答

答案2

正如 @PatrickMevzek 所说,这不是网络或 DNS 问题。我检查了启用了调试级别的日志,并注意到此错误:

[Fri Jul 24 12:33:11.463639 2020] [ssl:info] [pid 9792:tid 139651482162944] [client clientip:26294] AH01964: Connection to child 441 established (server default.virtual.host:443)
[Fri Jul 24 12:33:11.463917 2020] [ssl:debug] [pid 9792:tid 139651482162944] ssl_engine_kernel.c(2096): [client clientip:26294] AH02043: SSL virtual host for servername update.***.tld found
[Fri Jul 24 12:33:11.612839 2020] [core:debug] [pid 9792:tid 139651482162944] protocol.c(1158): [client clientip:26294] AH02427: Request header value is malformed: TOKEN ******\r
[Fri Jul 24 12:33:11.612873 2020] [core:debug] [pid 9792:tid 139651482162944] protocol.c(1318): [client clientip:26294] AH00567: request failed: error reading the headers

似乎我的客户端配置文件因某种原因被搞砸了,但文件内的内容与我的其他代理相同,而且权限和所有者也正确。我删除了该文件并创建了一个新文件。现在一切都正常了。

感谢您为我指明正确的方向。

相关内容