检测使用 SSH 隧道到 https 的重定向?

检测使用 SSH 隧道到 https 的重定向?

我想使用代理通过 VPS 将我的家庭服务器重定向到互联网。

对于普通的 http,它确实有效,并使用安装在 VPS 上的“my.example.com”证书自动重定向到 https。只要我激活以下连接,流量就会通过 SSH 隧道传输到 VPS,VPS 通过 https 提供内容:本地计算机的 IP 为 192.168.1.123,http 端口为 8080。

ssh -R 81:192.168.1.123:8080 root@myvps

它使用 VPS 上的端口 81 来代理我本地服务器的端口 8080。VPS 会自动将所有流量重定向到 https 端口 443。

VPS 上的 ssl.conf 部分如下:

VirtualHost *:443>
    SSLEngine on
    DocumentRoot /var/www/html/test/
    ServerName my.example.com
    LogLevel Debug

    ErrorLog ${APACHE_LOG_DIR}/openims-error.log
    CustomLog ${APACHE_LOG_DIR}/openims.log combined

    SSLCertificateFile      /root/.acme.sh/my.example.com/fullchain.cer
    SSLCertificateKeyFile /root/.acme.sh/my.example.com/my.example.com.key

      SSLProxyEngine On
      ProxyRequests Off
      ProxyPass / http://localhost:81/
      ProxyPassReverse / http://localhost:81/

    #  RewriteCond %{HTTPS} off
    #  RewriteRule (.*) https://%{SERVER_NAME}$1 [R,L]
</VirtualHost>

来自 VPS 端口 443 的请求被代理到 localhost:81(在 VPS 上),而后者又代理到本地服务器 192.168.1.123:8080。

这很好。但是当本地服务器在其 httpd.conf 中针对室内地址有 https 重定向时:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond expr "-R '192.168.0.0/16'" [OR]
RewriteCond expr "-R '10.0.0.0/8'" [OR]
RewriteCond expr "-R '127.0.0.0/24'"
RewriteRule (.*) https://%{SERVER_NAME}:8443$1 [R,L]

它仍然重定向到 localhost:8443。在本地服务器的 apache 中,access_log我看到请求的 IP 就是我上网的这台电脑https://my.example.com(VPS)。本地服务器似乎不知道它是代理的。

如何在 Apache 配置中添加条件,即请求作为来自 VPS 的代理发出?

答案1

我得到了一个“解决方案”:HTTP_HOST 有端口 81,因为它通过 ssh 隧道从前端服务器 (VPS) 转发到端口 81。这是httpd.conf我本地服务器上的部分:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !:81$
RewriteCond expr "-R '192.168.0.0/16'" [OR]
RewriteCond expr "-R '10.0.0.0/8'" [OR]
RewriteCond expr "-R '127.0.0.0/24'"
RewriteRule (.*) https://%{SERVER_NAME}:8443$1 [R,

这说明当 HTTP_HOST 以 :81 结尾时,它来自前端服务器,因此它不应重定向到 https,而当它是来自浏览器的直接请求时,它末尾没有 :81,因此它会重定向。

我首先尝试在空的 HTTP_X_FORWARDED_FOR 上进行测试,在这种情况下,它直接在后端服务器上,而当它从前端服务器(VPS)重定向时,它包含后端服务器的室外 IP 地址(我的家庭 IP 地址)。因此,只有当它为空时,它才应该重定向。我添加了,RewriteCond %{HTTP_X_FORWARDED_FOR} ^$但据推测它总是匹配的。那么非空的 HTTP_X_FORWARDED_FOR 确实匹配 ^$,就好像它是空的一样?

我究竟做错了什么 ?

相关内容