我似乎在尝试从我的 Ubuntu 主机(最终将被部署到异地,这就是我使用 VM 进行测试的原因)在 VirtualBox VM 中本地运行特定的服务器应用程序时遇到了麻烦——提供主机转到 Web 浏览器并转到https://localhost/
服务器的 Web 门户的能力。
(主机 Ubuntu 18.04,客户机 CentOS 7 在 VirtualBox 中使用 NAT + 端口转发,SSH 端口 2200 -> 22 和端口 443 -> 443 上的 Web 内容)
SSH 通过这个端口转发从 2200 -> guest 22 正常工作,所以我知道 NAT 端口转发配置之外没有问题。
问题似乎是端口 443 与 VirtualBox > 网络 > 端口转发中的端口相同。
我认为系统不允许我转发到“低端口号”443。因为任何低于 1024 的端口或某些东西都无法正确分配,所以我需要一种方法来覆盖它,但到目前为止,解决方法都没有成功。
我确实成功地转发到主机上的更高端口号(例如 4430 而不是 443) - 我能够让服务器门户页面弹出到我的主机 Web 浏览器上。但是,然后尝试导航到 Web 门户中的其他页面时,每次导航到新 URL 时,它都会“撤消”更高的端口分配,并且服务器会指示客户端再次使用443
,因此失败。
仍在寻找诸如authbind
和之类的解决方法setcap
,但我最初尝试通过专门分配给 VirtualBox(/usr/bin/virtualbox
)尚未成功。
仅供参考,我目前无法更改服务器端软件(只能在 443 上获取其输出并以某种方式将其映射到我的主机上并能够使用 Web 浏览器访问它)。
答案1
我在主机上设置了一个 Apache2 代理守护程序,该守护程序在启用 SSL 的情况:443
下代理端口上的流量:4430
(需要与在本地运行的 VirtualBox VM(CentOS 服务器)上运行的 SSL 服务器通信)
诀窍在于 VM 服务器需要通过该端口使用 https,而大多数在线答案仅处理没有 SSL 身份验证的 HTTP。以下方法考虑了 Apache2 代理中的 SSL!
VirtualBox 网络配置
确保在 VirtualBox 配置 > 网络 > NAT > 端口转发中具有以下配置:
Protocol TCP
Host IP 127.0.0.1
Host Port 4430
Guest IP 10.0.2.15
Guest Port 443
因此,当 VM 监听 4430 上的主机时,现在的挑战是允许localhost:443
主机上的浏览器请求代理到 --> VM:4430。(反之亦然)
这意味着我们需要一个代理机制和这些端口上从主机<->客户虚拟机进行反向代理!
对于 http 来说,这通常并不难(SO 上的大多数解决方法都引用了这个用例),但 https 增加了 SSL 的复杂性,在尝试了几种不同的潜在解决方法(authbind、nginx、ssh 隧道等)后,我决定在主机上通过 Apache2 设置代理...
Apache2 安装
首先安装 Apache2
sudo apt install apache2
启用所需的 Apache2 插件:
a2enmod proxy_http proxy ssl
设置 SSL 证书
运行openssl
如下。它生成了 SSL 证书(所有默认设置,每次提示时只需按 Enter 键即可):
mkdir -p ~/certs && cd ~/certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mysitename.key -out mysitename.crt
创建 Apache2 代理服务器配置
现在证书文件已存在,通过创建和编辑此文件在 apache2 中创建一个新站点:
/etc/apache2/sites-enabled/001-myserverproxy.conf
内容:
<VirtualHost *:443>
#DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# CUSTOM STUFF NEEDED FOR SSL PROXY
SSLEngine On
SSLProxyEngine on
SSLProxyCheckPeerCN off
# this needs to be off because cert does not match server name
SSLProxyCheckPeerName off
# MAKE SURE THE CERTS ARE GENERATED AND AT THE CORRECT PATH
SSLCertificateFile /home/myuser/certs/mysitename.crt
SSLCertificateKeyFile /home/myuser/certs/mysitename.key
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / https://localhost:4430/
ProxyPassReverse / https://localhost:4430/
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
现在确保 Apache2 守护进程服务可以运行并重新启动它!
sudo systemctl restart apache2
现在转到主机上的浏览器,您应该能够正常浏览虚拟机服务器localhost
!