有没有办法用 IPTables(Debian Squeeze)执行以下操作:让用户使用通用 ssh 命令和端口 22 连接到“主机”服务器,然后一旦建立连接,就根据他们最初用于连接的字符串将他们重新路由到另一个地址。
例如,如果使用云中的服务器来托管虚拟服务器,我们可以使用“虚拟”地址(因此主机服务器有一个公共地址,而每个客户服务器都有自己的私有地址),我们希望让用户使用通用的外部端口连接到主机服务器,然后根据他们使用的原始 ssh 连接字符串,使用单独的地址将他们重新路由到虚拟服务器。
为了建立初始连接,我们需要使用一个 ssh 端口...然后在建立初始连接后将用户重新路由到他们特定的虚拟服务器。
任何帮助都值得感激!
答案1
听起来你想做端口转发。
这是一个很好的参考地点
编辑
Per lain,为了让我的回答更有意义
这不是一个简单的解决方案,但最容易的方法是使用端口转发并将特定端口分配给特定人员,然后将这些端口路由到特定机器。如果您愿意花时间构建自己的应用程序,您可以解决这个问题,但这将花费大量时间。
因此,在控制路由的 Linux 机器上,将其添加到您的 IPTABLES:
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.50:80
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -i eth1 -j ACCEPT
iptables -A PREROUTING -t nat -i eth1 -p tcp --source 11.22.33.44 --dport 22 -j DNAT --to 192.168.1.50:22
注意:您不需要识别--source 11.22.33.44
,但出于安全原因,最好这样做。如果人们从动态地址连接,那么最好不要这样做。
因此,我展示的 IPTABLES 代码的作用是,它将传入的请求发送到端口 22,然后将其转发到 192.168.1.50:22。因此,如果我,那么我将从 转发到内部服务器。ssh [email protected]:22
server.com:22
192.168.1.50.22
您必须对多个服务器使用多个条目。例如,对于端口 22-25:
# Port 22
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.50:80
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -i eth1 -j ACCEPT
# Port 23
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 23 -j DNAT --to 192.168.1.50:80
iptables -A INPUT -p tcp -m state --state NEW --dport 23 -i eth1 -j ACCEPT
# Port 24
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 24 -j DNAT --to 192.168.1.50:80
iptables -A INPUT -p tcp -m state --state NEW --dport 24 -i eth1 -j ACCEPT
# Port 25
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 25 -j DNAT --to 192.168.1.50:80
iptables -A INPUT -p tcp -m state --state NEW --dport 25 -i eth1 -j ACCEPT
iptables -A PREROUTING -t nat -i eth1 -p tcp --source 11.22.33.44 --dport 22 -j DNAT --to 192.168.1.50:22
iptables -A PREROUTING -t nat -i eth1 -p tcp --source 11.22.33.44 --dport 22 -j DNAT --to 192.168.1.50:22
iptables -A PREROUTING -t nat -i eth1 -p tcp --source 11.22.33.44 --dport 22 -j DNAT --to 192.168.1.50:22
iptables -A PREROUTING -t nat -i eth1 -p tcp --source 11.22.33.44 --dport 22 -j DNAT --to 192.168.1.50:22
话虽如此,我还忘了你也可以使用 bash 配置文件来做一些事情。这意味着,如果特定用户通过 SSH 连接,他们将通过其配置文件而不是其连接端口进行重定向。这样就无需制作一长串 IPTABLE 规则和端口转发。
编辑用户的 bash 配置文件
vi /home/user/.bash_profile
将此行添加到文件末尾
ssh 192.168.1.50
因此,无论您使用哪个端口进行 SSH,所有用户都可以使用相同的端口,并且他们会自动从server.com
内部服务器重定向192.168.1.50
,并且不需要混乱的 IPTABLE 配置或新的应用程序,只要用户同时存在于路由服务器和内部服务器上。
嗯...我想我搞错了。答案很简单。我读了 mindthemonkey 的回答后才想到的。
答案2
您尝试做的事情在网络层实现起来有点困难,因为您需要第 7 层(应用程序级别)负载平衡器或数据包检查来实现转发规则。由于您正在处理加密流量,因此您不能只在连接外部使用某些东西,因为它无法读取您想要的信息所在的加密部分。
正如 CIA 所指出的,SSH 包含将 TCP 端口从本地计算机转发到远程网络的功能。我以前从未尝试过让服务器强制执行转发端口,因为客户端通常会指定端口转发规则。您至少可以限制客户端可以使用的端口,但这仍然需要客户端的知识/设置。这个答案提供一个authorized_keys
字符串来进行设置。
如果你想控制用户的行为,你可以在入站 ssh 服务器上为他们提供一个 shell,该 shell 只允许他们通过密钥连接到虚拟服务器,甚至可以是服务器菜单
client -> ruser@sshserver:/sbin/user_ssh_shell -> ruser@vserver:/bin/bash
然后sshserver
创建一个文件/bin/user_ssh_shell
#!/bin/sh
ssh -i /path/to/privatekey.rsa [email protected]
并使其成为用户 shell
usermod ruser -s /sbin/user_ssh_shell