通过代理与 SSH 连接

Posted

技术标签:

【中文标题】通过代理与 SSH 连接【英文标题】:Connect with SSH through a proxy 【发布时间】:2013-10-10 07:33:24 【问题描述】:

我不知道我在这里做什么,所以如果你能帮助我,请记住这一点!

我正在尝试通过代理连接到我的虚拟服务器,但我无法连接,它只是挂起。我假设这是因为它没有通过我们的代理。

我在家里尝试过完全相同的东西,而且效果很好。我在 OSX 上使用终端进行连接。

谁能告诉我如何使用 SSH 通过代理?

【问题讨论】:

您目前如何尝试通过代理进行连接? 您应该在 ServerFault 或 SuperUser 中询问此问题。另外,您会得到更好的响应。 请采纳答案 对于那些尝试使用netcat的人:**你需要使用openbsd包!!! netcat-openbsd ** linuxquestions.org/questions/linux-newbie-8/… netcat 在 Mac/Linux/openbsd 上有不同的实现,请注意参数的不同,复制粘贴为你自己的版本! 【参考方案1】:

如果要经常使用 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。对吗? 我只是想补充一点,这个解决方案确实非常适合我。我目前的工作场所部署了 HTTP 代理,我只是将 proxyhost 替换为 IP(不添加架构!),将 proxyport 替换为 -- 在这种情况下 -- 8080。 这个答案只能告诉别人您可以传递的命令已经(或可以定义)在它的配置文件中,但您不必明确将其写入文件。您可以将参数传递给 ssh connect 命令。 对于 CENTOS/RedHat:ProxyCommand connect-proxy -H proxyhost:proxyport %h %p。请检查连接代理选项 -H/-T/-S 并根据代理服务器使用正确的选项。他们很可能是 -H 或 -S,试试这两种组合【参考方案2】:

这里是如何将 Richard Christensen 的 answer 做为单行,无需文件编辑(用您自己的设置替换大写,PROXYPORT 通常为 80):

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

您也可以为 scp 使用相同的-o ... 选项,请参阅my superuser answer。


如果你在 OS X 中得到这个:

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

可能是您不小心使用了自制版本的netcat(您可以通过执行which -a nc 命令查看--/usr/bin/nc 应该首先列出)。如果有两个,那么一种解决方法是指定所需的 nc 的完整路径,例如 ProxyCommand=/usr/bin/nc ...


对于CentOSncinvalid option --X 有同样的问题。 connect-proxy 是另一种选择,使用 yum 易于安装并且可以使用 --

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

【讨论】:

我使用带有 gnu-netcat 的 arch linux 并且 nc: invalid option -- X 仍然存在。这个问题的解决方法是用openbsd-netcat替换gnu-netcat。有关详细信息,请参阅pagekite.net/wiki/Howto/SshOverPageKite/#wrongnetcat。这两个版本可能相互冲突。 有点跑题了,但也可以通过此连接打开隧道(删除所有''并保持'localhost'不变):ssh -l - L :localhost: -o "ProxyCommand=nc -X connect -x : %h %p" @Petr, --proxy 命令可能对你有用。编辑:向下滚动并注意到浅滩的答案中有一个例子。 我得到:“nc: Proxy error: "HTTP/1.0 403 Forbidden" ssh_exchange_identification: Connection closed by remote host" 我该怎么办? 对于 CentOS 7,我没有 ncat 的“-X”选项,我使用了以下结构: ssh REMOTEUSER@REMOTEHOST -o "ProxyCommand=ncat REMOTEHOST 22 --proxy PROXYHOST:PROXYPORT --代理类型http”。例如:ssh user123@ssh.othercomany.com -o "ProxyCommand=ncat ssh.mycomany.com 22 --proxy proxy.mycomany.com:80 --proxy-type http"【参考方案3】:

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

【讨论】:

您的答案是唯一适用于 macOS 1.12 的答案。我在我的 ssh 配置中添加了它:ProxyCommand nc -X 5 -x proxyhost:proxyport %h %p 在 Ubuntu 16.04 上完美运行谢谢!【参考方案4】:

