[折腾]使用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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要基于 Netty 实现一个 SOCKS5 服务器,可以按照以下步骤进行: 1. 创建一个 Netty 的 ServerBootstrap 对象,并设置其相关属性,例如监听端口号、处理器等。 2. 在处理器中实现 SOCKS5 协议的解析和处理。对于 SOCKS5 协议,客户端会发送一个 Greeting 消息,服务器需要回复一个 Greeting 消息确认连接。然后客户端会发送一个请求,包括请求类型、目标地址和端口等信息,服务器需要根据请求类型进行相应的处理,例如连接目标地址和端口、绑定到指定的地址和端口等。 3. 在处理器中实现数据的转发,当客户端和目标服务器建立连接后,服务器需要将数据从客户端转发给目标服务器,然后将目标服务器返回的数据转发给客户端。 下面是一个简单的示例代码: ```java public class Socks5Server { public static void main(String[] args) throws InterruptedException { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new Socks5ServerEncoder()); pipeline.addLast(new Socks5InitialRequestDecoder()); pipeline.addLast(new Socks5ServerHandler()); } }); ChannelFuture future = bootstrap.bind(1080).sync(); future.channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } } ``` 在上面的代码中,创建了一个 ServerBootstrap 对象,并设置了监听端口号为 1080,处理器为 Socks5ServerHandler。Socks5ServerHandler 实现SOCKS5 协议的解析和处理,以及数据的转发。 需要注意的是,这只是一个简单的示例代码,实际使用中可能需要根据具体需求进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值