如何访问 Ubuntu Linux 主机上 VirtualBox 端口转发转发的低端口号?

如何访问 Ubuntu Linux 主机上 VirtualBox 端口转发转发的低端口号?

我似乎在尝试从我的 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

相关内容