在一些场景,ssh或git需要通过代理才可以访问到目标服务器,但是大部分代理只支持HTTP协议,所以需要配置特殊方式穿越代理达到目标服务器
OpenSSH 的客户端有一个 ProxyCommand 的选项, 用于 SSH 客户端与服务器之间的隧道通信(tunneling)。所谓的隧道技术,也称代理技术,是网络通信技术的一个普遍概念,,就是把一条信道建立于另外一条信道之上。
SSH 会话基于一个 TCP 连接。如果我们把连接的两个端口各自的出口(也即入口)进行截获,就可以用其它的信道来传输。而且 SSH 仍然认为它用的是和另一端连接一条 TCP 连接。
这里假设远端服务器用户名是remote_user
,域名或ip为remote-host.com
,代理的IP为192.168.0.100:8080
ssh -o ProxyCommand='nc --proxy 192.168.0.100:8080 %h %p' remote_user@remote-host.com -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 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 git@code.aliyun.com:tenmao/test.git
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传回来要快很多。
sudo yum install -y nc
)