[折腾]使用SSH服务实现一个socks5代理服务器
其实使用的是ssh的动态转发功能。
ssh -D 12345 -N -T root:remotehost
-D [bind_address:]port
指定监听的端口,会在本地监听该端口,并将请求到该端口流量基于 SOCKS5 协议转发到远程主机上,其中 [bind_address:]
可以不填,当不写或者为 *
时表示监听全部地址。示例:-D *:8081
,-D 8081
,-D 127.0.0.1:8081
,-D 192.168.0.1:8081
-N
不执行远程命令,仅仅用于端口转发
-T
不为该命令分配伪终端
ssh 的动态转发会在本地创建一个监听端口,并且将请求到该端口的流量全部转发到远程主机上,从而实现代理的功能,我们可以使用 curl 命令测试代理是否成功:
curl -x socks5://localhost:12345 https://www.csdn.net
通过上面的命令,我们可以通过本地12345代理,将本地请求csdn的流量转发给远程主机,由远程主机帮我们执行请求后将结果返回给我们。
在远程主机上实现一个简单的代理服务器
基于上面的逻辑,我们可以在远程主机创建一个简单的代理服务器:
ssh -D 12345 -N -T root@localhost
这种方式相当于使用 ssh 登录了当前主机,并创建了一个动态转发的接口,我们可以使用 curl 进行测试:
curl -x socks5://localhost:12345 https://www.csdn.net
这样的话我们就可以将当前主机的 13245 端口暴露出去,外部请求就可以将当前主机作为一个代理服务器实现请求的代理了。
当然这种实现的是一个简单的代理服务器,相当于将当前主机完全暴露到了外面,而且没有任何安全认证,如果有需要的话还是使用 squid 这类功能更加强大的代理服务器。
在上面的基础上,我们还可以使用 ssh 的基于远程端口代理的方式将这个端口映射到远端主机:
ssh -R [本地绑定地址:]端口:[远程绑定地址]:远程端口 -N -T root@remotehost
该命令执行后,相当于在远程主机上创建了一个监听端口,并且将请求到该端口的所有流量都转发到了本地的端口,我们只需要将本地的端口指定为刚刚我们创建的动态转发监听端口即可。
ssh -R 12345:localhost:12345 -N -T root@remotehost
参考资料
Linux curl命令详解
搭建一个SOCKS代理服务器
Socks5代理服务器搭建
Linux搭建Socks5代理服务器
彻底搞懂SSH端口转发命令
SSH 端口转发
ssh端口转发的三种方式
ssh-port-forwarding