sans io socks代理客户机/服务器,具有两个io后端

siosocks的Python项目详细描述


短袜

Travis status for master branchCodecov coverage for master branchPypi versionPypi downloads count

Sans-iosocks 4/5客户机/服务器库/框架。

原因

  • 无单枪匹马服务器
  • 无IO
  • 异步就绪^{}已死亡
  • ^{}不要模拟asyncio.open_connection参数(可能也死了)
  • 乐趣

功能

  • 仅tcp连接(无绑定,无udp)
  • 客户机和服务器
  • 袜子型号:4、4a、5
  • socks5 auth:no auth,用户名/密码
  • 两个io后端:asyncio、trio、socketserver
  • 一次性SOCKS服务器(python -m siosocks

许可证

siosocks在wtfpl许可下提供。

要求

  • Python3.6+

IO实现矩阵

FrameworkClientServer
asyncio++
trio++
socket+

随意放大:眨眼:

用法

最终用户实现模拟“父”库API。

客户机

仅限关键字的额外参数:

  • socks_host:字符串
  • socks_port:整数
  • socks_version:整数(4或5)
  • username:可选字符串(默认值:None
  • password:可选字符串(默认值:None
  • encoding:可选字符串(默认值:"utf-8"
  • socks4_extras:可选字典
  • socks5_extras:可选字典

附加服务:

  • 袜子4
    • user_id:字符串(默认值:""
  • 袜子5
    • 目前没有,为统一api添加

服务器

最终用户实现模拟“父”库服务器请求处理程序。

您应该使用^{}绑定socks特定的参数:

  • allowed_versions:整数集(默认值:{4, 5}
  • username:可选字符串(默认值:None
  • password:可选字符串(默认值:None
  • strict_security_policy:布尔值,如果True需要身份验证且4在允许的版本集中,则将引发异常(默认值:True
  • encoding:可选字符串(默认值:"utf-8"

没什么好说的。典型用法可在^{}

示例

高水平

本节将使用asyncio作为后端,因为它是siosocks的主要目标/原因

客户

importasynciofromsiosocks.io.asyncioimportopen_connectionHOST="api.ipify.org"REQ="""GET /?format=json HTTP/1.1Host: api.ipify.orgUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en,en-US;q=0.7,ru;q=0.3Accept-Encoding: gzip, deflateDNT: 1Connection: keep-aliveUpgrade-Insecure-Requests: 1Cache-Control: max-age=0"""asyncdefmain():# assume we have tor startedr,w=awaitopen_connection(HOST,80,socks_host="localhost",socks_port=9050,socks_version=5)w.write(REQ.replace("\n","\r\n").encode())awaitw.drain()print(awaitr.read(8192))w.close()loop=asyncio.get_event_loop()loop.run_until_complete(main())

服务器

importsocketimportasyncioimportcontextlibfrom.io.asyncioimportsocks_server_handlerloop=asyncio.get_event_loop()coro=asyncio.start_server(socks_server_handler,host=ns.host,port=ns.port,family=family)server=loop.run_until_complete(coro)addresses=[]forsockinserver.sockets:ifsock.familyin(socket.AF_INET,socket.AF_INET6):host,port,*_=sock.getsockname()addresses.append(f"{host}:{port}")print(f"Socks{socks_versions} proxy serving on {', '.join(addresses)}")withcontextlib.suppress(KeyboardInterrupt):loop.run_forever()

但如果您只需要一个Shot Socks服务器,请尝试:

python -m siosocks

这将在1080端口上的所有接口上启动SOCKS 4,5服务器。有关详细信息,请尝试--help

python -m siosocks --help
usage: siosocks [-h][--backend {asyncio,socketserver,trio}][--host HOST][--port PORT][--family {ipv4,ipv6,auto}][--socks SOCKS][--username USERNAME][--password PASSWORD][--encoding ENCODING][--no-strict][-v]

Socks proxy server

optional arguments:
  -h, --help            show this help message and exit
  --backend {asyncio,socketserver,trio}
                        Socks server backend [default: asyncio]
  --host HOST           Socks server host [default: None]
  --port PORT           Socks server port [default: 1080]
  --family {ipv4,ipv6,auto}
                        Socket family [default: auto]
  --socks SOCKS         Socks protocol version [default: []]
  --username USERNAME   Socks auth username [default: None]
  --password PASSWORD   Socks auth password [default: None]
  --encoding ENCODING   String encoding [default: utf-8]
  --no-strict           Allow multiversion socks server, when socks5 used with
                        username/password auth [default: False]
  -v, --version         Show siosocks version

低水平

client/server这样的暗影袜。暗影袜就像是建在袜子上的5和加密。它有“client”,实际上是socks服务器和“server”。所以,确切地说,有两个服务器:客户端和服务器端。shadowsocks的目的是加密“传入”和“传出”服务器之间的数据通常情况下,这看起来像:

client (non-encrypted socks) «incoming» socks server (encrypted socks) «outgoing» socks server (non-socks connection) target server

上面的例子使用凯撒密码是为了简单(当然还有安全性)。

路线图/贡献

  • []添加更多后端(平均值)
  • []加速passthrough实现(似乎很难)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在安卓中使用动画旋转某些东西   排序如何对Java ArrayList进行排序   JAVAlang.OutOfMemoryError:使用Apache POI读取excel时的Java堆空间   java Tomcat 8.0.20内存不足错误   显式EntityManager之后@RequestScoped Bean中的java LazyInitializationException。发现   java对象到片段的通信   java DidRangeBeanConsinRegion并不总是在altBeacon库中工作   用java将xml配置文件应用到我的应用程序中的最佳方法是什么?   输入Java扫描器和字母   字符串Java解析输出的消息   使用pdfbox或其他java库从pdf文件中提取文本时,如何检查文本旋转?   java如何在与给定值相同的记录中找到值   运行时中的java更改工件版本   线程“awteventque0”java中的swing异常。lang.NumberFormatException:空   java为什么数组中的字符串不起作用?