我有一个Apache2.4.18服务器运行在多个vhost上。
/etc/apache2/sites启用/000-default.conf:
<VirtualHost *:80>
DocumentRoot /var/www/html
Redirect 400 /
</VirtualHost>/etc/apache2/sites-enabled/000-default-ssl.conf:
<VirtualHost _default_:443>
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>/etc/apache2/sites启用/001-custom.conf:
<VirtualHost _default_:443>
ServerName www.example.org
Include /etc/apache2/letsencrypt/main.conf
SSLCertificateFile /etc/letsencrypt/live/example.org/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem
Include /etc/apache2/proxytunnel/main.conf
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.org
Redirect permanent / https://www.example.org/
</VirtualHost>/etc/apache2/proxy隧道/main.conf:
ProxyRequests On
AllowConnect 2222
<Proxy *>
Order deny,allow
Deny from all
</Proxy>
<Proxy 127.0.0.1>
Order deny,allow
Allow from all
</Proxy>我还在同一台计算机的端口2222上运行了一个运行的SSH服务器。
如果我使用来自远程计算机的proxy隧道通过SSL访问SSH服务器,则使用apache作为代理服务器:
proxytunnel -v -E -p www.example.org:443 -d 127.0.0.1:2222我得到以下错误:
SSL client to proxy enabled
Local proxy www.example.org resolves to xxx.xxx.xxx.xxx
Connected to www.example.org:443 (local proxy)
Tunneling to 127.0.0.1:2222 (destination)
Communication with local proxy:
-> CONNECT 127.0.0.1:2222 HTTP/1.1
-> Host: 127.0.0.1:2222
-> Proxy-Connection: Keep-Alive
<- HTTP/1.1 405 Method Not Allowed
HTTP return code: 405 Method Not Allowed
<- Date: Thu, 14 Apr 2016 00:55:57 GMT
<- Server: Apache/2.4.18 (Debian)
<- Allow: GET,HEAD,POST,OPTIONS
<- Content-Length: 309
<- Content-Type: text/html; charset=iso-8859-1但是如果我把文件/etc/apache2/proxytunnel/main.conf包含在我的/etc/apache2/sites-enabled/000-default-ssl.conf vhost中,它就能工作.
SSL client to proxy enabled
Local proxy www.example.org resolves to xxx.xxx.xxx.xxx
Connected to www.example.org:443 (local proxy)
Tunneling to 127.0.0.1:2222 (destination)
Communication with local proxy:
-> CONNECT 127.0.0.1:2222 HTTP/1.1
-> Host: 127.0.0.1:2222
-> Proxy-Connection: Keep-Alive
<- HTTP/1.0 200 Connection Established
<- Proxy-agent: Apache/2.4.18 (Debian)
Tunnel established.
SSH-2.0-OpenSSH_7.2p2 Debian-2因此,我的结论是,要使连接请求通过SSL通过apache服务器工作,除了发出实际的vhost之外,还必须将AllowCONNECT指令放在apache代理端口的默认vhost中。
请注意,当使用(而不是HTTPS)时,该行为不会被再现,并且在proxy隧道中禁用加密。而且,由于请求被正确地转发到apache并存在于服务器日志中,所以这个问题并不来自vhost隧道:是apache主动拒绝它,因为它认为此服务器上的HTTP方法(CONNECT)无效(尽管它在所关心的vhost中是允许的)。
发布于 2016-04-15 09:48:28
而且,由于请求被正确地转发给apache,并且在服务器日志中存在,所以这个问题不是来自problem隧道。
这是错误的,proxy隧道在我使用的版本中不支持SNI (在本文发布之日,来自他们存储库的最近提交,所以如果我信任他们的发布标签,那么稍微领先于1.9.1 )。
其结果是,apache选择的vhost是默认的vhost,无论我试图连接到哪个主机。
发布于 2018-06-04 11:41:59
我想通过对我自己的经验提供反馈来补充这个问题。我还不能发表评论。
我在Windows 7上使用Proxy隧道1.9.9 (大约2018年4月),这是我从使用Cygwin 32位的源代码编译的。
从我的测试中,我发现Proxy隧道与-p参数中的ServerName与Apache2 Virtualhost中的主机名不正确匹配。除非包含AllowCONNECT方法的虚拟主机是默认的Virtualhost,否则使用proxy隧道通过一个http或https本地代理将失败。
列出在Apache中启用的Virtualhost,并查看哪一个是默认的:
apachectl -S在我的设置中,每个虚拟主机都在自己的站点可用目录中的文件中。运行以下命令:
ls -1站点可用目录中列出的第一个文件是apache2将成为默认虚拟主机的虚拟主机。通过这种方式,我将我的http (或https)转发代理交换为默认的、第二行的虚拟主机.通过更改其名称,使其不会首先出现在目录列表中。
我发现这个用于http本地代理的命令:
proxytunnel -v -p http-forward-proxy.com:80 -d 192.168.0.10:22或https本地代理的以下命令:
proxytunnel -v -E -C root.pem https-forward-proxy.com:443 -d 192.168.0.10:22如果OpenSSH方法位于默认的Virtualhost中,则给出AllowCONNECT横幅,但如果它不是.即使非默认端口80虚拟主机包含:
ServerName http-forward-proxy.com或者在向https转发代理进行代理的情况下,当非默认端口443虚拟主机包含:
ServerName https-forward-proxy.com我查看了Apache2日志,确认的处理总是进入默认的虚拟主机。
我还在Proxy隧道GitHub页面https://github.com/proxytunnel/proxytunnel/issues/31上发布了一个关于HTTP的“问题”
然而,
我在sslh和stunnel服务器端使用Proxy隧道客户端。在这个场景中,我发现Proxy隧道命令中的主机名与sslh中的sni_hostnames{}特性匹配,因此在这种情况下,主机名似乎确实正确传输,至少在加密和使用SNI时是这样。
发布于 2018-06-07 02:42:25
谢谢你的提问和你的结论。多亏了你,我现在有了一个工作装置!使用apache默认的vhost运行得很好。
不过,我想知道Proxy隧道的SNI是否真的是问题所在。在我的例子中,我有https://app1.example.com,它是apache的默认vhost,还有另一个vhost https://example.com。我的letsencrypt有一个通用名称app1.example.com,主题名是example.com。
如果我将ProxyRequests on添加到example.com中,它就没有任何效果。如果我把它移到app1.example.com,它就能正常工作。
我的理解是,对于多个vhost来说,一个ip上的一个证书不需要SNI。
此外,我在测试中使用curl,就像在curl -v -x https://example.com https://somethingelse.com中一样。Curl支持SNI,我使用wireshark进行了检查:它在握手扩展中为CONNECT请求和GET请求发送正确的主机名。我还是得到了405 Method Not Allowed。
因此,问题似乎在于mod_proxy没有被正确激活。你认为如何?
我在阿帕奇2.4.25。
https://serverfault.com/questions/770185
复制相似问题