我有一个Ubuntu服务器作为我的networking服务多个服务的网关。 我希望将这些服务分成多个Ubuntu服务器(物理和/或虚拟),以获得更多的计算能力和更好的组织。 我只有一个公共IP可用。 DNS被configuration并回答“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。 我也需要从局域网访问这些服务器。
我知道这是可以完成WWWstream量使用反向代理。
但是,如果我想使用SSH呢? (例如:我需要使用SSH [email protected]通过SSH连接到SRV1。
我期待没有端口转发(网关22的SSH端口,SRV1 2201的SSH端口转发,SRV 2202的SSH端口转发)
这可以使用IPTables或任何其他工具来完成吗?
这可以使用虚拟机更容易完成(我也想实现KVMpipe理程序)?
对不起如果我的英文。
亚历克斯,非常感谢
简短的答案是否定的,你不能这样做。
所有TCP客户端请求都以客户端进行DNS查询为开始,客户端获取远程主机的IP地址。 然后打开TCP连接到IP地址和指定的端口。
因此,远程服务器无法知道客户端连接到哪个域。 客户端必须在TCP中使用的协议中提供这些信息。
例如,在HTTP中,与请求一起发送的是Host:
头,它表示客户端连接到的域。 使用HTTPS,TLS SNI字段具有相同的用途。
在SSH中,没有这样的机制。
你可以使用Nginx来做到这一点。
对于WWWstream量,您需要configuration一个反向代理服务器:
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/; } }
您可以在这里find详细的文档: 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; } }
在这里你可以findStream Module的文档
所以你可以在端口80上访问你的网站,在端口2201上访问srv1的ssh,在端口2202上访问srv2的ssh。最后它仍然是端口转发,但你可以用nginx而不是iptables来处理。
最好的问候