![如何限制反向 SSH 隧道端口?](https://linux22.com/image/588746/%E5%A6%82%E4%BD%95%E9%99%90%E5%88%B6%E5%8F%8D%E5%90%91%20SSH%20%E9%9A%A7%E9%81%93%E7%AB%AF%E5%8F%A3%EF%BC%9F.png)
我们有一个公共服务器,它接受来自防火墙后面的多个客户端的 SSH 连接。
ssh -R
每个客户端都使用命令从其位于端口 80 的 Web 服务器创建到我们的公共服务器的反向 SSH 隧道。
反向 SSH 隧道的目标端口(在客户端)为 80,源端口(在公共服务器端)取决于用户。我们计划为每个用户维护一个端口地址映射。
例如,客户端 A 将其 Web 服务器的 80 端口隧道传输到我们的 8000 端口;客户端 B 将其 Web 服务器的 80 端口隧道传输到 8001 端口;客户端 C 将其 Web 服务器的 80 端口隧道传输到 8002 端口。
Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver
Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver
Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver
基本上,我们要做的是将每个用户与一个端口绑定,然后不允许让它们通过隧道连接到任何其他端口。
如果我们使用 SSH 的正向隧道功能ssh -L
,我们可以使用配置来允许哪个端口进行隧道传输permitopen=host:port
。但是,反向 SSH 隧道没有等效功能。
有没有办法限制每个用户的反向隧道端口?
答案1
由于您已放置不允许粗体部分,我假设您希望在 SSH 客户端进行某种运行时拒绝,以防止端口绑定。因此,我为您挖掘了源代码:
服务器循环.c:
/* check permissions */
if (!options.allow_tcp_forwarding ||
no_port_forwarding_flag ||
(!want_reply && listen_port == 0)
#ifndef NO_IPPORT_RESERVED_CONCEPT
|| (listen_port != 0 && listen_port < IPPORT_RESERVED &&
pw->pw_uid != 0)
#endif
) {
success = 0;
packet_send_debug("Server has disabled port forwarding.");
} else {
/* Start listening on the port */
success = channel_setup_remote_fwd_listener(
listen_address, listen_port,
&allocated_listen_port, options.gateway_ports);
}
不幸的是,正如您所看到的,除了标准条件之外,似乎没有太多条件可以阻止端口转发。
mod_owner
我原本要推荐同样的使用建议iptables
,但 Jeff 抢先了一步。
最干净的解决方案就是修改此文件(例如,您可以用来pw->pw_uid
获取连接用户的 uid,并将其映射到正确的端口)并重新编译您的 SSH 服务器,但这取决于您对此的熟悉程度。
答案2
我的建议是使用 SELinux。您必须配置允许打开哪些端口的用户配置文件。sshd
在打开要转发的端口之前,进程会分叉并放弃用户的权限,因此任何应用于用户进程的操作都将在 上强制执行sshd
。请注意,您需要限制所有用户进程,因为一旦使用,就可以netcat
用来转发另一个端口。稍后我会尝试为您整理正确的语法(或者欢迎任何其他用户为我编辑它)。
或者,您可以尝试使用iptables
。
iptables -m owner --add-owner $user -p tcp --sport 8000 -j ACCEPT
iptables -m owner --add-owner $user -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT
但这并不能阻止他们打开端口并拒绝其他用户。