跳至主要内容

ssh over socks5:通过socks5 proxy来连接ssh服务器[转载]

最近因为不可描述的原因,我在aws soul的云主机访问不了,ssh、80、ss全部都被禁掉了。

80端口在chrome配置SwitchyOmega就可以了,但ssh不太好办,shell上配置http_proxy对ssh没什么用。

其实ssh自己就支持proxy。

注意这跟在ssh端口转发:远程和本地中介绍过使用ssh作为proxy的方法不同,ssh -D是为了用ssh做proxy,而不是通过proxy来连接ssh服务器。

TL;DR

ssh -o ProxyCommand='nc -x 192.0.2.0:1080 %h %p' user@awshost

原理解析

$ man ssh_config
ProxyCommand
Specifies the command to use to connect to the server. The command string extends to the end of the line, and is executed using the user's shell ‘exec’ directive to avoid a lingering shell process.

        In the command string, any occurrence of ‘%h’ will be substituted by the host name to connect, ‘%p’ by the port, and ‘%r’ by the remote user name.  The command can be basically anything, and should read from its standard input and write to its standard output.  It should eventually connect an sshd(8) server running on some machine, or execute sshd -i somewhere.  Host key management will be done using the HostName of the host being connected (defaulting to the name typed by the user).  Setting the command to “none” disables this option entirely.  Note that CheckHostIP is not available for connects with a proxy command.

        This directive is useful in conjunction with nc(1) and its proxy support.  For example, the following directive would connect via an HTTP proxy at 192.0.2.0:

          ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p

ProxyCommand可以利用nc做中间通道,从而达到代理的目的。要明白这个过程,需要先了解下nc的用法。

$ man nc
DESCRIPTION
The nc (or netcat) utility is used for just about anything under the sun involving TCP, UDP, or UNIX-domain sockets. It can open TCP connections, send UDP packets, listen on arbitrary TCP and UDP ports, do port scanning, and deal with both IPv4 and IPv6.

 Common uses include:

       ·   simple TCP proxies
       ·   shell-script based HTTP clients and servers
       ·   network daemon testing
       ·   a SOCKS or HTTP ProxyCommand for ssh(1)
       ·   and much, much more

 -X proxy_protocol
         Requests that nc should use the specified protocol when talking to the proxy server.  Supported protocols are “4” (SOCKS v.4), “5” (SOCKS v.5) and “connect” (HTTPS proxy).  If the protocol is not specified, SOCKS version 5 is used.
 -x proxy_address[:port]
         Requests that nc should connect to destination using a proxy at proxy_address and port.  If port is not specified, the well-known port for the proxy protocol is used (1080 for SOCKS, 3128 for HTTPS).

举个例子。

nc以服务器身份,起一个tcp监听连接。

$ nc -l 2222
netstat可以看到一个2222的监听socket。

然后,nc以客户端身份,连接到上面的tcp的监听socket。

$ nc localhost 2222
此时nc接管shell,随便输入几个字符,就可以在nc服务器端看到刚刚输入的字符。

从这个例子可以看到,nc其实是创建了一个非常单纯的tcp连接,没有任何协议;任何从client输入的数据,都会直接传给server端。

那么,在ssh over socks5这里,nc做了什么呢?

在一个已经通过socks5代理的ssh连接建立的环境上,可以看到有个nc的进程:

nc -x 192.0.2.0:1080 awshost 22
试试直接在shell里输入上面nc的命令,会发现nc与ssh-server建立连接以后,ssh-server发过来了其ssh版本,然后等着nc继续按ssh协议与其交互。随便输入一个’ha!’,由于这个显然不符合ssh协议,所以ssh-server会关掉连接,提示Protocol mismatch。

nc -x 192.0.2.0:1080 awshost 22

SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1

ha!
Protocol mismatch.
明白了吗?我无法手工输入ssh协议,但ssh-client可以;nc作为客户端连接到了awshost(当然通过-x指定了nc的socks5代理)后,ssh-client将nc作为一个管道,按ssh协议与ssh-server交互,从而建立了ssh连接。

拓扑如下。

ssh-client --- nc --- proxy --- ssh-server

期待的是,通过ssh-server1做代理,连接到ssh-server2上。没找到直接的做法,不过可以这样实现:

ssh -D 127.0.0.1:1080 user1@ssh-server1,通过ssh-server1建立本地的socks5代理
ssh -o ProxyCommand='nc -x 127.0.0.1:1080 %h %p' user2@ssh-server2,连接到ssh-server2
如果你需要给chrome配置socks5代理,可以在第二步的基础上,再加上-D 127.0.0.1:2080,通过ssh-server1+ssh-server2建立socks5代理。
最近国内网络比较复杂,似乎某些公司网络直接访问有点问题,可以通过上面的方法来绕。

评论

