通过代理连接SSH

115

我在这里做什么其实并不清楚,请您谅解,如果您能帮助我,我会非常感激!

我正在尝试通过代理连接到我的虚拟服务器,但无法连接,连接就一直挂着。我猜测这是因为无法通过我们的代理。

我在家也尝试了完全相同的操作,效果完美。我使用Terminal在OS X上进行连接。

请问有人可以指导我如何通过SSH穿过代理吗?


你目前是如何尝试通过代理连接的? - Richard Christensen
2
你应该在ServerFault或SuperUser上提问,这样你会得到更好的回答。 - Spencer Kormos
2
请接受答案。 - Millemila
2
对于那些尝试使用netcat的人:**你需要使用openbsd软件包!!! netcat-openbsd ** https://www.linuxquestions.org/questions/linux-newbie-8/how-to-sftp-using-a-socks-v5-proxy-789824/#post3867664 - Y00
1
netcat 在 Mac/Linux/openbsd 上有不同的实现,请注意它们参数之间的差异,并将适用于您版本的一份复制粘贴! - Y00
16个回答

127

以下是将Richard Christensen的解答转化为一行代码的方法,不需要编辑文件(将大写字母替换为自己的设置,PROXYPORT通常为80):

 ssh USER@FINAL_DEST -o "ProxyCommand=nc -X connect -x PROXYHOST:PROXYPORT %h %p"

您也可以对scp使用相同的-o ...选项,详情请参见我的superuser答案


