IPTables ssh 端口重定向

IPTables ssh 端口重定向

我有相当多的 VPS 运行 Ubuntu LTS 18,并使用 iptables 作为防火墙。目前,我在端口 22 上运行 SSH,该端口上有很多来自外部 IP 地址的登录尝试。

我想通过 IPTables 将任意端口号(例如 2222)重定向到端口 22 来限制这些命​​中。由于某些原因,我不想调整 SSH 脚本的配置来侦听端口 2222。

作为“奖励”,我希望能够仅对 IP xxxx(目前为 1.1.1.1)保持端口 22 开放。

我已经尝试过以下方法:

排除除我自己的 IP 之外的所有 IP:

iptables -A INPUT -s 1.1.1.1/32 -i venet0 -p tcp -m tcp --dport 22 -j ACCEPT

这效果很好。

现在将 2222 重定向到 22:

iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 2222 -j REDIRECT --to-port 22

这似乎不起作用。仅当我打开端口 22 时,重定向才有效。但港口对所有游客开放。

有人可以解释一下吗?谢谢!

答案1

如果你希望只有1个IP地址能够访问22端口,但你还想将其他一些端口重定向到本地22端口,那么你仍然需要向所有人开放22端口,因为规则INPUT是在nat之后处理的REDIRECT规则。

一种方法可能是:

iptables -t nat -A PREROUTING -s 1.1.1.1 --proto tcp --dport 22 -j ACCEPT
iptables -t nat -A PREROUTING --proto tcp --dport 22 -j REDIRECT --to-port 65535
iptables -t nat -A PREROUTING --proto tcp --dport 2222 -j REDIRECT --to-port 22

iptables -A INPUT --proto tcp --dport 22 -j ACCEPT
iptables -A INPUT --proto tcp --dport 65535 -j DROP

由于首先处理 natPREROUTING表,因此接受端口 22 的源地址 1.1.1.1(意味着不执行 NAT)。尝试到达端口 22 的其他源地址将命中下一条规则,将传入端口 22 的数据包重定向到端口 65535(不幸的是,您不能DROPPREROUTINGnat 表中使用)。

接下来,到端口 2222 的连接将重定向到端口 22,所有到端口 22 的传入数据包都被接受,最后到端口 65535 的传入连接(这是到端口 22 的“其他”连接)将被丢弃。

注意我假设您有这样一行作为您的第一个 INPUT 规则之一:

iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT

否则,您的传出连接可能具有源端口 65535,并且对该端口的响应将被阻止。或者,将 TCP 标志匹配添加到 65535 规则,仅匹配 SYN 数据包。然而,ESTABLISHED,RELATED为了提高效率,允许数据包尽早进入 INPUT 链始终是一件好事。

-i venet0如果这些规则仅应用于进入该接口的数据包,请随意添加。

答案2

你必须打开端口 22 才能将流量从端口 2222 传递到它,如果 ssh 和你的 iptables 设置在同一台计算机上,则可以将你的 ssh 套接字绑定到你的环回接口(127.0.0.1),这将允许你将 ssh 保留在端口 22 上,您仍然可以将流量从面向公众的接口传递到本地计算机的环回。

相关内容