IPTables 重新路由 2 次

IPTables 重新路由 2 次

有没有办法用 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]:22server.com:22192.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

相关内容