Socket5入门指南

官方网址:http://ss5.sourceforge.net/

场景描述

在支付项目的开发中,出于安全的考虑,App所部署的网段,不能直接访问公网,所以需要通过技术手段,让其可以访问公网。

尝试了几种方法,各有优缺点:

Nginx转发,缺点是证书传不到第三方,不可接受;

RINETD转发,缺点是只能转发到固定IP,不可接受;

配置路由规则,缺点是会对整个机器路由产生影响,不确定是否安全可靠;

Socket5代理,缺点是要改代码,但是可以代理Http/Https/Ftp等,可以满足要求。

SS5安装

关于SS5的安装过程,网上多有教程,不再赘述,比如,可以参考这个网址:http://lxsym.blog.51cto.com/1364623/769691 。

SS5压力测试

网络监控方法

dstat命令,所代表的receive/send,貌似receive是接收的字节数,*8是带宽,而send并不是机器对外网发送的字节数,故不用它判断收发流量;

iftop命令,在实验场景下(每秒大约4个baidu首页请求,接收流量大约138KB*4),显示的发送和接收的流量,和程序计算的每秒发送接收流量基本一致,故采用这个命令,判断网络流量。

SS5日志

1、STARTED和TERMINATED是配对出现的,代表一次连接的开始和结束

[08/Apr/2015:19:46:57 CST] [1035835136] 10.10.96.106 "" "CONNECT" STARTED 0 0 0 (10.10.96.106:55389 -> 220.181.112.244:80)

[08/Apr/2015:19:48:03 CST] [1035835136] 10.10.96.106 "" "CONNECT" TERMINATED 23189 352 66 (10.10.96.106:55389 -> 220.181.112.244:80)

2、不是每一次代理请求都会被记录下来

当我们访问公网时,由于一次Socket请求(Client:IP+Port和Server:IP+Port)会延续较长时间,所以基本不会在1秒内被复用,所以基本都能记录日志;

当我们测试访问一个内网URL时,1秒内完成几百次成功的Socket请求,很多被复用,对于1秒内“Client:IP+Port和Server:IP+Port”相同的Socket,SS5认为是一个,只有1行日志;

这样,可以解释,访问内网URL时,几千个成功的请求,只有几百行日志的场景。

以上两种日志场景,我们都认为是正常的。

3、Socks method unknown or bad request

telnet 1080端口,输入字符;或者F5心跳检测1080端口,都会导致这个日志不断报出。这个应该通过更好的配置过滤掉。

性能指标

大并发情况下,Socket连接没有正常及时释放,或者到达临界值,如下错误报出。

日志会报如下错误(刷屏):

[08/Apr/2015:16:06:23 CST] [0] [ERRO] $S5ServerAccept$: (Too many open files).

[08/Apr/2015:16:06:23 CST] [1916823296] [ERRO] $S5GetClientInfo$: (Bad file descriptor).

程序会报如下错误:

java.net.SocketException: SOCKS server general failure

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:526)

at java.net.Socket.connect(Socket.java:529)

at sun.net.NetworkClient.doConnect(NetworkClient.java:158)

at sun.net.www.http.HttpClient.openServer(HttpClient.java:411)

at sun.net.www.http.HttpClient.openServer(HttpClient.java:525)

at sun.net.www.http.HttpClient.<init>(HttpClient.java:208)

at sun.net.www.http.HttpClient.New(HttpClient.java:291)

at sun.net.www.http.HttpClient.New(HttpClient.java:310)

at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:987)

at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:966)

at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:841)

at cl.an.HttpConn.run(HttpSocketPressTest.java:188)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)

at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

at java.util.concurrent.FutureTask.run(FutureTask.java:138)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)

at java.lang.Thread.run(Thread.java:662)

性能测试结果

  Socket连接数-正常临界值(约值) Socket连接数-异常临界值(约值) 到达异常临界值后
openfiles -1024 450 550 报上面的Bug,只保留200个线程,35秒后恢复正常
openfiles -4096 2000 2100-2500 第一种情况:

ss5异常停止,不能恢复:service ss5 status,可以看到:

ss5 已死,但是 subsys 被锁;有时还会报:*** glibc detected *** /usr/sbin/ss5: free(): invalid pointer: 0x00007f693c0207e0 ***

第二种情况:

报上面的Too many open files,只保留200个线程,10秒后恢复;

openfiles -65536 结果和openfiles -4096类似    

根据我们的测试结果,可以认为虚拟机10.100.140.85(4个CPU、6G内存),最大支持2000并发。

官网的性能指标是:IBM X360,支持2500并发数。

查看Socket连接数命令:netstat -napo | grep 1080 | wc -l

查看修改最大同时打开文件数命令:vim /etc/security/limits.conf ,需要新开一个终端,ulimit -n,确认生效了,service ss5 restart,才会在ss5中生生效。

参考网址:

http://www.codesky.net/article/201105/161796.html

http://www.justwinit.cn/post/6482/

http://blog.csdn.net/leili0806/article/details/7534985

压测结果

访问www.baidu.com(页面大小:135KB)

1、囿于带宽限制(实测、抢公网带宽,只能抢到1.5M-2M左右),所以,平均每秒,只可能有10-20个成功的Http请求返回。

