如何在 setcap 的帮助下将端口 80 上的远程端口转发到我的本地主机?

Kit*_*nde 14 ubuntu ssh-tunneling setcap

我想在 NATed 时短暂接受连接以进行开发,因此我尝试这样做:

$ ssh ubuntu@example.org -R 80:localhost:80
Run Code Online (Sandbox Code Playgroud)

当我试图绑定一个低的端口时失败了:

Warning: remote port forwarding failed for listen port 80
Run Code Online (Sandbox Code Playgroud)

所以我发现我可以setcap 'cap_net_bind_service=+ep' /my/application允许它监听低于 1024 的端口。所以我在我的 suders crontab 中有这个:

@reboot setcap 'cap_net_bind_service=+ep' /usr/sbin/sshd
Run Code Online (Sandbox Code Playgroud)

但它仍然不让我绑定端口 80。我做错了什么?我只是打算使用 nginx 代理到 8080 或 iptables 或其他东西,但我仍然很好奇为什么我尝试做的事情不起作用。

dwu*_*urf 16

除非登录用户的用户 ID 为 0(root),否则 OpenSSH 将完全拒绝绑定到特权端口。相关的代码行是:

if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0) ||
    (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");
Run Code Online (Sandbox Code Playgroud)

来源:http : //www.openssh.com/cgi-bin/cvsweb/src/usr.bin/ssh/serverloop.c? annotate = 1.162 行 1092-1098

如果你很好奇,pw是类型struct passwd *并且在 linux 上定义在/usr/include/pwd.h


Ben*_*res 14

这是一个很好的用例socat

首先,远程转发到8080远程机器的端口(或任何其他允许的端口):

ssh ubuntu@example.org -R 8080:localhost:80
Run Code Online (Sandbox Code Playgroud)

然后在远程机器上,将端口映射80到端口8080

sudo socat TCP-LISTEN:80,fork TCP:localhost:8080
Run Code Online (Sandbox Code Playgroud)

笔记:

正如 Dirk Hoffman 所建议的,这两个命令可以合并为一行:

ssh -t ubuntu@example.org -R 8080:localhost:80 sudo socat TCP-LISTEN:80,fork TCP:localhost:8080
Run Code Online (Sandbox Code Playgroud)

-t如果您需要交互式终端来输入sudo密码,这是必要的。)


Ser*_*rge 6

我遇到了类似的问题,所以我最终的解决方案是向表链添加DNAT规则:OUTPUTnat

iptables -t nat -A OUTPUT -d 127.0.0.0/8 -p tcp --dport 80 \
-j DNAT --to-destination :8080
Run Code Online (Sandbox Code Playgroud)

此规则有效地将所有本地生成的 tcp 数据包的目标端口 80 替换为 8080。

如果您希望允许转发任何传入连接,请向PREROUTING nat链中添加一条额外规则:

iptables -t nat -A PREROUTING -d 10.0.0.200 -p tcp --dport 80 \
-j REDIRECT --to-port 8080
Run Code Online (Sandbox Code Playgroud)

其中10.0.0.200是将传入连接转发到您的 Web 服务的接口的 IP 地址