iptables 规则阻止 ssh 远程转发端口

iptables 规则阻止 ssh 远程转发端口

我正在尝试设置一个 iptables 规则,该规则将阻止通过 ssh 本地远程转发连接访问 ssh 远程转发连接。因此,换句话说:

客户端A连接服务器:
ssh -R 10000:localhost:23 某个服务器

客户端B连接服务器:
ssh -L 23:localhost:10000 某个服务器

我无法让 iptables 阻止这种情况。在某些情况下,我需要转发,而 sshd_config 设置无法覆盖这种情况(我将有一个程序专门分发客户端可以转发的端口,然后希望该程序会添加一个 iptables 规则来允许这种情况)。

我试过了:

iptables --flush

iptables -A 输入 -i lo -p tcp --dport 0:1024 -j 接受
iptables -A OUTPUT -o lo -p tcp --dport 0:1024 -j 接受
iptables --policy 输入删除
iptables --policy 输出丢弃

iptables -A INPUT -m 状态 --状态 ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -A 输入 -p tcp --dport 22 -m 状态 --状态新 -j 接受

但它仍然允许 ssh 本地转发连接访问远程转发端口。关于如何让 iptables 处理这个问题,有什么想法吗?


编辑:尝试更改为:

 
iptables --flush
iptables --policy 输入删除
iptables --policy 输出丢弃

iptables -A INPUT -m 状态 --状态 ESTABLISHED,RELATED -j ACCEPT
iptables -A 输入 -i eth1 -p tcp --dport 22 -j 接受
iptables -A OUTPUT -o eth1 -p tcp --sport 22 -j 接受
iptables -A 输入 -j 拒绝

我仍然可以建立转发连接。显然,这还不够。不过还是谢谢你的回答。你还有其他想法吗?

答案1

关闭 ssh 服务器上的 ssh 转发不是更简单吗?只需AllowTcpForwarding在 /etc/ssh/sshd_config 中将 yes 更改为 no。如果这不合适,您可以尝试以下方法

iptables -A OUTPUT -o eth1 -p tcp --cmd-owner "sshd" -j DROP

答案2

搞定了。我原来的规则集可以很好地阻止一切。问题是,在此服务器上,localhost 首先解析(通过 /etc/hosts)为 ::1(IPv6 环回)。因此,这些规则不起作用。从我的 /etc/hosts 文件中删除该条目后,我能够让一切正常工作。我的测试脚本如下所示:

/bin/bash #!/bin/bash
iptables --flush

iptables -A 输入 -i lo -p tcp --dport 0:1024 -j 接受
iptables -A OUTPUT -o lo -p tcp --dport 0:1024 -j 接受
iptables --policy 输入删除
iptables --policy 输出丢弃
iptables --policy 转发丢弃

iptables -A INPUT -m 状态 --状态 ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -A 输入 -i eth1 -p tcp --dport 22 -j 接受
iptables -A 输入 -j 拒绝

#iptables -I INPUT 1 -i lo -p tcp --dport 10001 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -I OUTPUT 1 -o lo -p tcp --dport 10001 -m state --state NEW,ESTABLISHED -j ACCEPT

启用最后两行后,我可以在端口 10001 上打开 ssh 本地转发连接。禁用它们后,我无法打开。完美!

答案3

转发的连接将源自本地系统。您需要删除允许出站连接的以下规则,然后如果需要,将其替换为仅允许您明确允许的出站连接的几条规则。

iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

答案4

请注意,可以使用以下方法来代替“localhost”:

  • 任何环回地址 127.xxx
  • 服务器上任意网络接口的地址

而且你也没有写任何有关客户端 B 尝试直接连接到客户端 A 的内容:

ssh -L 23:客户端A:80 某个服务器(我选择端口 80 因为也许你的防火墙允许它出站)

很抱歉,由于有这么多(以及更多)选项可用,再加上您对 iptables 的基础知识,您很可能会在设置中留下大漏洞。如果涉及任何真正有价值的东西,我建议请更了解的人来做这一切。

相关内容