ssh&git如何穿越代理

在一些场景,ssh或git需要通过代理才可以访问到目标服务器,但是大部分代理只支持HTTP协议,所以需要配置特殊方式穿越代理达到目标服务器

穿越方式

OpenSSH 的客户端有一个 ProxyCommand 的选项, 用于 SSH 客户端与服务器之间的隧道通信(tunneling)。所谓的隧道技术,也称代理技术,是网络通信技术的一个普遍概念,,就是把一条信道建立于另外一条信道之上。

SSH 会话基于一个 TCP 连接。如果我们把连接的两个端口各自的出口(也即入口)进行截获,就可以用其它的信道来传输。而且 SSH 仍然认为它用的是和另一端连接一条 TCP 连接。

SSH登录

这里假设远端服务器用户名是remote_user,域名或ip为remote-host.com,代理的IP为192.168.0.100:8080
ssh -o ProxyCommand='nc --proxy 192.168.0.100:8080 %h %p' [email protected] -p 22


更常见的的方式是保存到配置文件~/.ssh/config

Host remote-host.com
        HostName remote-host.com
        User remote_user
        Port 22
        ProxyCommand nc --proxy 192.168.0.100:8080 %h %p

配置好之后就可以直接使用命令ssh remote-host.com

GIT

git可以通过配置git config --global 192.168.0.100:8080,从而支持HTTPS协议的访问,但是每次都需要输入账户密码,还是比较麻烦。最好还是使用SSH协议,配置如下:

Host code.aliyun.com
        HostName code.aliyun.com
        User git
        Port 22
        ProxyCommand nc --proxy 192.168.0.100:8080 %h %p
        IdentityFile ~/.ssh/id_rsa

配置好后,就可以直接访问目标服务器了。
git clone [email protected]:tenmao/test.git

Windows环境

Windows环境下没有nc命令,但是安装git bash后可以有connect命令,配置如下:

Host code.aliyun.com
        User git
        Port 22
        ProxyCommand "C:/Program Files/Git/mingw64/bin/connect" -H 192.168.0.100:8080 %h %p
        IdentityFile "C:\Users\user\.ssh\id_rsa"
        TCPKeepAlive yes
        IdentitiesOnly yes

高级用法

ssh dev "sudo tcpdump -s 0 -U -n -i eth0 not port 22 -w -" | wireshark -k -i -

这条命令在远端调用tcpdump抓包,通过管道传回本地,然后让wireshark抓包,就达到了实时抓包的效果了。这比原来的抓包存储到pcap文件中,然后两次scp传回来要快很多。

常见问题

  • ssh returns “Bad owner or permissions on ~/.ssh/config”

  • bash: nc: command not found:代理服务器上必须安装有nc命令(sudo yum install -y nc)

参考

  • ssh命令之ProxyCommand选项
  • 如何透过 SSH 代理穿越跳板机
  • SSH ProxyCommand及其思想
  • Using SSH ProxyCommand to Tunnel Connections

你可能感兴趣的:(ssh&git如何穿越代理)