我正在尝试设置一个 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 的基础知识,您很可能会在设置中留下大漏洞。如果涉及任何真正有价值的东西,我建议请更了解的人来做这一切。