此博客中的热门博文

Mac下Aria2安装及其配置并设置开机启动

1.安装Homebrew 注:(如已安装,请忽略) 打开终端键入以下命令,等待完成 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 2.安装最新版本aria2并配置 1.终端下输入以下命令 ➜ ~ brew install aria2 2.等待安装完成后,下载附件 Aria2相关配置下载地址 aria2 config 3.建立aria2文件夹 cd ~ // 创建aria2文件夹 mkdir ~/.aria2 4.打开刚才创建好的aria2文件夹 ➜ ~ open ~/.aria2 5.解压下载好的附件,将 下列文件 复制到aria2文件夹内 aria2.conf aria2.log aria2.session com.aria2c.plist com.google.Chrome.mobileconfig 6.将下载文件夹内的 aria2c 文件复制到 /usr/local/Cellar/aria2/1.33.1/bin 下 操作方式,终端输入命令 cd /usr/local/Cellar/aria2/1.33.1/bin 将该文件夹里的 aria2c 文件重命名为 aria2c.bak,再将下载文件夹内的 aria2c 复制进去 注: 1.理由是官方的 aria2c 版本最多支持16线程,sarkrui改好的aria2c版本支持128线程 2.文中所说的1.33.1是我当前从brew上下载下来的版本,实际以你brew下载下来的版本为准,如果和我版本不一致,请修改相关的1.33.1这个路径 7.右键使用文本编辑或sublime打开 aria2.conf 找到如下语句,将hsuyelin(本人电脑用户名)修改为你电脑的用户,修改完成 command+s 保存退出 #文件保存路径, 默认为当前启动位置 dir=/Users/hsuyelin/Downloads # 日志保存路径 log=/Users/hsuyelin/.aria2/aria2.log # 从会话文件中读取下载任务 input-file=/Users/hsu...

阿里云通过Nginx中转Linode/digitalocean/AWS的V2ray协议,实现负载均衡

开篇文的废话.原因是Sandy做站服务器太多了,发现利用率不高,皮又痒了又想折腾了.v2ray是利器但是给人的感觉就是只能用一台服务器,官方也说不支持负载均衡,不会A服务器挂机,自动跳转到B服务器.这里就有点折磨人了.每个服务器挂了都要自己去改配置文件. 我们访问国外的服务器,如果没CN2的线路是非常慢的,起码不快!哈哈~现在VPS都便宜起码人手一个人有5台以上吧?这样的话我们就可以开整. 开整条件:国内VPS或者阿里云有CN2线路的机器最好是100MB-200MB的带宽的.保证你爽歪歪.但是Sandy在阿里云HK30MB下也测试了也可以达到30000KB以上,羡慕吧~我们可以开始了! 老规则工具先出: 没被gwf和谐的服务器1台(下文统称:主服务器) 国外服务器2台以上(下文统称:从服务器) nginx 1.9.5版本以上(推荐:lnmp1.4) v2ray croe 第一步: 在 主服务器 安装lnmp1.4,这里就不细说教程了.直接去 官方 看教程 安装完毕以后我们来升级Nginx让他支持stream模块 cd lnmp1.4 vi lnmp.conf 在Nginx_Modules_Options=‘’里面加入--with-stream Nginx_Modules_Options='--with-stream’ 然后执行升级命令 ./upgrade.sh nginx  第二步 修改nginx.conf文件 cd /usr/local/nginx/conf/nginx.conf 在 events { use epoll; worker_connections 51200; multi_accept on; } 下面加入 stream{ server{ listen 0.0.0.0:8080; proxy_pass v2ray_backend; proxy_timeout 10m; proxy_connect_timeout 5000ms; } upstream v2ray_backend{ server ...

利用haproxy来做V2RAY负载均衡

Sandy在之前有说过 阿里云通过Nginx中转Linode/digitalocean/AWS的V2ray协议,实现负载均衡 ,有些学童不想折腾nginx,那么我们可以用haproxy来折腾,不管是haproxy还是Nginx都可以在树莓派和局域网的PC机器折腾! 安装haproxy的教程就移步到-> haproxy安装教程 apt-get install haproxy 安装完毕,我们来修改haproxy的配置 vi /etc/haproxy/haproxy.cfg 里面内容全部删除,加入下面的内容 global ulimit-n 51200 log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy pidfile /var/run/haproxy.pid user haproxy group haproxy daemon defaults log global mode tcp retries 3 option dontlognull option redispatch #上游TCP服务器连接等待时间 timeout connect 5s timeout client 24h timeout server 24h #以下为Web管理页面设置,如不需要可以删除 listen admin_stats bind 0.0.0.0:8888 mode http log 127.0.0.1 local0 err stats refresh 30s stats uri /haproxy stats realm welcome login\ Haproxy stats auth admin:admin stats hide-version stat...