Ubuntu - 将目标为 subdomain.example.com 的数据包转发到内部 LAN 主机

Ubuntu - 将目标为 subdomain.example.com 的数据包转发到内部 LAN 主机

我的网络中有一台 Ubuntu 服务器作为网关,提供多种服务。我想将这些服务拆分到多个 Ubuntu 服务器(物理和/或虚拟)中,以获得更高的计算能力和更好的组织。我只有一个可用的公共 IP。DNS 已配置并回答“example.com”

请参阅下图以了解更多信息:

                                      /\                        -----------------
                                     /  \                       |               |
                                    /    \  <-----------------> |  Remote Host  |
                                   /      \                     |               |
                                  /Internet\                    -----------------
                                  \        /
                                   \      /
                                    \    /
                                     \  /
                                      \/
                                      |
                                      |
                              -------eth0------
                              |     1.2.3.4   |
                              | Ubuntu Server |
                              |    Gateway    |
                              |  192.168.0.1  |
                              -------eth1------
                                      |
                                      |
                                      |
                              -----------------
                              |               |
                              |   LAN Switch  |
                              |               |
                              -----------------
                                      /\
                                     /  \
                                    /    \
                                   /      \
                                  /        \
                                 /          \
                                /            \
                               /              \
                              /                \
                             /                  \
                   -------eth0------     ------eth0-------
                   | Ubuntu server |     | Ubuntu server |
                   |      SRV1     |     |      SRV2     |
                   | 192.168.0.10  |     |  192.168.0.20 |
                   |               |     |               |
                   -----------------     -----------------

现在,我需要将所有来自远程主机到 srv1.example.com 的数据包转发到内部服务器 SRV1,并将所有来自 srv2.example.com 的数据包转发到 SRV2。我还需要这些服务器可从 LAN 访问。

我知道可以使用反向代理来实现 WWW 流量的这一功能。

但是如果我想使用 SSH 怎么办?(例如:我需要使用 SSH 通过 SSH 连接到 SRV1[电子邮件保护]

我希望在没有端口转发的情况下执行此操作(网关 22 的 SSH 端口转发、SRV1 2201 的 SSH 端口转发、SRV 2202 的 SSH 端口转发)

可以使用 IPTables 或任何其他工具来完成此操作吗?

可以使用虚拟机更轻松地完成此操作吗(我也正在考虑实施 KVM 虚拟机管理程序)?

抱歉,我的英语不好。

非常感谢,亚历克斯

答案1

简短的回答是“不,你不能这样做。”

所有 TCP 客户端请求都始于客户端进行 DNS 查询,客户端会从中获取远程主机的 IP 地址。然后,它会打开到 IP 地址和指定端口的 TCP 连接。

因此远程服务器无法知道客户端正在连接到哪个域。客户端必须在 TCP 中使用的协议中提供此信息。

例如,在 HTTP 中,Host:请求中会发送标头,指示客户端正在连接到哪个域。在 HTTPS 中,TLS SNI 字段的作用相同。

在SSH中,没有这样的机制。

答案2

您可以使用 Nginx 来做到这一点。

对于 WWW 流量,您需要配置反向代理:

server {
    listen 80;
    server_name srv1.example.com;

    location / {
        proxy_pass http://192.168.0.10/;
    }
}
server {
    listen 80;
    server_name srv2.example.com;

    location / {
        proxy_pass http://192.168.0.20/;
    }
}

您可以在这里找到详细文档:Nginx 文档

对于您的 SSH,您需要使用 Nginx 的 Stream 选项:

stream {
    upstream srv1 {
        server srv1.example.com:22
        server 192.168.0.10:22
        server unix:/tmp/srv1;
    }
    upstream srv2 {
        server srv2.example.com:22
        server 192.168.0.20:22
        server unix:/tmp/srv2;
    }
    server {
        listen     2201;
        server_name srv1.example.com;
        proxy_pass srv1;
    }
    server {
        listen     2202;
        server_name srv2.example.com;
        proxy_pass srv2;
    }
}

您可以在这里找到流模块

因此,您可以通过端口 80 访问您的网站,并通过端口 2201 访问 srv1 的 ssh,并通过端口 2202 访问 srv2 的 ssh。所以最终它仍然是端口转发,但您可以使用 nginx 而不是 iptables 来处理它。

谨致问候 ThoBe

相关内容