我们有一个公共服务器,它接受来自防火墙后面的多个客户端的SSH连接。
这些客户端中的每一个都使用从端口80的Web服务器的ssh -R命令到我们的公用服务器创build反向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
基本上,我们试图做的是绑定每个用户端口, 不允许他们隧道到任何其他端口。
如果我们通过ssh -L使用SSH的转发隧道function,我们可以通过使用permitopen=host:portconfiguration允许哪个端口通过隧道。 但是,反向SSH隧道没有等价物。
有没有限制每个用户反向隧道端口的方法?
既然你已经放置不允许粗体,我假设你想在SSH客户端的某种运行时拒绝阻止端口绑定。 所以,我已经为您准备了一些源代码:
/* 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); }
不幸的是,正如你所看到的,除了标准端口以外,没有多less条件阻止端口转发。
我正要推荐在iptables使用mod_ownerbuild议,但是Jeff已经打败了我。
你最干净的解决scheme只是修改这个文件(例如,你可以使用pw->pw_uid来获取用户连接的uid,并将其映射到正确的端口),然后重新编译你的SSH服务器,但这取决于多么舒适你是这样的。
我的build议是使用SELinux。 您必须configuration允许打开哪些端口的用户configuration文件。 在打开一个端口转发之前, 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
但是,这并不妨碍他们开放港口并拒绝另一个用户。