我有一台可从互联网上看到的 ubuntu 服务器,我们称之为“跳线”。这台服务器之所以有这个名字,实际上是因为我需要每当用户通过 SSH 连接这台服务器时,它都会将 SSH 连接跳转(或转发或重定向)到另一台服务器(从互联网上看不到),因此 SSH 实际上是到不可见的服务器。另外,我需要使用 iptables 来做到这一点。
我尝试过的(跳线)
iptables -t nat -A PREROUTING -d ${jumper_ip} -p tcp --dport 22 -j DNAT --to-destination ${invisibleserver_ip}
iptables -t nat -A POSTROUTING -s ${invisibleserver_ip} -p tcp --sport 22 -j SNAT --to-source ${jumper_ip}
iptables -A FORWARD -p tcp ${invisibleserver_ip} --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
是的,内核已启用 IP 转发。
问题
当我通过 SSH 连接跳线主机时,什么都没有发生。出现“连接超时”提示。有什么想法吗?
感谢大家的回答。
答案1
您的第一条iptables
规则是正确的,足以完成这项工作。我会考虑明确指定传入接口,例如:
iptables -t nat -A PREROUTING -i ${wan_if} -d ${jumper_ip} -p tcp --dport 22 -j DNAT --to-destination ${invisibleserver_ip}
但这不是必需的。你的POSTROUTING
规则有点缺陷。我不认为它会破坏任何东西。但最好删除它。当客户端在端口 22 上运行时,它适用,而 SSH 则不是这种情况。
该FORWARD
规则完全是多余的,除非您进行了其他更改(但您没有告诉我们)。默认策略是ACCEPT
。带有 的单个规则ACCEPT
和默认策略ACCEPT
将导致所有数据包都被接受,无论数据包是否符合条件。因此,您可以简单地删除该规则并依赖默认ACCEPT
策略。
这些都不能解释问题的原因。原因有两个。您没有解释您遇到的问题,也没有提到配置的所有相关细节,以便查明真正的原因。
不过我可以得出几个可能的猜测:
- 您尚未启用数据包转发。
- 您的路由配置方式是只有一个方向的数据包通过您的跳转服务器。
- 数据包被其他规则丢弃,而您在问题中忽略了这些规则。
首先输入以下命令来验证转发是否已启用:
cat /proc/sys/net/ipv4/ip_forward
如果已禁用,您可以通过输入以下命令来启用它:
echo 1 >/proc/sys/net/ipv4/ip_forward
如果这解决了问题,您可以通过更新使其永久生效/etc/sysctl.conf
。
如果您的路由配置为返回数据包不通过跳转主机路由,则可以SNAT
向您的链中添加一条规则POSTROUTING
,该规则需要应用于刚刚由您的DNAT
规则处理的相同 SYN 数据包。
如果你想知道使用DNAT
这种方法的潜在缺点,以及一些替代方案。我有已回答一个相似的问题在过去。
如果问题是由您在问题中未提及的附加 iptables 规则引起的,则需要删除或修复这些规则。显然,在不知道这些规则的内容和用途(如果有的话)的情况下,我无法提供更多详细信息。