将 host1.example.com:80 的传入流量路由到端口 80 绑定到 10080 的 docker 容器

将 host1.example.com:80 的传入流量路由到端口 80 绑定到 10080 的 docker 容器

我有一台运行 Apache2 和 Docker 的 Ubuntu 16.04 机器(docker 本身从 Docker hub 运行 GitLab)。这台机器还托管一个 Phabricator 实例,因此我将 GitLab 放入其自己的 Docker 中以分离事物。

还需要注意的是,我可以通过两种不同的方式访问服务器:通过私有 IP(10.10.XY)在我公司的私有网络中访问,或者通过指向公共 IP 的主机名“gitlab.example.com”。

在私有网络内,如果我访问“10.10.XY:10080”,那么我就可以访问 GitLab 的所有功能。如果我在网络外访问“gitlab.example.com:10080”(并在防火墙中打开 10080),那么我仍然可以毫无问题地访问 GitLab。

但是,我想避免打开 10080;我还希望我的开发人员只需输入主机名,而不必包含端口号。


我尝试了几种方法来实现这一点但都无济于事......

  • Apache2 ProxyPass(尝试使用 localhost 和 docker 的 IP 来实现 ProxyPass/ProxyReverse)。我已验证 mod_proxy 已启用。访问 URL 时出现错误,提示网站没有配置。如果我注释掉下面的所有代理信息,则会提供默认的 Apache2 成功页面(可能是因为它会回退到主文档根目录,因为我下面没有定义一个)。

    <VirtualHost *:80>
        ProxyPreserveHost On
        ProxyRequests On
        ServerName gitlab.example.com
        ProxyPass / http://172.17.0.2:80/
        ProxyPassReverse / http://172.17.0.2:80/
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
    </VirtualHost>
    
  • iptables PREROUTING。我不是 iptables 专家,我的大部分网络路由都是通过 Barracuda 完成的,但我在网上看到您应该能够在同一台机器内从一个端口路由到另一个端口。我尝试了以下几个命令,但仍然没有成功。我对 iptables 一窍不通,下面的命令可能完全错误。

    sudo iptables -A PREROUTING -t nat -s gitlab.example.com -p tcp --dport 80 -j DNAT --to-destination 172.17.0.2:10080
    sudo iptables -t nat -A OUTPUT -d 172.17.0.2 -p tcp --dport 80 -j REDIRECT --to-port 10080
    sudo iptables -A PREROUTING -t nat -s gitlab.example.com -p tcp --dport 80 -j REDIRECT --to-port 10080
    
  • Rinetd。这听起来很有希望,但功能并不像我预期的那样。我只是尝试了下面的命令,然后继续。也许我误解了命令或如何编译它以使其运行。

    sudo rinetd gitlab.example.com 80 172.17.0.2 10080
    
  • 我也尝试过使用 iproute2 和 socat 做一些事情,但我对这些尝试的记录很差,并且不确定我到底用这两个做了什么。我知道我尝试过的一切显然都没有用!


我觉得肯定还有其他我遗漏的方法,现在我正绞尽脑汁想让这个方法奏效。任何见解都将不胜感激。

答案1

rinetd使用配置文件运行。您只需将此行放入名为的文件中即可rinetd.conf

gitlab.example.com 80 172.17.0.2 10080

然后按预期运行 rinetd(-f在前台模式下运行;否则它会像传统守护进程一样分叉到后台):

sudo rinetd -f -c rinetd.conf

答案2

我找到了问题的解决方案。这是我最初尝试时出现的用户错误。

Apache 代理

我的虚拟主机:

<VirtualHost *:80>
    ServerName gitlab.example.com

    ProxyPreserveHost On
    <Proxy *>
            Order allow,deny
            Allow from all
    </Proxy>
    ProxyPass / http://172.17.0.2:80/
    ProxyPassReverse / http://172.17.0.2:80/
</VirtualHost>

注意:172.17.0.2 是我的 gitlab 容器的 IP。

我最初尝试时错过的是... 等一下... 我没有启用 proxy_http 模式!!所以难怪它从来没有起作用。它永远都不会起作用。

设置 VHost 后,请确保运行以下内容:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo service apache2 reload

瞧!我现在可以在浏览器中从 gitlab.example.com 访问我的 gitlab 实例,它将自动重定向到端口 10080,但浏览器中的 URL 保持不变。

编辑:当我通过防火墙拒绝到端口 10080 的流量时,我遇到了原始配置问题,因为我试图使用主机名代理回服务器。相反,我在 VHost 中更改为 docker 的 IP:PORT 来解决该问题。

相关内容