我的网络中有一台 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