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

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

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

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

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

【问题讨论】:

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

标签: ssh proxy terminal


【解决方案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 解决问题:

          1. 我下载了Tor Browser,运行并等待连接。
          2. 我从Nmap distribution 得到Ncat 并将ncat.exe 解压到当前目录中。
          3. 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. 执行上一步 1。
          2. 在 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
            

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-28
            • 1970-01-01
            • 2022-09-29
            • 2020-10-12
            • 2020-09-14
            • 2016-08-20
            相关资源
            最近更新 更多