通过ICS分享VirtualBox虚拟机上的Pulse Secure VPN网络

我们公司的VPN用的是Pulse Secure + MOTP(一种动态口令验证)。目前只有在Windows系统和MacOS系统中才能连接成功;在Linux系统上,由于MOTP的存在,Pulse Secure总是连接不上。还好,平时为了使用只有Windows下才有的一些软件,我的Linux上一直都有VirtualBox的Win7虚拟机。折腾好久之后,最后终于摸索出一种基于VirtualBox的Win7虚拟机连接的VPN的方法:通过VirtualBox Win7虚拟机来进行Pulse Secure VPN的连接,再通过ICS将VPN连接共享给Linux系统使用。

Read More

HTTPS and OpenSSL

一、HTTPS

HTTPS协议使用SSL协议建立了安全的HTTP通道。SSL协议使用对称加密算法对数据进行加密。使用对称加密算法的原因主要是强度高、速度快。但是对称加密使用到的密钥必须使用非对称加密算法才能在网络上安全传输,该过程即SSL握手。SSL会话总是以SSL握手开始。

SSL握手过程大致如下:

Read More

Format JSON with Python

现在以json为数据传输格式的RESTful接口非常流行。为调试这样的接口,一个常用的办法是使用curl命令:

curl http://somehost.com/some-restful-api

对于返回的json字符串,一般在服务端不加处理的情况下,都是没有任何’\t’和’\n’的。为了方便查看,在bash上可以简单地对它进行格式化:

curl http://somehost.com/some-restful-api | python -mjson.tool

当然这要求机器上安装了python,其实也就是利用了json.tool这个程序。

然而有时候还有一个问题,就是若返回的json字符串中包含中文,那么这样打印出来之后,中文会变成以’\u’开头的转义形式,从而让程序员无法直接观察到中文的内容。这并非是一个bug,而是json本身的标准,它要求json的内容都是ascii编码的。标准的json编码器和解码器都会遵循这一点。

Read More

Implement Single-Host-Multiple-IPs on Linux

单主机可发起的总连接数受限于本地端口数,即基本上只能有(65535 - 1024)个。有时候这个量级的连接数并不够用,比如在测试可支持百万长连接的服务的时候,为了节约测试机的数量,则需要尽量增大单机可发起的连接数。解决这个问题需要利用TCP协议的性质,考虑到TCP的本质是一个四元组(源IP,源Port,目的IP,目的Port),在这种情况下,目的IP和目的Port相同,为了突破源Port的限制,办法就只能是增加主机上源IP的数量。

达成这个目标的办法有很多,比如在一台主机上虚拟出多个主机,这样就可以在每个虚拟主机上发起(65535 - 1024)个连接,但是这样做太重了,而且严重浪费了许多资源。一个更好的解决办法是给一台主机分配多个IP,这种做法很轻,不会造成资源的浪费,而且能很好地达到效果。在客户端发起连接之前,可以通过调用bind系统调用将一个socket绑定到一个指定的IP和Port上再发起连接,就可以完全利用所有的(源IP,源Port)组合,这样理论上可以发起并建立的连接数就是 本机拥有的IP的数量 * (65535 - 1024)。

有很多办法可以给一台主机分配多个IP,但各有各的问题,比如使用IP alias就没办法使用DHCP来获得IP,需要网络管理员来手动指派,自己指派则有可能冲突;之前也试着使用macvlan来解决,但是怀疑是不是被交换机给Ban了,比如STP,导致主机的网络很不稳定,一会儿就上不了网了。这里记录一下Network Namespace + VETH + Bridge的方法,这种方法到目前为止工作良好。

Read More

High Throughput TCP Server

在Linux上开发高吞吐量、高并发,即C100K的Server时,默认的一些系统参数已经不能满足性能的需求,从而会导致性能瓶颈。现记录一些自己在学习过程中已知的解决方案。(C1000K的解决方案与此不同,要从内核入手。)

1、打开文件数限制

使用命令ulimit -a可以查看系统给出的所有限制。其中,由-n指出的open files限制了一个进程同时能够打开的最大的文件数,其实也就是最大的文件描述符数。由于在程序中每一个打开的TCP连接也都由系统抽象成一个文件,因此这个值也直接限制了进程可以打开的TCP连接的数量。

修改办法:在/etc/security/limits.conf中添加:

*                soft    nofile          793937
*                hard    nofile          793937

其中,793937指定最大可以打开文件数量,这个值由系统通过内存大小来推荐,通过cat /proc/sys/fs/file-maxsysctl fs.file-max来查看。如果系统默认的fs.file-max值也过小,那么也可以直接修改这个值。

Read More

iOS上PhoneGap与平台互操作

PhoneGap是手机平台上流行的一款中间件。它构建在各种手机平台所提供的WebView(浏览器内核)组件的基础之上,使用javascript语言对应用开发者提供统一的接口(如调用相机、调用其他本地组件),从而屏蔽了各手机平台上OS的异构。在无线小组的调研任务中,我的任务主要是负责iOS平台上的调研,本文简单描述了iOS平台上PhoneGap与平台本地的互操作性的实现。

Read More

GRASP设计模式及OO设计原则

目前反对OO的声音越来越多。很多人开始厌倦OO的反模块化、反并行化,以及往往过于复杂的过度设计。其实OO只是众多软件开发方法论中的一种,有优点也有缺点,我们完全可以汲其精华,去其糟粕。在这里贴一篇多年前的文章。

面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳出相关的类;然后定义各个类之间的关联关系,并给这些类分配相应的职责,同时定义这些类之间的协作方式。将相应的职责分配给具体的类是OO过程中非常重要的一步。GRASP设计模式是职责分配过程中的一套非常重要的设计模式。它给出了在给类分配职责的过程中,设计者们所需要遵从的一些原则或者指导性的建议。

说到设计模式,更为人所知的当然是GoF(Gang of Four)的23种设计模式。与GoF的23种设计模式不同的是,GRASP设计模式描述的是在OO设计中为互相协作的类分配职责的原则或者建议,而GoF的设计模式则是在更高的层次上描述一个OO系统或者其局部系统的行为以及结构上的抽象。

GRASP设计模式的全称是General Responsibility Assignment Software Patterns,即通用职责分配软件模式。它定义了9个基本的OO设计原则或基本的设计构件。这9个设计模式分别是:创建者(Creator)、信息专家(Information Expert)、低耦合(Low Coupling)、控制器(Controller)、高内聚(High Cohesion)、多态性(Polymorphism)、纯虚构(Pure Fabrication)、间接性(Indirection)、防止变异(Protected Variations)。

Read More

Build Erlang with wxWidgets

  1. 在erlang.org上下载erlang的源代码。解压erlang源代码,进入源代码目录中。

  2. 执行

./configure  --enable-threads --enable-smp-support --enable-kernel-poll \
     --enable-sctp --enable-hipe --enable-native-libs && make && sudo make install

./configure的结果会提示有哪些依赖未找到,因而相应的功能不可用。在所有这些依赖中,其他的依赖都好解决,直接安装依赖库就好了。但是唯独wxWidgets的依赖很难解决,即便安装了wxWidgets后都不一定能解决。这时需要一步一步去寻找原因。

首先,wxWidgets从源代码编译安装的方式在erlang的源代码目录下的./lib/wx/README文件中有详细的描述:

./configure --with-opengl --enable-unicode --enable-graphics_ctx \
      --disable-shared && make && sudo make install
cd contrib/src/stc && make && sudo make install

Read More