通过代理连接SSH


71

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

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

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

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


您目前如何尝试通过代理连接?
理查德·克里斯滕森

2
您应该在ServerFault或SuperUser中问这个问题。另外,您将获得更好的响应。
Spencer Kormos 2014年

2
请接受答案
Millemila '16

对于那些尝试使用netcat的人:**您需要使用openbsd软件包!netcat-openbsd ** linuxquestions.org
questions/

netcat在Mac / Linux / openbsd上具有不同的实现,请注意它们的参数之间的差异,并为您自己的版本复制粘贴一个参数!
Y00

Answers:


82

理查德·克里斯滕森(Richard Christensen)的一线回答,无需文件编辑(用您自己的设置大写替换,PROXYPORT通常为80),这是以下方法:

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

您也可以-o ...对scp使用相同的选项,请参见https://superuser.com/a/752621/39364

如果在OS X中得到此信息:

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

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

对于CentOSnc也有同样的问题invalid option --Xconnect-proxy是一种替代方案,易于安装,易于使用yum和使用-

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

10
我在gnu-netcat中使用arch linux,并且nc: invalid option -- X仍然存在。解决此问题的方法是将gnu-netcat替换为openbsd-netcat。有关详细信息,请参见pagekite.net/wiki/Howto/SshOverPageKite/#wrongnetcat。这两个版本可能彼此冲突。
汉(Han)

1
有点话题,但也可以通过此连接打开隧道(删除所有“ <”和“>”,并保持“ localhost”不变):ssh -l <​​final_destination_user> -L <tunnel_local_port_number>:localhost:< tunnel_final_destination_port> <最终目标> -o“ ProxyCommand = nc -X connect -x <代理主机>:<代理端口>%h%p”
Pascal

2
@Petr,--proxy命令可能对您有用。编辑:向下滚动并注意到一个示例在shoaly的答案中。
约瑟夫

1
我得到:“ nc:代理错误:“ HTTP / 1.0 403禁止访问” ssh_exchange_identification:连接被远程主机关闭”我该怎么办?
user1271772

1
对于CentOS 7,对于ncat我没有“ -X”选项,我使用以下结构: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

30

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

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

然后连接使用

ssh foobar.example.com

资源:

http://www.perkin.org.uk/posts/ssh-via-http-proxy-in-osx.html


我试过了,但是没用。请注意,我不确定自己需要放入什么,但它类似于主机159.23.191.23 ProxyCommand nc -x connect -x 10.3.50.01:22%h%p ServerAliveInterval。是对的吗?
bencarter78

我只是想补充一点,该解决方案对我来说确实很完美。我现在的工作部署HTTP的代理和我简单地更换proxyhost由IP(不加模式!)和proxyport通过-在这种情况下- 8080

1
这个答案只能告诉某人您可以传递的命令已经(或可以定义)在它的配置文件中,但是您不必显式地将其写入文件。您可以仅将参数传递给ssh connect命令。
m3nda '16

24

我使用-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

12

Windows平台上的@rogerdpack真的很难找到带有-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

和带有--proxy的ncat可以完成完美的工作


6

对于Windows,@ shoaly参数对我而言并不完全有效。我收到此错误:

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

我想通过SSH连接到REMOTESERVER,并且我的网络中的SSH端口已关闭。我找到了两种解决方案,但第二种更好。

  • 要使用Ncat解决问题,请执行以下操作:

    1. 我下载了Tor浏览器,运行并等待连接。
    2. 我从Nmap发行版中获得了Ncat,并将其提取到当前目录中。ncat.exe
    3. Git Bash中使用Ncat作为ProxyCommand的SSH ,其附加--proxy-type socks4参数为:

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

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

  • 更好的解决方案

    1. 执行上一步骤。
    2. 在Git Bash中使用connect.c作为ProxyCommand的SSH:

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

      请注意,connect.c支持袜子版本4 / 4a / 5。

要在git使用ssh的命令中使用代理(例如,在使用GitHub时)(假设您在其中安装了Git Bash),请C:\Program Files\Git\打开~/.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 R.19.27.19

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 [:端口]>%H%P” USER @ HOST
塞尔吉奥

1
如何添加有关其工作原理的信息?它在LQP中显示
fedorqui'SO停止伤害


1

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

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-netcat(询问后将其pacman删除gnu-netcat,因为它与冲突openbsd-netcat)。乍一看,并检查相应的手册页,openbsd-netcatUbuntunetcat似乎非常相似,特别是在选项-X和方面-x。有了这个,我没有任何问题。


哪里1080可以socks5 port
摩天(


0

就我而言,由于我在途中有一个跳转主机或堡垒主机,并且由于这些堡垒节点上的签名自从它们导入到known_hosts文件后就发生了更改,因此我只需要从以下文件中删除这些条目/行:

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

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


0

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


0

这就是我解决的方法,希望以后能帮助其他人。

我的系统是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的对OpenBSD版本改变NC,但我选择改变之类的软件corkscrew,因为数控系统两个版本的名称是相同的,许多人不太了解。我的方法如下。

sudo apt install corkscrew

然后。

vim ~/.ssh/config

像这样更改此文件。

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

192.168.1.22并且8118是我的代理服务器的地址和端口,您应该根据服务器地址进行更改。

很好

谢谢@han

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.