2、会报java.net.SocketTimeoutException: Read timed out:这是因为网络带宽原因,Timeout时间内没有从流中读取完成数据所致的。这是正常的,网络原因,用不用Socket5代理都有这个问题。

3、会报java.net.ConnectException: Connection timed out: connect:也是网络原因,Timeout时间内,没有连接远程服务器成功。这是正常的,网络原因,用不用Socket5代理都有这个问题。

4、会报java.net.SocketException: Connection reset:怀疑是远程服务器的原因。

5、测试截图如下:

iftop:

dstat:

6、测试过程中,watch -n1 -d ‘netstat -an | grep 1080‘,完全正常,SS5服务本身没有任何压力。

7、测试结果:

a、3个机器各开100个并发,成功率分别是:85%、65%、67%,失败的原因基本是Read timee out,即30秒不能完全从网络输入流中读取完成所有返回数据。

b、1个机器100个并发,成功率大约是98%。

访问内容URL

可以跑带宽大约50-60M,平均每秒250个成功返回,成功率100%,截图如下:

iftop:

dstat:

结论

  • SS5服务本身能承受巨大压力,调优ulimit -n后,大约支撑2000并发。
  • SS5服务,带宽足够,请求的文件越小,网络越好,就能支持更多的成功返回。
时间: 2024-07-29 15:47:08

Socket5入门指南的相关文章

Quartz.NET简介及入门指南

Quartz.NET简介 Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用. Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAVA开源调度框架 Quartz 的移植. 入门指南 本入门指南包括以下内容: 下载 Quartz.NET 安装 Quartz.NET 根据你的特定项目配置 Quartz 启动一个样例程序 下载和安装 你可以下载 zip 文件或使用 Nuget 程序包.Nuget 程序包只包含 Quartz.NET 运

Java程序员的Golang入门指南(上)

Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny.

【翻译Autofac的帮助文档】1.入门指南

[写在前面]尝试做完一件工作之外自我觉得有意义的一件事,那就从翻译Autofac的帮助文档吧. 入门指南 将Autofac集成你的应用程序的步骤通常很简单,一般是: 时刻以IOC(控制反转)的思想来规划你的应用程序 在你的Porject中添加Autofac引用 按照如下步骤设计应用程序的启动环节 创建一个ContainerBuilder 向ContainerBuilder注册组件 通过ContainerBuilder的Build()方法获得Container(后续需用到) 在应用程序运行环节时,

Markdown——入门指南

导语: Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不超过十个,这种相对于更为复杂的 HTML 标记语言来说,Markdown 可谓是十分轻量的,学习成本也不需要太多,且一旦熟悉这种语法规则,会有一劳永逸的效果. Ulysses for Mac 一,认识 Markdown 在刚才的导语里提到,Markdown 是一种用来写作的轻量级「标记语言」

Win32编程API 基础篇 -- 1.入门指南 根据英文教程翻译

入门指南 本教程是关于什么的 本教程的目的是向你介绍使用win32 API编写程序的基础知识(和通用的写法).使用的语言是C,但大多数C++编译器也能成功编译,事实上,教程中的绝大多数内容都适用于任何可以连接API的语言,包括Java.Assembly和Visual Basic:我不会向你呈现任何跟这些语言相关的代码,这需要你在本教程的指导下自己去完成,有一些人在本API的基础上使用其他语言进行编程取得了相当的成功. 本教程不会教你C语言,也不会告诉你怎样去运行你特定的编译器(Borland C

[转载]TFS入门指南

[原文发表地址] Tutorial: Getting Started with TFS in VS2010 [原文发表时间] Wednesday, October 21, 2009 1:00 PM 本月初,我们发布了TFS新基础配置.该配置为建立支持源码管理,工作项和生成(builds)的TFS版本提供了便利. 这是一个好机会将你在VSS(Visual Source Safe)上的资源迁移到TFS,并且还可以选用一些新的特性.现在VS2010 Beta2的正式版已经发布了,下面是该系统的入门指南

编程入门指南

前言 如今编程成为了一个越来越重要的「技能」:作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容:作为创业者,技术创始人的身份则会让你的很多工作显得更容易.而作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始:入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步:你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目:你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么. 这篇文章的内容对此不仅会有一些方向性的建议,

物联网操作系统HelloX开发者入门指南

HelloX开发者入门指南 HelloX是聚焦于物联网领域的操作系统开发项目,可以通过百度搜索"HelloX",获取详细信息.当前开发团队正在进一步招募中,欢迎您的了解和加入.如果您希望加入HelloX的开发团队,建议参照下列步骤进行操作: 1.      首先,请亲手熟悉和操作HelloX操作系统,这是我们开发的核心组件之一,所有其它组件(包括后台组件,终端产品等)都围绕HelloX操作系统展开.这一步很容易操作,请从github(github.com/hellox-project/

STM32F10X入门指南---AD转换

首先,点击下面的链接下载我们需要使用的代码.链接 1.添加必要的文件: 之前我们说过,有三个文件是必须添加的,这三个文件分别是:startup_stm32f10x_xd.s ,stm32f10x_rcc.c ,system_stm32f10x.c.其中,前面的xd是根据你的芯片的容量来选择的.这三个文件都可以在千帆提供的代码中找到.文件路径:Core.rar\Core\STM32\Source\Must . 另外,如果想操作IO口,必须添加千帆的一个库文件DeviceBase.cpp.文件路径: