我有一个从互联网上可见的Ubuntu服务器,我们称之为“跳线”。 而这个服务器有这个名字实际上是因为我需要当用户SSH这个服务器,它跳转(或转发或redirect)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
是的,在Kernel上启用IP转发。
当我SSH跳线主机,没有任何反应。 “连接超时”出来。 任何想法?
谢谢大家的答案。
你的第一个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策略的单个规则将导致所有的数据包被接受,而不pipe数据包是否符合条件。 因此,您可以简单地删除该规则,并依靠默认的ACCEPT策略。
这些都不能解释导致问题的原因。 原因是双重的。 你没有解释你所看到的问题,你没有提到你的configuration的所有相关细节,以查明真实的原因。
然而,我可以想出几个可能的猜测:
首先通过input以下内容validation是否启用转发
cat /proc/sys/net/ipv4/ip_forward
如果禁用,可以通过input以下命令启用它:
echo 1 >/proc/sys/net/ipv4/ip_forward
如果解决了这个问题,可以通过更新/etc/sysctl.conf来使其永久/etc/sysctl.conf 。
如果您的路由configuration为返回数据包不通过您的跳转主机,您可以添加一个SNAT规则到您的POSTROUTING链,这个规则需要应用到您的DNAT规则刚才处理的同一个SYN数据包。
如果你想知道使用DNAT潜在缺陷,以及一些替代品。 我过去也回答过类似的问题 。
如果问题是由你在问题中没有提到的其他iptables规则引起的,则需要删除或修复这些规则。 如果不知道这些规则的内容和目的,显然我不能提供更多细节。