如何使用 iptables 转发创建 SSH 反向隧道?

如何使用 iptables 转发创建 SSH 反向隧道?

我的家庭网络中有一台服务器(无法端口转发),并且 WAN 上有一台 VPS。我需要某个端口上的请求,,而不是从要转发到我的家庭服务器的 VPS。我有一个 SSH 隧道,如果我将请求发送到localhostVPS 上,它可以正常工作。然而,我希望从互联网转发到 VPS 的请求localhost通过隧道发送到我的家庭服务器。而且它需要是双向的。

我见过问题,但它对我不起作用。我很可能做错了什么。

我的具体过程:在我的家庭服务器
server 上a,我运行以下命令来设置隧道:

ssh -v -N -R 2222:localhost:22 [email protected]

b我在服务器(VPS)上运行以下命令:

iptables -t nat -A PREROUTING -p tcp --dport 2223 -j DNAT --to-destination 127.0.0.1:2222

并尝试ssh从另一台机器:

ssh [email protected] -p 2223

我设置GatewayPorts yessshd_config,但仍然发现同样的问题:
ssh:连接到主机 server-b.com 端口 2223:连接被拒绝

答案1

设置GatewayPorts yesAllowTcpForwarding yessshd_config服务器上b。通过GatewayPorts clientspecified明确提及 IP0.0.0.0*在服务器上a创建反向隧道。这样服务器上的 sshdb也接受来自公共的连接:

ssh -NTR *:2222:localhost:22 [email protected]

否则 sshd 仅侦听环回接口,就像GatewayPorts no.

现在ssh 从另一台机器到端口2222

ssh [email protected] -p 2222

a身份验证后您将登录到服务器。
无需设置iptables转发。顺便说一句,如果可能的话,请避免用户root进行远程登录。


如果您不想设置GatewayPorts选项,则需要将流量从其他端口转发2223localhost:2222

  • iptables这可以在服务器上完成b

    iptables -t nat -I PREROUTING -p tcp -m tcp --dport 2223 -j DNAT --to-destination 127.0.0.1:2222
    

    *REDIRECT仅适用于相同接口

    路由到loopback接口不允许,除非:

    echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/route_localnet
    

    现在ssh从另一台机器到端口2223

    ssh [email protected] -p 2223
    

2223另一种选择是使用、、等2222工具从端口设置一些最小的本地转发服务器。sshsocatnetcat*inetd

  • 在服务器上b,带有socat

    socat TCP-LISTEN:2223,fork TCP:127.0.0.1:2222
    
  • 或者与netcat

    nc -l -p 2223 -c "nc 127.0.0.1 2222"
    
  • 或者与ssh

    ssh -4gfNTL 2223:localhost:2222 localhost
    

上述任何一项都可以与反向隧道结合起来做一个双重转发a一步从服务器:

ssh -TR *:2222:localhost:22 [email protected] "ssh -4gfNTL 2223:localhost:2222 localhost"

相关内容