IPTables重新路由2次

有没有办法使用IPTables(Debian Squeeze)完成以下工作:让用户使用普通的ssh命令和端口22连接到“主机”服务器,然后一旦build立连接,将它们重新路由到另一个基于string的地址他们曾经连接在第一位。

例如,如果在托pipe虚拟服务器的云中使用服务器(我们可以使用“虚拟”地址(因此主机服务器有一个公用地址,而来宾服务器都有自己的专用地址)),我们希望用户连接到主机服务器使用通用的外部端口端口,然后使用基于它们使用的原始ssh连接string的单独地址将它们重新路由到虚拟服务器。

要进行初始连接,我们需要使用一个ssh端口…,然后在初始连接完成后将用户重新路由到特定的虚拟服务器。

任何帮助感激!

听起来就像你想做端口转发。

这是一个很好的参考网站

编辑

每一次,使我的答案更相关

这不是一个简单的解决scheme,但最接近你将会很容易的是使用端口转发和分配特定的端口给特定的人,并将这些端口路由到特定的机器。 如果你想花时间build立自己的应用程序,你可以解决这个问题,但这将花费很多时间。

所以,在你的控制路由的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 ,但是如果你出于安全考虑而做的更好。 如果人们从一个dynamic地址连接,那么最好不要。

那么,我所展示的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 

也就是说,我也忘记了你也可以用bashconfiguration文件做一些事情。 这意味着,如果一个特定的用户通过SSH连接,他们将被redirect到他们的configuration文件,而不是他们的连接端口。 这将消除需要制定一长串IPTABLE规则和端口转发。

编辑用户的bashconfiguration文件

 vi /home/user/.bash_profile 

将此行添加到文件的末尾

 ssh 192.168.1.50 

因此,无论您使用的是SSH端口,所有用户都可以使用相同的端口,并自动从server.comredirect到内部服务器192.168.1.50 ,不需要混乱的IPTABLEconfiguration或新的应用程序,因为用户既存在于路由服务器上,也存在于内部服务器上。

嗯…我想我错了。 有一个简单的答案。 在我读完“脑海中的怪兽”的回答之后,我find了它。

你所要做的只是在networking层难以实现,因为你需要第7层(应用层)负载平衡器或者数据包检查来实现转发规则。 在处理encryptionstream量时,您不能只在连接外部使用某些内容,因为它无法读取所需信息的encryption部分。

正如CIA所指出的那样,SSH包括将TCP端口从本地机器转发到远程networking的function。 我没有试图让服务器执行转发的端口,因为客户端通常指定端口转发规则。 您至less可以限制客户端允许使用的端口,但仍然需要客户端的知识/设置。 这个答案提供了一个authorized_keysstring来设置。

如果你想控制用户发生的事情,你可以在入站的ssh服务器上为它们提供一个shell,它只通过密钥或者服务器的菜单为它们提供到虚拟服务器的连接

client -> ruser@sshserver:/sbin/user_ssh_shell -> ruser@vserver:/bin/bash

然后在sshserver创build一个文件/bin/user_ssh_shell

 #!/bin/sh ssh -i /path/to/privatekey.rsa [email protected] 

并使该用户shell

 usermod ruser -s /sbin/user_ssh_shell