zhuhaow / NEKit

A toolkit for Network Extension Framework
https://zhuhaow.github.io/NEKit
BSD 3-Clause "New" or "Revised" License
2.84k stars 670 forks source link

Xcode 10.2/Swift 5 - 无法再建立Socks5代理 - 之前Xcode 10.1/Swift 4.2 版本正常 #241

Closed Xeonsenior closed 5 years ago

Xeonsenior commented 5 years ago

self.socksServer = GCDSOCKS5ProxyServer(address: IPAddress(fromString: "127.0.0.1"), port: NEKit.Port(port: UInt16(self.socksPort))) try! self.socksServer.start()

在上一个版本 Xcode 10.1/Swift 4.2 的时候,增加这条命令后,可以建立一条额外的Socks5代理通道。支持Socks5代理的应用,填入127.0.0.1:socksPort就可以使用这条Socks5代理通道;但是,再更新到10.2/Swift 5版本的时候(NEkit更新到最新版本编译)之后,就无法建立这个Socks5代理了(之前的应用已经检查不到这条代理通道了)。

zhuhaow commented 5 years ago

可以具体一点么,什么叫“无法建立这个代理”?socksPort上无端口在监听,监听的端口没有响应?

Xeonsenior commented 5 years ago

这个问题我确定不了,我尽量具体描述一下我的情况。 我之前做了一个应用,但是没法带起Telegram,就是建立VPN连接后,Telegram还是无法建立连接。后来我发现NEKit里支持建立 Socks5的代理(就是我在issue里提到的方法),比如我建立了127.0.0.1:1086的Scoks5代理,然后,手动在Telegram的代理服务器选项里填入127.0.0.1:1086 就能够使用这个代理。

一般情况下,当我填写完代理服务器之后,Telegram会立即进行可用性的测试,如果可用,就会返回连接的延迟,比如 780ms. 如果代理不可用,比如我使用的服务器是一个回国服务器,这个时候Telegram会返回unavailable, 通常要等几秒钟才能返回这个结果,因为Telegram还是要通过这个 127.0.0.1:1086 连接到我建立在国内的回国代理,直到发现远端的服务器无法连接Telegram服务器为止。

但是在 10.2更新,重新编译最新的NEKit之后,代码都没动,再填加代理,Telegram检测代理,会立即返回一个unavailable, 说明Telegram完全没有建立起远端的连接。应该是本地的socks5端口没有在监听。

On Apr 2, 2019, at 5:09 PM, zhuhaow notifications@github.com wrote:

可以具体一点么,什么叫“无法建立这个代理”?socksPort上无端口在监听,监听的端口没有响应?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/zhuhaow/NEKit/issues/241#issuecomment-479041999, or mute the thread https://github.com/notifications/unsubscribe-auth/Af30zd-cd-J3rcQXvsuNQpa9CzXH2ajIks5vc3LBgaJpZM4cYB45.

so898 commented 5 years ago

这个问题是 Telegram 升级导致的 当前 Telegram 版本在进行Socks5代理连接的时候,无论你是否填写的用户名和密码,都会向服务器发送两个 method:00和01,代表着无用户名密码登录和有用户名密码登录

NEKit 在处理 Socks5 Method 时候,鉴定如果客户端传递的 Method 数量大于1,则断开连接,所以 Telegram 的连接会失败

这里只需要对 SOCKS5ProxySocket.swift 里面的 119-135行做一个微小的修改,在 readingVersionIdentifierAndNumberOfMethods 时不以 Method 个数判断连接有效性,而是在 readingConnectHeader 里面判断是否包含 Method 00 即可

如果有必要的话我会提交一个 PR 来修复此问题

493441755 commented 5 years ago

@so898 修复了吗

lincf0912 commented 5 years ago

@so898 不知是否 @Xeonsenior 所说的一样,但是现在使用NEKit(0.14.0)是没有建立本地代理。我使用NSURLSession来作为客户端测试https的代理,结果是timeout。

测试代码:

    NSString* proxyHost = @"127.0.0.1";
    NSInteger proxyPort = 1081;
    NSDictionary *proxyDict = @{
                                @"HTTPEnable": @YES,
                                @"HTTPProxy": proxyHost,
                                @"HTTPPort": @(proxyPort),
                                @"HTTPSEnable": @YES,
                                @"HTTPSProxy": proxyHost,
                                @"HTTPSPort": @(proxyPort),
                                @"SOCKSEnable": @YES,
                                @"SOCKSProxy": proxyHost,
                                @"SOCKSPort": @(proxyPort)
                                };

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
     configuration.connectionProxyDictionary = proxyDict;

    // 创建代理注册对象
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    // 创建一个请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.com"]];
    request.timeoutInterval = 5.f;

    //测试代理
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
                                      NSLog(@"NSURLSession got the response [%@]", response);
                                      NSLog(@"NSURLSession got the data [%@]", data);
                                  }];

    NSLog(@"Lets fire up the task!");
    [task resume];
fengjiankang commented 5 years ago

不实用Network Extension,单纯使用SOCKS5 本地代理应该可以翻墙吧,按照官网demo走不通

weqeo commented 5 years ago

这个问题是 Telegram 升级导致的 当前 Telegram 版本在进行Socks5代理连接的时候,无论你是否填写的用户名和密码,都会向服务器发送两个 method:00和01,代表着无用户名密码登录和有用户名密码登录

NEKit 在处理 Socks5 Method 时候,鉴定如果客户端传递的 Method 数量大于1,则断开连接,所以 Telegram 的连接会失败

这里只需要对 SOCKS5ProxySocket.swift 里面的 119-135行做一个微小的修改,在 readingVersionIdentifierAndNumberOfMethods 时不以 Method 个数判断连接有效性,而是在 readingConnectHeader 里面判断是否包含 Method 00 即可

如果有必要的话我会提交一个 PR 来修复此问题

你好,请问解决了吗?

stale[bot] commented 5 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

surelin88 commented 4 years ago

@898 @zhouhaow 大佬 在吗 telegram 这个问题 怎么解决啊

lincf0912 commented 4 years ago

使用Xcode10.1 打包。

发自我的 iPhone

在 2019年11月23日,15:58,surelin88 notifications@github.com 写道:

@898 @zhouhaow 大佬 在吗 telegram 这个问题 怎么解决啊

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

AliThink commented 4 years ago

这个问题是 Telegram 升级导致的 当前 Telegram 版本在进行Socks5代理连接的时候,无论你是否填写的用户名和密码,都会向服务器发送两个 method:00和01,代表着无用户名密码登录和有用户名密码登录

NEKit 在处理 Socks5 Method 时候,鉴定如果客户端传递的 Method 数量大于1,则断开连接,所以 Telegram 的连接会失败

这里只需要对 SOCKS5ProxySocket.swift 里面的 119-135行做一个微小的修改,在 readingVersionIdentifierAndNumberOfMethods 时不以 Method 个数判断连接有效性,而是在 readingConnectHeader 里面判断是否包含 Method 00 即可

如果有必要的话我会提交一个 PR 来修复此问题

xcode11编译,新版的telegram配置socks5 代理,依然会存在问题,跟踪了下代码,并不存在method数量的问题了。不过session在创建之后不久就莫名断开了。。。还没找到解决方案。。。