我想不出任何使用ssh -L
比使用更好的用例ssh -D
。我知道ssh -R
对于某些网络设置来说确实很有用,但似乎ssh -D
可以做任何事情ssh -L
。
但是,我们已经有了这个选项-L
,并且对于某些情况来说,它一定是更好的(或唯一的)解决方案,对吧?
答案1
简单的答案是并非所有程序都支持 SOCKS,这是使用 所必需的-D
。它们中的绝大多数要么仅支持 HTTP CONNECT 代理,要么根本没有代理设置——它们只需要一个地址和端口即可直接访问服务器,仅此而已。
为了能够使用这些程序ssh -D
,您将需要一个中间层,当这些程序想要连接到某个地方时,该中间层可以代表这些程序使用 SOCKS。
当然,这样的层是存在的,但现在你添加了两个相互抵消的额外层。在许多情况下,程序只需要通过隧道联系一个主机,这只是不必要的复杂性。
答案2
本地 TCP 转发可用于将 Unix 域套接字从远程主机转发到本地。当您想要连接到数据库时,这非常有用,该数据库仅公开本地套接字,而不是 TCP 端口,并且您想要安全地访问它。您无法使用 SOCKS 代理来做到这一点。
例子:
ssh -L /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysqld.sock mysql-server