Networking

證明客戶端網路上的 DNS/網路問題

  • July 25, 2020

問題

大約 150 個伺服器客戶端中的 1 個(位於不同位置並具有不同的網路設置)未通過我的 apache 服務重定向。我需要知道問題出在哪裡,但無法弄清楚。

所有客戶端都訪問一個虛擬主機並向代理髮送相同的請求:

 <VirtualHost *:80>
 ServerName update.***.tld
 ServerAdmin mail@company.tld

 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 “-” “-”
    • 當我將 wget 從客戶端發送到埠 443 上的代理時,它會正確轉發到虛擬主機並登錄我的自定義日誌
    • 我檢查了 tcpdump 並註意到客戶端嘗試使用正確的埠(443)發送到正確的伺服器

損壞客戶端上的 tcpdump:

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

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

結論

我想這是客戶端網路上的問題,否則它不適用於 150 個其他客戶端,但我不確定如何證明這一點或可以進一步調試什麼。

正如@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

似乎我在客戶端上的配置文件因任何原因被搞砸了,但文件中的內容與我的其他代理一樣,權利和所有者也是正確的。我刪除了文件並創建了一個新文件。現在一切正常。

感謝您為我指明正確的方向。

您實際上部分回答了您自己的問題:

當我將 wget 從客戶端發送到埠 443 上的代理時,它會正確轉發到虛擬主機並登錄我的自定義日誌

不正確的 Apache 重定向是您遇到的問題,因為您依賴顯式埠號,這並不常見。

RewriteCond %{SERVER_PORT} !^443$

這表明客戶端在 API 呼叫的 URI 中沒有埠號,並且當它不存在時它會失敗。

嘗試將 Apache 中的重定向配置更改為此答案中的建議

引用自:https://serverfault.com/questions/1026492