我已成功在本地 Linux 服务器上创建了到云 Postgresql 服务器的 SSH 隧道,命令如下:
ssh -N -f -L 5431:localhost:xxxx mycloudserver.com
(其中 xxxx 是远程端口)
使用此命令,我可以通过端口 5431 访问远程 PostgreSQL 数据库,但仅限于此 Linux 服务器上。
现在我想与网络上的其他 PC“共享”此连接,以便我可以使用 ODBC 驱动程序连接到 linux_server:5431 并读取云数据库,而无需在客户端上安装任何 SSH 软件。使用 iptables 打开端口 5431 不起作用。
iptables -A INPUT -p tcp -s 0/0 --sport 1024:65535 -d 192.168.128.5 --dport 5431 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 192.168.128.5 --sport 5431 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
已经尝试过
ssh -N -f -L 5431:0.0.0.0:xxxx mycloudserver.com
也是。隧道已成功建立并在服务器上运行,但我无法“看到”来自客户端的连接。
答案1
您需要修改命令以指定 bind_address,例如:
ssh -N -f -L 0.0.0.0:5431:localhost:xxxx mycloudserver.com
这将使其监听所有接口。要验证,请使用:
netstat -lnp | grep 5431
答案2
这确实是错误的方法。不要使用 SSH 隧道。相反,在云服务器上设置 SSL 并建立直接 SSL 连接,如果需要,可以使用 IP 地址限制。
或者,如果您必须使用 VPN,请使用专为该角色设计的 VPN,而不是将 ssh 混入到工作中。
SSH 通过 TCP 隧道传输 TCP,这会导致拥塞控制、重传和窗口缩放算法出现问题。对于临时工作来说,这是一个很好的工具,但我不建议在生产环境中使用大量带宽。
如果你真的必须*
,那么你就可以在 中使用 的绑定地址-L
,例如
-L *:5431:localhost:xxxx
或者GatewayPorts yes
在.ssh/config
该主机中设置,或者通过-o
命令行选项设置,例如:
-o GatewayPorts=yes