如何限制反向 SSH 隧道端口?

Utk*_*glu 9 linux ssh ssh-tunnel

我们有一个公共服务器,它接受来自防火墙后面的多个客户端的 SSH 连接。

这些客户端中的每一个都通过使用ssh -R从其 Web 服务器在端口 80 到我们的公共服务器的命令来创建反向 SSH 隧道。

反向SSH隧道的目的端口(在客户端)是80,源端口(在公共服务器端)取决于用户。我们计划为每个用户维护一个端口地址映射。

例如,客户端 A 会将其 Web 服务器的 80 端口隧道连接到我们的 8000 端口;客户 B 从 80 到 8001;客户端 C 从 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
Run Code Online (Sandbox Code Playgroud)

基本上,我们要做的是将每个用户绑定到一个端口,并且不允许他们通过隧道连接到任何其他端口。

如果我们使用 SSH 的转发隧道功能ssh -L,我们可以通过使用permitopen=host:port配置允许哪个端口被隧道化。但是,反向 SSH 隧道没有等效项。

有没有办法限制每个用户的反向隧道端口?

Jay*_*Jay 6

由于您以粗体放置了不允许,我假设您希望在 SSH 客户端进行某种运行时拒绝,以防止端口绑定。所以,我为你挖掘了源代码:

serverloop.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);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,正如您所看到的,除了标准条件之外,似乎没有多少条件阻止端口转发。

我正要建议相同的建议使用mod_owner范围内iptables,但杰夫击败我给它。

您最干净的解决方案只是修改此文件(例如,您可以使用它pw->pw_uid来获取连接用户的 uid,并将其映射到正确的端口)并重新编译您的 SSH 服务器,但这取决于您对此的适应程度.