- 浏览: 958753 次
- 性别:
- 来自: 江西上饶
文章分类
- 全部博客 (460)
- p.spring (56)
- p.maven (20)
- p.ant (17)
- p.jee (18)
- p.jse (33)
- p.ofbiz (31)
- p.软件工程 (8)
- p.struts2 (5)
- p.hibernate (5)
- linux (25)
- 设计模式 (2)
- p.javascript (11)
- 硬件 (1)
- p.jsp (2)
- p.windows批处理 (1)
- 操作系统问题 (5)
- 算法 (1)
- p.mysql (7)
- p.sql (5)
- p.c (1)
- google产品 (0)
- 内存 (1)
- p.struts (1)
- p.freemarker (7)
- p.css (4)
- p.log4j (10)
- p.html (3)
- 淘宝产品 (0)
- 其他 (3)
- 编译器 (0)
- svn (4)
- p.spring.security (11)
- 图形 (0)
- p.xml (1)
- p.ssh (0)
- p.jquery (4)
- p.jdbc (3)
- p.flex (0)
- p.c++ (0)
- p.c#Net (0)
- p.assembly (0)
- p.sqlserver (0)
- p.其他 (3)
- p.webwork (21)
- p.wap (12)
- p.cglib (1)
- p.jee服务器 (11)
- windows (2)
- p.iphone (1)
- p.java.分布式与集群 (2)
- p.ibatis (16)
- p.eclipse (5)
- 架构 (2)
- http协议 (5)
- 我的个人标准 (2)
- 多线程 (1)
- 奇怪问题 (5)
- p.jira (13)
- p.httpclient (1)
- 服务器.apache (11)
- 安全防范 (1)
- p.PODAM (1)
- p.junit (16)
- fop (2)
- 硬盘安装 (1)
- powerdesigner (0)
- 单元测试 (1)
- apache commons (4)
- tomcat+apache集群 (10)
- 各类诡辩 (1)
- 安卓 (8)
- qvod (1)
- java编程基础知识考试考点及答案 (0)
- 工作总结 (4)
- oracle (0)
- spring的util工具 (3)
- json (2)
- maven (3)
- jms (19)
- p.bat (3)
- hadoop (2)
- git (3)
- nginx (1)
- p.移动开发 (1)
- shiro (3)
- 游戏破解 (1)
- react-native (7)
- ios开发 (1)
- webmagic (6)
- socks5 (1)
最新评论
-
weituotian:
说的不好,没人看的
公司系统中的菜单功能和权限功能 -
石不易:
非常详细的注解~
绑定端口和IP,Listen 与VirtualHost指令 -
spring_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
spring mvc -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装 -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装
socks5的基础知识
关于socks5的定义]https://www.ietf.org/rfc/rfc1928.txt
[/b[b]
关于socks5的账号密码验证方式https://www.ietf.org/rfc/rfc1929.txt
socks5交互过程
1.socks5服务器开启端口
2.客户端链接到sockets服务器
3.客户端发送hello信息,结构如下
其中X02表示账号密码验证,我们这里只需要实现该方法
4.服务端需要回复如下信息
METHODS
o X'00' NO AUTHENTICATION REQUIRED
o X'01' GSSAPI
o X'02' USERNAME/PASSWORD
o X'03' to X'7F' IANA ASSIGNED
o X'80' to X'FE' RESERVED FOR PRIVATE METHODS
o X'FF' NO ACCEPTABLE METHODS
如果服务端最后挑选的是X'FF',则表示没有适配的验证方法,客户端与服务端的验证方案不匹配,这种情况意味着只能被关闭
5.客户端发送账号密码信息(如果不是账号密码验证则跳过这步)
6.服务端返回(如果不是账号密码验证则跳过这步)
7.客户端请求代理目标
IP4模式,4字节
IP6模式,16字节
域名模式,地址第一个字段表示 域名长度(255最大)
地址端口的解析
端口2字节
8.服务端回复
connect模式
BND.ADDR BND.PORT 与DST.ADDR和DST.PORT 相等
BIND模式,新开启的服务器的端口,ip
UDP 模式,不准备支持,详情查看https://www.ietf.org/rfc/rfc1928.txt
关于socks5的定义]https://www.ietf.org/rfc/rfc1928.txt
[/b[b]
关于socks5的账号密码验证方式https://www.ietf.org/rfc/rfc1929.txt
socks5交互过程
1.socks5服务器开启端口
2.客户端链接到sockets服务器
3.客户端发送hello信息,结构如下
VER | NMETHODS | METHODS |
1字节 | 1字节 | 最高255字节 |
X05表示socks5,也可以是任意的identifier | 代表第三个字段的数据长度(byte数) | 客户端支持的验证方式,每种方法占用一个字节 |
其中X02表示账号密码验证,我们这里只需要实现该方法
ClientHelloInfo clientHelloInfo = new ClientHelloInfo(); clientHelloInfo.setVer(inputStream.read()); clientHelloInfo.setNmethods(inputStream.read()); if(clientHelloInfo.getNmethods() > 0) { clientHelloInfo.setMethods(read(clientHelloInfo.getNmethods())); }
4.服务端需要回复如下信息
VER | METHOD |
1字节 | 1字节 |
X05表示socks5 | 服务端挑选的验证方法 |
METHODS
o X'00' NO AUTHENTICATION REQUIRED
o X'01' GSSAPI
o X'02' USERNAME/PASSWORD
o X'03' to X'7F' IANA ASSIGNED
o X'80' to X'FE' RESERVED FOR PRIVATE METHODS
o X'FF' NO ACCEPTABLE METHODS
如果服务端最后挑选的是X'FF',则表示没有适配的验证方法,客户端与服务端的验证方案不匹配,这种情况意味着只能被关闭
public void writeDatas(ServerHelloInfo serverHelloInfo) throws IOException { outputStream.write(serverHelloInfo.getVer()); outputStream.write(serverHelloInfo.getMethod()); outputStream.flush(); }
5.客户端发送账号密码信息(如果不是账号密码验证则跳过这步)
VER | ULEN | UNAME | PLEN | PASSWD |
1字节,注意这里不是SOCKS的版本 | 1字节,指定用户名有多少字节 | 最大255字节 | 指定密码多少字节 | 最大255字节 |
public ClientUserPasswordInfo readDatas() throws IOException { ClientUserPasswordInfo clientUserPasswordInfo = new ClientUserPasswordInfo(); clientUserPasswordInfo.setVer(read()); clientUserPasswordInfo.setUlen(read()); clientUserPasswordInfo.setUname(new String(read(clientUserPasswordInfo.getUlen()))); clientUserPasswordInfo.setPlen(read()); clientUserPasswordInfo.setPassword(new String(read(clientUserPasswordInfo.getPlen()))); return clientUserPasswordInfo; }
6.服务端返回(如果不是账号密码验证则跳过这步)
VER | STATUS |
1字节,目前只支持1,因为目前SOCKS5的密码验证协议版本是1 | 0X00表示正确,其他表示密码错误,关闭连接 |
public void writeDatas(ServerUserPasswordInfo serverUserPasswordInfo) throws IOException { outputStream.write(serverUserPasswordInfo.getVer()); outputStream.write(serverUserPasswordInfo.getStatus()); outputStream.flush(); }
7.客户端请求代理目标
VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
1字节 | 1字节 | X'00' | 2字节 | 目标ip | 目标端口 2字节 |
- o VER协议版本:X'05'
- o CMD 三个命令模式
- o CONNECT模式X'01'
- o BIND模式 X'02'(开启端口监听,客户端需要连接到这个端口的流量会直接转发到目标IP端口)
- o UDP模式 X'03'
- o RSV保留
- o以下地址的ATYP地址类型
- o IP V4地址:X'01'
- o DOMAINNAME:X'03'(域名模式)
- o IP V6地址:X'04'
- o DST.ADDR所需的目标地址
- o DST.PORT网络八位字节中所需的目标端口
IP4模式,4字节
IP6模式,16字节
域名模式,地址第一个字段表示 域名长度(255最大)
地址端口的解析
端口2字节
package com.lsiding.nat.util; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.SocketTimeoutException; import com.lsiding.nat.core.InOutModel; public class UtilSocks5 { /** * byte数组转int类型的对象 4字节 * * @param bytes * @return */ public int byte2Int(Byte[] bytes) { return (bytes[0] & 0xff) << 24 | (bytes[1] & 0xff) << 16 | (bytes[2] & 0xff) << 8 | (bytes[3] & 0xff); } /** * 2个字节 转化成int * * @throws IOException */ public static final int byte2ToInteger(InOutModel<?> inOutModel) throws IOException { byte[] bs = inOutModel.read(2); return ((bs[0] & 0xff) << 8 | (bs[1] & 0xff)); } /** * 计算地址 一个byte刚好有0-255,但是当byte超过127时自动变成-128,比如说是129,那么当他超过127时自动从-128开始计算, * 也就是说129==--127 * * @return liyixing * @throws IOException * @throws SocketTimeoutException */ public static final String getAddress(int type, InOutModel<?> inOutModel) throws SocketTimeoutException, IOException { if (type == 3) { // 域名模式 int len = inOutModel.readLength(); byte[] bs = inOutModel.read(len); return new String(bs); } else if (type == 1) { // ip 4 byte[] bs = inOutModel.read(4); StringBuffer sb = new StringBuffer(); for (int i = 0; i < 4; i++) { if (i != 0) { sb.append("."); } int a = bs[i]; if (a < 0) { a = 256 + a; } sb.append(a); } return sb.toString(); } else if (type == 4) { // ip6 16字节 StringBuffer sb = new StringBuffer(); for (int i = 0; i < 8; i++) { if (i != 0) { sb.append(":"); } int a = byte2ToInteger(inOutModel); // a & 0xffff 显示4位16进制,a & 0xff 2位16进制 String x = String.format("%02x", new Integer(a & 0xffff)) .toUpperCase(); while (true) { if (x.length() < 4) { x = "0" + x; } else { break; } } sb.append(x); } return sb.toString(); } return null; } /** * int转byte数组 4字节 * * @param bytes * @return */ public byte[] intToByte(int num) { byte[] bytes = new byte[4]; bytes[0] = (byte) ((num >> 24) & 0xff); bytes[1] = (byte) ((num >> 16) & 0xff); bytes[2] = (byte) ((num >> 8) & 0xff); bytes[3] = (byte) (num & 0xff); return bytes; } /** * int 转2位byte * * @param i * @return liyixing */ public static byte[] intTo2ByteArray(int i) { byte[] result = new byte[2]; result[0] = (byte) ((i >> 8)); result[1] = (byte) (i & 0xff); return result; } /** * 地址转byte * * @param type * @param ip * @return liyixing */ public static final byte[] getAddressBytes(int type, String ip) { if (type == 3) { // 域名模式 byte[] bs = ip.getBytes(); int len = bs.length + 1; byte[] rs = new byte[len]; rs[0] = (byte) bs.length; for (int index = 0; index < bs.length; index++) { rs[index + 1] = bs[index]; } return rs; } else if (type == 1) { // ip 4 String[] ips = ip.split("\\."); byte[] rs = new byte[4]; for (int index = 0; index < 4; index++) { rs[index] = (byte) Integer.valueOf(ips[index]).intValue(); } return rs; } else if (type == 4) { // ip 4 String[] ips = ip.split(":"); byte[] rs = new byte[16]; for (int index = 0; index < 8; index++) { String ipOne = ips[index]; byte[] tm = intTo2ByteArray(Integer.valueOf(ipOne, 16)); rs[index * 2] = tm[0]; rs[index * 2 + 1] = tm[1]; } return rs; } return null; } public static void main(String[] args) throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( intTo2ByteArray(26381)); InOutModel<String> inOutModel = new InOutModel<String>( byteArrayInputStream); System.out.println(byte2ToInteger(inOutModel)); byteArrayInputStream = new ByteArrayInputStream(getAddressBytes(3, "www.lsiding.com")); inOutModel = new InOutModel<String>(byteArrayInputStream); System.out.println(getAddress(3, inOutModel)); byteArrayInputStream = new ByteArrayInputStream(getAddressBytes(1, "192.168.0.103")); inOutModel = new InOutModel<String>(byteArrayInputStream); System.out.println(getAddress(1, inOutModel)); System.out.println("2001:0DB8:0000:0023:1008:0800:200C:0001"); byteArrayInputStream = new ByteArrayInputStream(getAddressBytes(4, "2001:0DB8:0000:0023:1008:0800:200C:0001")); inOutModel = new InOutModel<String>(byteArrayInputStream); System.out.println(getAddress(4, inOutModel)); } }
public RequestInfo readDatas() throws IOException { RequestInfo requestInfo = new RequestInfo(); requestInfo.setVer(read()); requestInfo.setCmd(read()); requestInfo.setRsv(read()); requestInfo.setAtyp(read()); String ip = UtilSocks5.getAddress(requestInfo.getAtyp(), this); requestInfo.setDstAddr(ip); requestInfo.setPort(UtilSocks5.getProt(this)); return requestInfo; }
8.服务端回复
VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | 1字节 | 1字节 | X'00' | 1字节 | Variable | 2字节 |
- o VER protocol version: X'05'
- o REP Reply 状态码:
- o X'00' succeeded
- o X'01' 一般SOCKS服务器故障
- o X'02' 不允许使用cmd 2
- o X'03' 网络无法访问
- o X'04' 主机无法访问
- o X'05' 连接被拒绝
- o X'06' TTL已过期
- o X'07' 命令不受支持
- o X'08' 不支持地址类型
- o X'09' X'09'到X'FF'未分配
- o RSV 保留字段 必须填0X00
- o ATYP 1ip4,3域名模式,4ip6
connect模式
BND.ADDR BND.PORT 与DST.ADDR和DST.PORT 相等
BIND模式,新开启的服务器的端口,ip
UDP 模式,不准备支持,详情查看https://www.ietf.org/rfc/rfc1928.txt
发表评论
-
java Runtime.exec方法详解
2019-07-11 14:11 21471.关于CMD(为了让exec ... -
Spring 定时任务,cron表达式,@Scheduled cron表达式
2016-04-25 15:48 5296一个cron表达式有至少6 ... -
xulrunner
2016-01-13 13:07 664http://ftp.mozilla.org/pub/xulr ... -
谈一谈自己对依赖、关联、聚合和组合之间区别的理解
2015-11-17 16:05 777在学习面向对象设计对象关系时,依赖、关联、聚合和组合这四种关系 ... -
java apache common unicode处理
2015-09-19 15:17 1562if (UnicodeConvertType.中文转unico ... -
jdbc ssh通道
2015-09-17 14:40 1859java通过ssh链接数据库,需要用到 JSCH是一个纯粹的用 ... -
swt 窗口 最大化最小化按钮设置等
2015-09-14 17:53 4314窗体顶部菜可以在实例化的时候设置,也可以单独设置:Shell ... -
java.lang.Process调用程序阻塞问题解决
2015-08-14 10:56 4254这两天一直在处理flv视频环境的搭建工作,包括服务器的安 ... -
java html解析
2015-07-31 17:31 1205dom解析是常用dom4j。 android中我们常用的是sa ... -
slf4j门面模式实现原理
2015-07-16 10:08 2979在使用slf4j的时候,只 ... -
java - 比较时间-相差月数
2015-06-15 09:57 1460Date经常会出现比较两个Date相差的月数,实际上可以做一个 ... -
log4jdbc
2014-12-25 13:55 3046该框架目前支持到jdbc3.和jdbc4的版本。 提供了多种 ... -
jdbc规范 jdbc1 jdbc2 jdbc3 jdbc4
2014-12-25 13:49 5055目前jdbc规范已经升级到 ... -
反射,代理,动态java原理
2014-12-22 16:44 1115需要两个类,用于下面的测试 package test; ... -
Bean Validation 1.0(JSR-303)
2014-11-18 16:15 1092http://jinnianshilongnian.iteye ... -
JRE最小化原理
2014-10-15 20:19 1303比如我们一个程序只用到了很少的类,像String,Intege ... -
时间重叠的判断
2014-02-14 11:16 1646如上图,粗线是时间1 细线是时间2 时间重叠,只可能是以上四 ... -
java获取当前类的绝对路径
2013-12-14 00:37 8961.如何获得当前文件路径 常用: (1).Test.class ... -
枚举 enum
2013-12-13 16:52 5226java的enum其实是一个类。编译器根据你enum的定义会为 ... -
EL表达式,ognl表达式对集合过滤和投影
2013-11-23 11:48 1204GONL<s:property value=" ...
相关推荐
ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...
在给定的标题“使用Java基于Netty+Socks5+TLS实现的代理服务.zip”中,我们可以看到三个核心概念:Netty、Socks5和TLS,这些都是构建高效、安全网络服务的关键组件。 Netty是一个高性能、异步事件驱动的网络应用...
它具有以下功能: SOCKS5协议规范的100%实现,包括和尽管Jargyle可以充当独立的SOCKS5服务器,但它可以充当以下两者之间的桥梁: 使用纯文本连接和无SOCKS5身份验证访问SOCKS5服务器的操作系统和应用程序要求SSL /...
6. **安全性**:如果实现SOCKS5的认证功能,需要考虑用户凭证的安全存储和传输。此外,还可以考虑使用SSL/TLS加密来保护数据的传输安全。 7. **日志和调试**:为了便于问题定位和服务器维护,通常会添加日志记录...
java实现的socket转http的小工具
描述使用Scala和Netty轻松实现socks5代理协议。 完全使用异步Java NIO来扩展许多并发连接。 打算与docker一起部署在私有vps上以进行快速设置。 Docker Hub: :
在Netty中实现Socks5代理,我们需要理解以下关键组件和步骤: 1. **协议解析**:首先,我们需要解析Socks5的协议报文。Socks5协议的握手过程包括版本识别、认证阶段、命令请求和响应。Netty中的...
JAVA,代理服务器,JAVA代理服务器 本小工具是使用JAVA开发的代理服务器,只要设置好代理端口(端口在100~65000之内的任意没被占用的端口都可以),点击启动,局域网内用户就可以设置通过代理联网
Java提供了一些库来支持FTP操作,例如Apache Commons Net库,它提供了一个FTPClient类,使得在Java中实现FTP文件上传和下载变得简单。 以下是一个Java利用Apache Commons Net库实现FTP文件下载的示例代码: ```...
1. **mh5GameMain.java**:这可能是游戏的主入口点或者游戏主循环的实现,负责初始化游戏环境、处理用户输入、管理游戏状态等。 2. **m13Bullets.java**:这个名字暗示了游戏中存在13种类型的子弹或者与子弹相关的...
ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...
这个"java操作IE代理"的主题涉及到如何在Java程序中控制IE的网络代理设置,这通常需要利用特定的库和方法来实现。下面将详细介绍这个知识点。 首先,"registry.jar"可能是一个包含了对Windows注册表操作功能的Java...
ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...
ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...
ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...
ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...
用Rust实现仿nginx,力争实现一个可替代方案,http/https代理, socks5代理, 负载均衡, 反向代理, 静态文件服务器,四层TCP/UDP转发,websocket转发, 内网穿透nat
ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...
`SOCKS.java`可能是一个实现SOCKS协议的类。SOCKS是一种代理协议,允许客户端通过代理服务器与任意TCP服务通信。它分为版本4和5,其中SOCKS5支持更多认证机制和协议类型。 `socks.properties`可能包含了配置SOCKS...
ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...