只是对@rogerdpack's answer的评论:对于windows平台,确实很难找到带有-X(http_proxy)nc.exe,但是,我发现nc可以替换为ncat,完整示例如下:

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

和带有--proxyncat 可以完美地工作。

【讨论】:

【参考方案5】:
$ 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 %h %p" USER@HOST 添加一些有关其工作原理的信息怎么样?它显示在 LQP 中【参考方案6】:

在我的情况下,因为我在途中有一个跳转主机或堡垒主机,并且因为这些堡垒节点上的签名在它们被导入 known_hosts 文件后发生了变化,我只需要从以下文件中删除这些条目/行:

/Users/a.abdi-kelishami/.ssh/known_hosts

从上面的文件中,删除那些引用堡垒主机的行。

【讨论】:

【参考方案7】:

我在 Ubuntu 下的 .ssh/config 中使用了以下几行(可以用​​合适的命令行参数替换)

Host remhost
  HostName      my.host.com
  User          myuser
  ProxyCommand  nc -v -X 5 -x proxy-ip:1080 %h %p 2> ssh-err.log
  ServerAliveInterval 30
  ForwardX11 yes

与Msys2一起使用时,安装gnu-netcat后,文件ssh-err.log显示选项-X不存在。 nc --help 证实了这一点,并且似乎表明没有其他选择来处理代理。

所以我安装了openbsd-netcatpacman 在询问后删除了gnu-netcat,因为它与openbsd-netcat 冲突)。乍一看,检查各自的手册页,openbsd-netcat 和 Ubuntu netcat 似乎非常相似,特别是在选项 -X-x 方面。 有了这个,我连接没有问题。

【讨论】:

其中1080 可以是socks5 port【参考方案8】:
ProxyCommand nc -proxy xxx.com:8080 %h %p

删除-X connect 并改用-proxy

为我工作。

【讨论】:

【参考方案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 端口已关闭。我找到了两个解决方案,但第二个更好。

使用 Ncat 解决问题:

    我下载了Tor Browser,运行并等待连接。 我从Nmap distribution 得到Ncat 并将ncat.exe 解压到当前目录中。

    SSH 使用 Ncat 作为 ProxyCommand 在 Git Bash 中添加 --proxy-type socks4 参数:

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

    请注意,此 Ncat 实现不支持 socks5。

更好的解决方案

    执行上一步 1。

    在 Git Bash 中使用 connect.c 作为 ProxyCommand 进行 SSH:

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

    请注意,connect.c 支持 socks 版本 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而不是windows命令行中运行git命令 Sofair 是对的。除了127.0.0.1,你也可以使用localhost【参考方案10】:

我用proxychains ssh user@host;来自proxychains-ng. 默认情况下,它在127.0.0.1:9050 使用 socks4 代理,但可以在 conf 文件 /etc/proxychains.conf 中更改它,或者您可以像这样指定另一个 conf 文件:proxychains -f custom.conf

【讨论】:

proxychains 对于 nc 无法处理的经过身份验证的 socks 代理也很有用。【参考方案11】:

尝试-o "ProxyCommand=nc --proxy HOST:PORT %h %p" 获取有问题的命令。它适用于 OEL6,但需要按照 OEL7 所述进行修改。

【讨论】:

【参考方案12】:

我就是这样解决的,希望以后能帮到别人。

我的系统是 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。

【讨论】:

【参考方案13】:

如果有人在 CentOS / RHEL 上得到

nc: invalid option -- 'X'

使用这个代理命令

ProxyCommand nc --proxy  HOST:PORT --proxy-type http %h %p

【讨论】:

这已经是mentioned in this answer 并且也适用于OS X

以上是关于通过代理与 SSH 连接的主要内容,如果未能解决你的问题,请参考以下文章

通过代理PHP连接SSH

如何强制 Git 通过其 ssh 连接使用 socks 代理?

Spring boot Resttemplate通过ssh隧道的动态代理设置连接不识别远程DNS

通过命令行通过 SOCKS5 代理打开 putty ssh 连接

ssh隧道代理连接

SSH 通过代理连接服务器