我有以下配置:
a DNS record of X.a.b.c pointing to an ip address I
a DNS record of Y.a.b.c pointing to the same ip I.
Internet---->(RT)--->(FW)--+-->(MN)
L-->(Beh)
RT is a router (which i have no control over) that has I as left-hand IP and 10.4.255.13 as internal IP.
FW is a firewall that has 10.4.255.190 as the left-hand IP and 192.168.0.1 as a right-hand IP.
MN has an IP of 192.168.0.2 and Beh has an IP of 192.168.0.3
FW 有规则允许某些端口上的流量,并根据这些端口转发到特定 IP。例如,端口 22 转发到 MN (192.168.0.2)。
我有 2 台服务器,每台都在 Beh 和 MN 的 22 端口上运行,我希望根据您访问的 URL,您可以连接到特定的服务器:
如果我 ssh[电子邮件保护]我连接到了 MN。如果我 ssh[电子邮件保护]我与 Beh 取得了联系。
我可以用 IPtables 来做这个吗?
答案1
正如 Zoredache 所说,这是不可能的。SSH 协议握手从服务器向客户端发送信息开始,因此甚至没有可以编码来执行某种技巧代理的自定义解决方案。
话虽如此,其他人所说的使用多个端口的方法效果很好。大多数基于 GUI 的 SSH 客户端都有很好的方法来保存会话,并且设置端口很简单,不是问题。但是,我要在这里快速跳出一个假设,假设您期望连接到此服务器的大多数客户端都是基于文本的,并且您不想-oPort=
每次使用 SSH 时都输入内容。
以下也许可以让所有参与者的生活更轻松一些。*nix 系统上可用的标准 SSH 驱动命令行工具都使用相同的配置方法。
在工作站~/.ssh
目录中,创建文件config
。与处理 SSH 时几乎所有权限一样,这需要具有权限:600
。在此文件中,设置以下几行(假设您转发了端口 2222 和 2223)
Host X.a.b.c
Port 2222
Host Y.a.b.c
Port 2223
虽然这并不是您希望实现的目标,但它应该有助于使客户端更加可行,因为您只需设置一次。您的 SSH 客户端将根据此配置的工作站的主机名透明地“做正确的事情”。此外,依赖 SSH 的工具也会做正确的事情(git、scp 等)。
答案2
抱歉,这是不可能的。与 http 不同,目标的 DNS 名称在客户端解析,并且不会以防火墙可以看到的任何方式作为协议的一部分传递。