iOS 使用socks5代理服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 使用socks5代理服务器相关的知识,希望对你有一定的参考价值。

参考技术A ios 使用socks5代理服务器需要配置URLSessionConfiguration,如下:

在 IO::Socket::SOCKS 代理上使用 IO::Socket::SSL

【中文标题】在 IO::Socket::SOCKS 代理上使用 IO::Socket::SSL【英文标题】:Using IO::Socket::SSL over an IO::Socket::SOCKS proxy 【发布时间】:2019-05-03 02:30:36 【问题描述】:

我想混合使用 SSL 和 SOCKS 套接字。换句话说,我想通过 SOCKS 代理发送 TLS 加密数据,我想使用 IO::Socket::SSL 和 IO::Socket::Socks

我能想到的唯一选择是将 IO::Socket::SSL 复制到继承自 IO::Socket::Socks 的 IO::Socket::SocksSSL 类中。这是获得正确订单(例如发送)的唯一方法。我需要首先调用 SSL 方法,然后它会调用父 (IO::Socket::Socks) 发送。与连接相同,SSL 连接将调用 Socks 连接,然后开始 TLS 协商。

不幸的是,IO::Socket::SSL 没有 $SOCKET_CLASS 变量,可以让子类轻松决定继承自什么,因此我更改 SSL.pm 中的那一行并复制所有代码

我可能在这里遗漏了一些东西

【问题讨论】:

也许metacpan.org/pod/IO::Socket::Socks::Wrapper 会有所帮助? 【参考方案1】:

使用 TCP 的 SOCKS 代理(以及 SSL)本质上意味着首先创建一个 TCP 套接字,进行一些初始 SOCKS 握手,然后像使用普通 TCP 套接字一样继续使用套接字。 IO::Socket::Socks->new(...) 执行此初始 SOCKS 握手并返回一个正常的 TCP 套接字。 IO::Socket::SSL->start_SSL($socket,...) 然后在这个套接字上进行 TLS 握手。将两者结合起来基本上与IO::Socket::SSL->new(...) 相同,只是使用 SOCKS 代理而不是直接连接。

因此代码可能如下所示:

use strict;
use warnings;
use IO::Socket::Socks;
use IO::Socket::SSL;

# establish TCP connection to target via SOCKS proxy
my $cl = IO::Socket::Socks->new(
    ProxyAddr => '127.0.0.1',
    ProxyPort => 1234,
    ConnectAddr => 'whatsmyip.net',
    ConnectPort => 443
) or die $!;

# upgrade the TCP socket to TLS
IO::Socket::SSL->start_SSL($cl,
    # hostname is needed for SNI and certificate validation
    SSL_hostname => 'whatsmyip.net'
) or die $SSL_ERROR;

# do a simple HTTP request on it
print $cl "GET / HTTP/1.0\r\nHost: whatsmyip.net\r\n\r\n";
print <$cl>;

【讨论】:

感谢您的回答。我不明白的是,一旦 start_SSL 发生,对象就变成了“IO::Socket::SSL”,所以原始对象的所有方法都无法访问,对吧?因此,当在 $cl 上调用 send() 时,它将调用 IO::Socket::SSL::send() 来进行加密,然后调用其父级的发送,即 IO::Socket:: INET::send(至少在 ipv4 中)。但这不是我们想要的,不是吗?我们希望该调用调用 IO::Socket::Socks::send 以便添加 SOCKS 标头并将加密的数据包发送到代理。 @philippe_44:正如我所说,SOCKS 只是 TCP 连接上的初始握手。在这个 SOCKS 握手之后,就没有更多的东西了,只是普通的 TCP。因此无需继续在 SOCKS 套接字上写入,因为写入底层 TCP 套接字是完全相同的。 @philippe_44: 或者换句话说:你可以创建一个IO::Socket::IP 对象(或一个普通的 AF_INET 套接字)并创建一个 socksify(socket) 函数,它只进行 SOCKS 握手,然后继续原来的插座。 @philippe_44: 或者换句话说:您可以创建一个 IO::Socket::IP 对象(或普通 AF_INET 套接字)并创建一个仅执行 SOCKS 握手的 socksify(socket) 函数,然后继续原来的插座。 哦,我现在知道了。我正在阅读 IO::Socket::Socks::send 代码并看到 sub send my $self = shift; unless (defined $*$self-&gt;SOCKS-&gt;TCP) return $self-&gt;SUPER::send(@_); 并没有意识到它仅适用于 UDP 套接字

以上是关于iOS 使用socks5代理服务器的主要内容,如果未能解决你的问题,请参考以下文章

怎样设置socks代理

通过身份验证连接并保持与 socks5 代理服务器的连接

如何正确认识socks5代理ip

推送:啥是socks5代理ip

怎么开socks5代理,!

如何在Linux下配置socks5代理