如果您在OS X上遇到此问题:

 nc: invalid option -- X
 Try `nc --help' for more information.

可能你不小心使用了Homebrew版本的netcat(可以通过运行which -a nc命令来查看--/usr/bin/nc应该是第一个)。 如果有两个版本,则一种解决方法是指定您想要的nc的完整路径,例如ProxyCommand=/usr/bin/nc...


对于CentOSnc存在与invalid option --X相同的问题。 connect-proxy是一个替代方案,可以使用yum轻松安装并且可用。

ssh -o ProxyCommand="connect-proxy -S PROXYHOST:PROXYPORT %h %p" USER@FINAL_DEST

17
我使用 Arch Linux 并安装了 GNU netcat,但是出现了“nc: invalid option -- X”的错误。解决此问题的方法是将 GNU netcat 替换为 OpenBSD netcat。具体详情请参考 https://pagekite.net/wiki/Howto/SshOverPageKite/#wrongnetcat 。这两个版本可能会产生冲突。 - Han
1
有点偏题,但是通过这个连接也可以打开一个隧道(删除所有的“<”和“>”,并将“localhost”保持不变):ssh -l <final_destination_user> -L <tunnel_local_port_number>:localhost:<tunnel_final_destination_port> <final_destination> -o "ProxyCommand=nc -X connect -x <proxy_host>:<proxy_port> %h %p" - Pascal
2
@Petr,--proxy命令可能适合您。编辑:向下滚动并注意到shoaly的答案中有一个示例。 - Joseph
2
我收到了以下错误信息:“nc: 代理错误: "HTTP/1.0 403 Forbidden" ssh_exchange_identification: 远程主机关闭连接”,该怎么办? - Nike
4
对于没有“-X”选项的CentOS 7系统中的ncat,我使用了以下构造:ssh REMOTEUSER@REMOTEHOST -o "ProxyCommand=ncat REMOTEHOST 22 --proxy PROXYHOST:PROXYPORT --proxy-type http"。例如:ssh user123@ssh.othercomany.com -o "ProxyCommand=ncat ssh.mycomany.com 22 --proxy proxy.mycomany.com:80 --proxy-type http"。 - Sergey Beloglazov
显示剩余9条评论

48

如果您经常使用 SSH 代理连接,您不必每次都将它们作为参数传递。您可以将以下行添加到~/.ssh/config中。

Host foobar.example.com
    ProxyCommand          nc -X connect -x proxyhost:proxyport %h %p
    ServerAliveInterval   10

连接使用以下步骤:

ssh foobar.example.com

Source here


我尝试过了,但没有成功。要注意的是,我不太确定需要放什么,但大概是这样:Host 159.23.191.23 ProxyCommand nc -x connect -x 10.3.50.01:22 %h %p ServerAliveInterval。这样对吗? - bencarter78
我只想补充一下,这个解决方案对我来说非常完美。我的当前工作场所部署了HTTP代理,我只需用IP(不加模式!)替换proxyhost,将proxyport替换为--在这种情况下--8080。 - Pit
1
这个答案只能告诉你可以传递的命令已经在配置文件中定义好了(或者可以定义),但你不需要显式地将它写入文件。你只需将参数传递给ssh连接命令即可。 - m3nda
1
对于CENTOS/RedHat系统:ProxyCommand connect-proxy -H proxyhost:proxyport %h %p。请检查connect-proxy选项-H/-T/-S,并根据代理服务器使用正确的选项。最可能的选项是-H或-S,请尝试两种组合。 - yolob 21
1
"nc: invalid option -- 'x'" 对于 -X 也是一样。我查了一下 nc -h,但不知道这些选项代表什么意思。找不到如何替换它们。 - Hedwin Bonnavaud

35

我使用 -o "ProxyCommand=nc -X 5 -x proxyhost:proxyport %h %p" ssh 选项在 OSX 上通过 socks5 代理连接。


2
你的答案是唯一在 macOS 1.12 上有效的。我已将其添加到我的ssh配置中: ProxyCommand nc -X 5 -x proxyhost:proxyport %h %p - Deniz
2
在Ubuntu 16.04上完美运行。谢谢! - Alexey Kislitsin

26

针对@rogerdpack的回答,只是一些备注:对于Windows平台而言,确实很难找到具有-X(http_proxy)选项的nc.exe。但我已经找到可以替代ncncat,完整示例如下:

Host github.com
     HostName github.com
         #ProxyCommand nc -X connect -x 127.0.0.1:1080 %h %p
         ProxyCommand ncat --proxy 127.0.0.1:1080 %h %p
     User git
     Port 22
     IdentityFile D:\Users\Administrator\.ssh\github_key

使用 ncat--proxy 参数可以完美地工作。


如果你使用ncat,你的系统管理员会立即采取行动。 - Steve Scott

9

对于 Windows,@shoaly 的参数并没有完全适用于我。我一直收到这个错误:

NCAT DEBUG: Proxy returned status code 501.
Ncat: Proxy returned status code 501.
ssh_exchange_identification: Connection closed by remote host

我想ssh到一个远程服务器,但由于我的网络中SSH端口已经关闭。我找到了两种解决方法,但第二种更好。

  • To solve the problem using Ncat:

    1. I downloaded Tor Browser, run and wait to connect.
    2. I got Ncat from Nmap distribution and extracted ncat.exe into the current directory.
    3. SSH using Ncat as ProxyCommand in Git Bash with addition --proxy-type socks4 parameter:

      ssh -o "ProxyCommand=./ncat --proxy-type socks4 --proxy 127.0.0.1:9150 %h %p" USERNAME@REMOTESERVER
      

      Note that this implementation of Ncat does not support socks5.

  • THE BETTER SOLUTION:

    1. Do the previous step 1.
    2. SSH using connect.c as ProxyCommand in Git Bash:

      ssh -o "ProxyCommand=connect -a none -S 127.0.0.1:9150 %h %p"
      

      Note that connect.c supports socks version 4/4a/5.

要在使用ssh的git命令中使用代理(例如在使用GitHub时)— 假设您已经在C:\Program Files\Git\中安装了Git Bash — 打开~/.ssh/config并添加以下条目:

host github.com
    user git
    hostname github.com
    port 22
    proxycommand "/c/Program Files/Git/mingw64/bin/connect.exe" -a none -S 127.0.0.1:9150 %h %p

它可以工作,但你需要在mingw shell中运行git命令,而不是在Windows命令行中。 - Sofair R.
Sofair是正确的。你可以用localhost代替127.0.0.1 - Cadoiz

4
在OpenSSH 7.3之后,最简单的方法是使用ProxyJump:
ssh USERNAME@HOSTNAME -J PROXYHOSTNAME

这是代理命令的简写,下面是旧客户端上可用的ProxyCommand:
ssh USERNAME@HOSTNAME -o "ProxyCommand=ssh PROXYHOSTNAME -W %h:%p"

或者在您的ssh配置文件中($HOME/.ssh/config):

Host HOSTNAME
User USERNAME
ProxyCommand ssh PROXYHOSTNAME -W %h:%p

最老的客户端需要使用 netcat。具体取决于 netcat 的版本和支持的选项(请参阅其他答案)。


根据OpenSSH wikibook,你的答案是更好的选择。现在几乎每个人都应该拥有OpenSSH > 7.3,这是在2016年8月发布的!然而,在我的情况下它并没有起作用,显示Squid does not support some access protocols. For example, the SSH protocol is currently not supported - winkmal
Squid是一个Web代理,它告诉你它不知道如何处理SSH。相反,你可以通过SSH服务器代理SSH连接,例如通过堡垒机。 - Angelo

4

我使用proxychains-ng中的proxychains ssh user@host命令。默认情况下,它将使用位于127.0.0.1:9050socks4代理,但是您可以在/etc/proxychains.conf配置文件中更改它,或者像这样指定另一个配置文件:proxychains -f custom.conf


proxychains 在需要身份验证的 socks 代理中非常有用,而 nc 无法处理它。 - Id2ndR

3
ProxyCommand nc -proxy xxx.com:8080 %h %p

移除 -X connect 并使用 -proxy 替代。

这对我来说是起作用的。


3
$ which nc
/bin/nc

$ rpm -qf /bin/nc
nmap-ncat-7.40-7.fc26.x86_64

$ ssh -o "ProxyCommand nc --proxy <addr[:port]> %h %p" USER@HOST

$ ssh -o "ProxyCommand nc --proxy <addr[:port]> --proxy-type <type> --proxy-auth <auth> %h %p" USER@HOST

ssh -o "ProxyCommand nc --proxy <addr[:port]> %h %p" USER@HOST请将上述命令翻译为中文: - Sérgio
1
关于添加一些关于它如何工作的信息怎么样?它在LQP中显示了。 - fedorqui

3

这是我解决问题的方法,希望能帮助其他人。

我的系统是debian 10,且进行了最小安装。

我也遇到了同样的问题。

git clone git@github.com:nothing/nothing.git
Cloning into 'nothing'...
nc: invalid option -- 'x'
nc -h for help
ssh_exchange_identification: Connection closed by remote host
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.


git clone git@github.com:nothing/nothing.git
Cloning into 'nothing'...
/usr/bin/nc: invalid option -- 'X'
nc -h for help
ssh_exchange_identification: Connection closed by remote host
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

我知道nc有不同的版本,例如openbsd-netcatGNU-netcat,你可以在debian中将nc更改为openbsd版本,但我选择更改类似corkscrew这样的软件,因为系统中这两个版本的nc名称相同,许多人不太理解。我的方法如下。

sudo apt install corkscrew

然后。

vim ~/.ssh/config

将这个文件改为这样。

Host github.com
    User git
    ProxyCommand corkscrew 192.168.1.22 8118 %h %p

192.168.1.228118 是我的代理服务器地址和端口,您应该根据自己的服务器地址进行更改。

它工作得很好。

感谢@han


在Ubuntu 18.04和DietPi上对我有用。有点遗憾的是凭据必须存储在外部文件中。 - Emanuel George Hategan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接