在Firefox 47.0 / Kubuntu 16.04上,通过SSH隧道的SOCKS代理连接被拒绝。

我在使用Firefox通过隧道化的SOCKS代理连接网站时遇到了困难。无论是SOCKS4还是SOCKS5都没有区别。
我使用以下命令设置了隧道:
ssh -D 1234 id@remotehost.example.com
然后将Firefox的SOCKS代理指向本地主机的tcp/1234端口。
需要注意的一点是,我正在设置的隧道是一个我多年来一直在使用的远程服务器。我已经在各种不同平台和所有主要操作系统上通过它代理了FF和其他浏览器的成千上万个会话。一旦我让它工作起来,它总是运行得很顺畅。然而,在这个特定的FF实例中,我遇到了奇怪且间歇性的问题。
问题是FF似乎不愿意建立连接。我输入URL或点击链接后,我立即收到"无法连接" / "Firefox无法与服务器建立连接..."的提示。当我说"立即"时,我的意思是这个提示在几分之一秒内就弹回给我。
所以我点击“再试一次”或者小箭头重新加载。然后我一遍又一遍地重复这个动作,尽可能快地进行操作。经过几次尝试之后——有时是3-4次,有时多达15-20次——我终于建立了连接,一切都正常工作了!所以隧道/ SOCKS 连接是可用的,只是火狐浏览器不愿意使用它,除非被逼迫才会这样做。一旦我建立了连接,进一步的重新加载不会导致连接丢失。
我安装了一些附加组件,但是 a) 我已经有选择性地禁用它们,但没有帮助,b) 我当然也尝试了安全模式。但是没有任何改变。
有什么建议吗?
2个回答

我每天在工作中都必须使用代理才能连接到防火墙另一侧的服务器。我还使用Firefox、Chrome和Ubuntu 16.04。
编辑:我忘了这个的一部分。我不得不在ssh配置文件中添加一个超时,否则我的隧道会超时并且我会失去连接。一旦我添加了以下内容,我的连接就保持打开:
~/.ssh/config中添加以下信息(如果文件不存在,请创建它)。这将每15秒向您的隧道发送服务器保持活动信号。
Host *
ServerAliveInterval 15

我用以下命令打开我的隧道连接:
ssh -CfND 1234 username@proxyhost

然后在Firefox中,在“连接设置”下的“手动代理配置”中,我只填写了“SOCKS主机:”为127.0.0.1和“端口:”为1234。然后我确保选择了“SOCKS v5”。还要注意的是,“无代理”框中没有任何内容。
这样,我可以顺利地连接到我的主机。

enter image description here

然后对于Chrome,我运行一个命令行,这样我就不必每次想要通过代理连接时都要设置Chrome的设置,然后取消代理。为了将Chrome连接到代理,我运行以下命令行:
nohup google-chrome-stable --proxy-server="socks5://127.0.0.1:1234" & > /dev/null 2>&1

from ssh manpage

 -C      Requests compression of all data (including stdin, stdout,
         stderr, and data for forwarded X11, TCP and UNIX-domain connec‐
         tions).  The compression algorithm is the same used by gzip(1),
         and the “level” can be controlled by the CompressionLevel option
         for protocol version 1.  Compression is desirable on modem lines
         and other slow connections, but will only slow down things on
         fast networks.  The default value can be set on a host-by-host
         basis in the configuration files; see the Compression option.

 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

 -N      Do not execute a remote command.  This is useful for just for‐
         warding ports.

 -D [bind_address:]port
         Specifies a local “dynamic” application-level port forwarding.
         This works by allocating a socket to listen to port on the local
         side, optionally bound to the specified bind_address.  Whenever a
         connection is made to this port, the connection is forwarded over
         the secure channel, and the application protocol is then used to
         determine where to connect to from the remote machine.  Currently
         the SOCKS4 and SOCKS5 protocols are supported, and ssh will act
         as a SOCKS server.  Only root can forward privileged ports.
         Dynamic port forwardings can also be specified in the configura‐
         tion file.

希望这对你有所帮助!

我已经给这个点赞了,但还没有标记为答案。我按照你的建议尝试了使用-CfND进行ssh会话。在Chromium中运行良好。然后我去掉了-f-N,它仍然正常工作。然后我去掉了-C,它仍然正常工作。然后我回到Firefox,现在它完美地工作了——尽管我没有做任何改变!可能与我在实验时使用了端口1234有关(就像你的示例中一样)。这对我来说毫无意义;我仍在研究这个问题。不过还是谢谢你的帮助。很高兴知道Chromium有命令行选项。 - JD Baldwin
@JDBaldwin 非常欢迎!祝你的实验好运。=) - Terrance
好的,我将把你的回答标记为“最佳答案”。这并不是因为我解决了我的问题(我会添加一个未标记的答案来解释这个问题),而是因为这个解释非常好,清晰地说明了如何做到这一点。如果有人想要一个客观的推荐,关于一个提供这种以及其他优秀(基于NetBSD)服务的Shell提供商,年费为100美元,请给我发私信。 - JD Baldwin
@JDBaldwin 我更新了我的回答,补充了一个我之前忘记提到的点,当我看到你关于超时的回答时想起来的。 - Terrance
我会尝试使用.ssh/config的新增内容,并尝试以旧的方式进行隧道传输。(这可能解释了为什么PuTTY可以工作,因为我在那里设置了30秒的保持活动时间。)我会相应地更新我的答案。谢谢。 - JD Baldwin
我错误地在Firefox代理设置的所有字段中输入了SOCKS v5地址,结果发现我只需要在“SOCKS主机”字段中输入它。 - Kong Chun Ho

很不幸,这个问题是间歇性的,这让我在解决问题时感到困惑。上面@Terrance给出的答案,我标记为“答案”,实际上对我来说并不是解决问题的办法。它似乎起作用了一段时间,然后又出现了问题。有时候停止我的ssh会话然后重新启动可以暂时解决问题,而有时候重新启动没有任何效果。
在其他地方提到的建议此线程——即在浏览器的代理设置中指定127.0.0.1而不是“localhost”——看起来也有所改变,但最终无效。我之前回答说这是浏览器连接工作和不工作的关键区别,但这是过早的结论。我继续遇到浏览器通过隧道与网站建立连接的间歇性问题。
我现在已经获得了足够多的关于这个问题以及下面提到的解决方案的经验,我相当有信心得出结论:OpenSSH本身存在某种短超时错误。顺便说一下,我的版本是
OpenSSH_7.2p2 Ubuntu-4ubuntu1,OpenSSL 1.0.2g-fips 2016年3月1日
我基于以下两个事实来做出这个判断:a)问题明显与浏览器无关(在Firefox、Chromium和w3m中验证过),b)使用其他ssh客户端可靠地解决了问题。
我下载了源代码并构建并安装了PuTTY(从this link)。注意:确保安装了虚拟包gtkgl-dev,以便PuTTY源代码可以找到头文件。然后,我按照过去在Windows上的设置方式进行设置,现在已经运行良好约两天了。没有任何失败。
我相信这是修复方法,并且当前的OpenSSH存在一个bug。我将着手撰写一份报告。
对于这个问题,我选择了自己的答案作为答案,尽管上面@Terrence的答案仍然非常有用。