Networking
證明客戶端網路上的 DNS/網路問題
問題
大約 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 中的重定向配置更改為此答案中的建議