通过代理与 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
...
对于CentOS,nc
和invalid 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 我使用-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
和带有--proxy
的ncat 可以完美地工作。
【讨论】:
【参考方案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-netcat
(pacman
在询问后删除了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-netcat
和GNU-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.22
和8118
是我代理服务器的地址和端口,你应该根据你的服务器地址更改。
一切正常。
谢谢@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 连接的主要内容,如果未能解决你的问题,请参考以下文章
如何强制 Git 通过其 ssh 连接使用 socks 代理?
Spring boot Resttemplate通过ssh隧道的动态代理设置连接不识别远程DNS