如何强制 Git 在其 ssh 连接上使用 socks 代理?
How to force Git to use socks proxy over its ssh connection?
互联网上有大量相同的解决方案来为 git 的下载定义代理隧道,例如 this 一个,都是通过设置 git 的 https.proxy
& http.proxy
配置。但是当您尝试通过 ssh
协议 clone
/push
/pull
等时,这些答案不起作用!
例如,当您尝试克隆 git clone git@github.org:user/repo.git
时设置 git config --global https.proxy socks5://127.0.0.1:9999
它不会通过定义的 sock5 隧道!
我尝试了各种方法,但 none 有效!
问题:
如何设置 git 在使用 ssh
连接时使用本地 socks5 代理(例如 127.0.0.1:9999
)?
你需要先定义GIT_SSH_COMMAND
environment variable
在里面,你可以重新定义ssh命令,以便使用你的socks代理设置
ssh -D $port_number $hostname
# or
ssh -D $port_number $username@$hostname
或using a proxycommand nc (or 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
翻了这么多页,终于找到问题的答案了:
# [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
git
自己的git --config 'http.proxy=socks5://127.0.0.1:4444'
或ssh_config
的proxycommand
使用socat
和nc
技术成功重新路由git
通过 SOCKS 代理发出命令。
但是,问题可能是 DNS 查找失败,因为查找是在本地完成的,而不是通过 SOCKS 代理远程完成的。例如,在内网的情况下,服务器可能没有互联网上的域名(仅内网 DNS 知道)。
有两种方法可以解决这个问题。第一个我看过多次推荐,但它雄心勃勃地假设你控制远程服务器。
将本地 53 流量 (DNS) 重新路由到端口 X,将其转发到端口 Y 的服务器,将端口 Y 转发到服务器上的 53。为简单起见,通常 X=Y。
拦截为名称检索 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 及其遥控器都是透明的。
之前的答案可能有用,但我发现它们过于复杂。
最常见的情况应该是通过 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 服务器。
有 2 种类型可以克隆 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
互联网上有大量相同的解决方案来为 git 的下载定义代理隧道,例如 this 一个,都是通过设置 git 的 https.proxy
& http.proxy
配置。但是当您尝试通过 ssh
协议 clone
/push
/pull
等时,这些答案不起作用!
例如,当您尝试克隆 git clone git@github.org:user/repo.git
时设置 git config --global https.proxy socks5://127.0.0.1:9999
它不会通过定义的 sock5 隧道!
我尝试了各种方法,但 none 有效!
问题:
如何设置 git 在使用 ssh
连接时使用本地 socks5 代理(例如 127.0.0.1:9999
)?
你需要先定义GIT_SSH_COMMAND
environment variable
在里面,你可以重新定义ssh命令,以便使用你的socks代理设置
ssh -D $port_number $hostname
# or
ssh -D $port_number $username@$hostname
或using a proxycommand nc (or 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
翻了这么多页,终于找到问题的答案了:
# [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
git
自己的git --config 'http.proxy=socks5://127.0.0.1:4444'
或ssh_config
的proxycommand
使用socat
和nc
技术成功重新路由git
通过 SOCKS 代理发出命令。
但是,问题可能是 DNS 查找失败,因为查找是在本地完成的,而不是通过 SOCKS 代理远程完成的。例如,在内网的情况下,服务器可能没有互联网上的域名(仅内网 DNS 知道)。
有两种方法可以解决这个问题。第一个我看过多次推荐,但它雄心勃勃地假设你控制远程服务器。
将本地 53 流量 (DNS) 重新路由到端口 X,将其转发到端口 Y 的服务器,将端口 Y 转发到服务器上的 53。为简单起见,通常 X=Y。
拦截为名称检索 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 及其遥控器都是透明的。
之前的答案可能有用,但我发现它们过于复杂。
最常见的情况应该是通过 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 服务器。
有 2 种类型可以克隆 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