【问题标题】:How to force Git to use socks proxy over its ssh connection?如何强制 Git 通过其 ssh 连接使用 socks 代理?
【发布时间】:2020-02-03 07:33:28
【问题描述】:

互联网上有大量相同的解决方案可以为 git 的下载定义代理隧道,例如 this 之一,这都是通过设置 git 的 https.proxyhttp.proxy 配置来实现的。但是当您尝试通过ssh 协议clone/push/pull 等时,这些答案不起作用!

例如,通过设置git config --global https.proxy socks5://127.0.0.1:9999,当您尝试克隆git clone git@github.org:user/repo.git 时,它不会通过定义的sock5 隧道!

我尝试了各种方法,但都没有奏效!

问题:

当 git 使用 ssh 连接时,如何设置 git 使用本地 socks5 代理(例如 127.0.0.1:9999)?

【问题讨论】:

    标签: git ssh proxy ssh-tunnel


    【解决方案1】:

    你需要先定义GIT_SSH_COMMAND environment variable

    在其中,你可以重新定义 ssh 命令,以便使用你的 socks 代理设置

    ssh -D $port_number $hostname
    # or
    ssh -D $port_number $username@$hostname
    

    using a proxycommand nc(或ncat on Windows

    重点是:一旦 ssh 与您的 socks5 代理一起工作,您可以在 GIT_SSH_COMMAND 中定义相同的语法,Git 将使用正确的 ssh 命令。

    您也可以使用本地配置对其进行测试:

    git -c core.sshCommand='ssh -D 9998 user@host.com' git pull
    git -c core.sshCommand='ssh -D 9999 127.0.0.1' git pull
    

    【讨论】:

    • 谢谢你的回答,我想不出你的解决方案,假设我有hostusersh -D 9999 -C -N user@host.com 设置我的socks5 代理;根据您的指示,我尝试了以下操作:GIT_SSH_COMMAND='ssh -D 9998 user@host.com' git pull(系统中没有运行代理隧道)和GIT_SSH_COMMAND='ssh -D 9999 127.0.0.1' git pull(当代理在端口:本地主机上的 9999 上运行时)都没有成功。也许我做错了,你能好心写一份副本和过去的解决方案吗? [上述方法均未通过代理获得连接!]
    • 你是什么操作系统,操作系统版本,shell,shell版本,Git版本?
    • 操作系统:Ubuntu 18.04 外壳:GNU bash, version 4.4.20 git:2.23.0
    • @dariush 您的 ssh 是否通过代理工作,而不使用 Git?
    • 刚刚更新了我的评论,误按回车换行并提交了评论
    【解决方案2】:

    访问了这么多页面后,我终于找到了我的问题的解决方案:

    # [step 1] create a ssh-proxy
      ssh -D 9999 -qCN user@server.net
    
    # [step 2] make git connect through the ssh-proxy
      # [current script only]
      export GIT_SSH_COMMAND='ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"'
      # OR [git global setting] 
      git config --global core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"'
      # OR [one-time only use]
      git clone -c=core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"' git@github.com:user/repo.git
      # OR [current repository use only]
      git config core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"'
    

    在 Ubuntu 上安装 connect

    sudo apt install connect-proxy
    

    【讨论】:

    • 好收获。赞成。 connect 加上建议的 core.sshCommand 确实有效。
    【解决方案3】:

    git 自己的git --config 'http.proxy=socks5://127.0.0.1:4444'ssh_configproxycommand 使用socatnc 技术成功地通过SOCKS 代理重新路由git 命令。

    但是,问题可能是 DNS 查找失败,因为查找是在本地完成的,而不是通过 SOCKS 代理远程完成的。例如,在 Intranet 的情况下,服务器可能没有 Internet 上的域名(只有 Intranet DNS 知道)。

    有两种方法可以解决这个问题。第一个我见过多次推荐,但它雄心勃勃地假设您控制远程服务器。

    1. 将本地 53 流量 (DNS) 重新路由到端口 X,将其转发到端口 Y 的服务器,将端口 Y 转发到服务器上的 53。为简单起见,通常 X=Y。

    2. 拦截检索名称 IP 地址的本地系统调用。

    我认为 2. 更好,因为它从源头上捕获问题,并且只假设您控制本地计算机,这比控制远程服务器更有可能。

    proxychains-ng 在访问您的本地 nss 之前拦截 getaddrinfo 系统调用。

    步骤

    打开一个 SOCKS5 端口

    ssh -v -NT -D 127.0.0.1:4444 intranethost
    

    设置 proxychains 以使用该端口。

    ~/.proxychains/proxychains.conf

    strict_chain
    proxy_dns
    tcp_read_time_out 150000
    tcp_connect_time_out 80000
    
    [ProxyList]
    socks5 127.0.0.1 4444
    

    使用代理链封装git。

    alias gitproxy='proxychains git'
    gitproxy clone intranethost:path/to/repo.git
    

    采用这条路线的美妙之处在于,这对 git 及其远程控制都是透明的。

    【讨论】:

    • 在代理上,默认使用 DNS 服务器 4.2.2.2 来解决此问题,请使用以下别名:alias gitproxy='PROXYRESOLV_DNS=$IP_OF_YOUR_DNS_SERVER proxychains git'
    • 如果是DNS问题,直接使用socks5h来使用远程dns解析:git --config 'http.proxy=socks5h://127.0.0.1:4444'
    • @PhillyTheThrilly 不错。我不知道 socks5h。您的评论似乎应该是一个答案。
    【解决方案4】:

    以前的答案可能有效,但我发现它们过于复杂。

    最常见的情况应该是通过 SOCKS5 代理访问公司 git 服务器。在这个例子中:

    • Git 服务器:git.evilcorp.com
    • SOCKS5 代理:localhost:11080

    在这种情况下配置 git 的最简单方法是为 git 服务器 (~/.ssh/config) 提供一个不错的 SSH 配置:

    Host git.evilcorp.com
      # Identity file specifies wich SSH key used to access the git server.
      Identityfile ~/.ssh/id_rsa
      # ProxyCommand does the magic to access the proxy server.
      ProxyCommand /bin/nc -X 5 -x 127.0.0.1:11080 %h %p
    

    很酷的细节:DNS 解析由代理完成,因此您的机器不需要了解公司 DNS 服务器。

    【讨论】:

      【解决方案5】:

      克隆 git 有两种类型:HTTP 和 ssh。 有两种常见的代理类型:HTTP 和 socks。

      这是处理2 * 2条件的方法:

      # Method 1. git http + proxy http
      git config --global http.proxy "http://127.0.0.1:1080"
      git config --global https.proxy "http://127.0.0.1:1080"
      
      # Method 2. git http + proxy shocks
      git config --global http.proxy "socks5://127.0.0.1:1080"
      git config --global https.proxy "socks5://127.0.0.1:1080"
      
      # to unset
      git config --global --unset http.proxy
      git config --global --unset https.proxy
      
      # Method 3. git ssh + proxy http
      vim ~/.ssh/config
      Host github.com
      HostName github.com
      User git
      ProxyCommand socat - PROXY:127.0.0.1:%h:%p,proxyport=1087
      
      # Method 4. git ssh + proxy socks
      vim ~/.ssh/config
      Host github.com
      HostName github.com
      User git
      ProxyCommand nc -v -x 127.0.0.1:1080 %h %p
      
      

      【讨论】:

      • 我知道这个是因为对中国男人来说是必须的,hh。 notion.so/…
      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      相关资源
      最近更新 更多