2014年10月7日星期二

Centos 6下通过nicstat进行网络流量统计

1. 用途说明

nicstat is to network interfaces as “iostat” is to disks, or “prstat” is to processes.

nicstat原本是Solaris平台下显示网卡流量的工具,Tim Cook将它移植到linux平台,官方网站见 这里

相比netstat, 他有以下关键特性:
  • Reports bytes in & out as well as packets.
  • Normalizes these values to per-second rates.
  • Reports on all interfaces (while iterating)
  • Reports Utilization (rough calculation as of now)
  • Reports Saturation (also rough)
  • Prefixes statistics with the current time

2. 安装

2.1 获取源码包

wget http://cznic.dl.sourceforge.net/project/nicstat/nicstat-1.95.tar.gz

2.2 修改Makefile

因为默认编译环境为32位,需要对Makefile进行修改以支持CentOS 6.x的64位系统。

具体查看diff结果:
$ diff Makefile Makefile.Linux
23c23
< CMODEL =  -m64
---
> CMODEL =  -m32
33,34c33,34
< OSREL =       6
< CPUTYPE = x86_64
---
> OSREL =       5
> CPUTYPE = i386

2.3 安装

tar -xzf nicstat-1.95.tar.gz
cd nicstat-1.95
cp Makefile.Linux Makefile # 此时按照上面的diff值修改Makefile文件
make
make install # 安装需要root权限

3. 用法


# 以KBytes大小查看网卡流量
$ nicstat 1
    Time      Int   rKB/s   wKB/s   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
11:49:32       lo    1.02    1.02   17.62   17.62   59.10   59.10  0.00   0.00
11:49:32     eth0   12.32   441.1   67.51   347.6   186.8  1299.3  0.00   0.00
    Time      Int   rKB/s   wKB/s   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
11:49:33       lo    0.00    0.00    0.00    0.00    0.00    0.00  0.00   0.00
11:49:33     eth0    2.58    2.85   36.95   35.96   71.62   81.31  0.00   0.00
    Time      Int   rKB/s   wKB/s   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
11:49:34       lo    0.55    0.55   10.00   10.00   56.70   56.70  0.00   0.00
11:49:34     eth0    3.83    4.07   52.99   52.99   73.94   78.57  0.00   0.00

# 以Mbits大小查看网卡流量
$ nicstat -M 1
    Time      Int   rMbps   wMbps   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
11:53:17       lo    0.01    0.01   17.62   17.62   59.10   59.10  0.00   0.00
11:53:17     eth0    0.10    3.45   67.51   347.6   186.8  1299.3  0.00   0.00
    Time      Int   rMbps   wMbps   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
11:53:18       lo    0.01    0.01   19.97   19.97   58.15   58.15  0.00   0.00
11:53:18     eth0    0.04    0.04   70.91   69.91   71.69   76.54  0.00   0.00
    Time      Int   rMbps   wMbps   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
11:53:19       lo    0.01    0.01   20.00   20.00   58.25   58.25  0.00   0.00
11:53:19     eth0    0.03    0.03   56.99   56.99   71.81   77.18  0.00   0.00

# 统计tcp连接的情况
$ nicstat -t 1
11:55:19    InKB   OutKB   InSeg  OutSeg Reset  AttF %ReTX InConn OutCon Drops
TCP         0.00    0.00   77.95   77.44  0.04  0.04 0.000   1.76   13.3  0.00
11:55:20    InKB   OutKB   InSeg  OutSeg Reset  AttF %ReTX InConn OutCon Drops
TCP         0.00    0.00   84.87   84.87  0.00  0.00 0.000   2.00   14.0  0.00
11:55:21    InKB   OutKB   InSeg  OutSeg Reset  AttF %ReTX InConn OutCon Drops
TCP         0.00    0.00   84.96   86.96  0.00  0.00 0.000   3.00   14.0  0.00

# 统计udp连接的情况
$ nicstat -u 1
11:55:57                    InDG   OutDG     InErr  OutErr
UDP                         0.50   286.8      0.00    0.00
11:55:58                    InDG   OutDG     InErr  OutErr
UDP                         0.00    0.00      0.00    0.00
11:55:59                    InDG   OutDG     InErr  OutErr
UDP                         0.00    0.00      0.00    0.00

2014年10月3日星期五

通过homebrew安装 nginx-1.6 + php-5.5 + mysql-5.6【方法二】

  1. 安装homebrew
  2. 安装nginx
  3. 安装php
  4. 安装mysql
  5. nginx/php/mysql的启动、关闭、重启命令
  6. 问题解决

1. homebrew的安装

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

2. 安装nginx

brew install nginx

配置文件目录:/usr/local/etc/nginx

3. 安装php

brew tap homebrew/dupes
brew tap homebrew/php

brew install --without-apache --with-fpm --with-mysql php55
配置文件目录:/usr/local/etc/php

4. 安装mysql

brew install cmake
brew install mysql
配置文件目录:/usr/local/Cellar/mysql/5.6.21/my.cnf

5. nginx/php/mysql的启动、关闭、重启命令

在.bashrc文件中添加如下行:
# nginx
alias nginx-start="sudo /usr/local/bin/nginx"   
alias nginx-stop="sudo /usr/local/bin/nginx -s stop"
alias nginx-reload="sudo /usr/local/bin/nginx -s reload"
alias nginx-t="sudo /usr/local/bin/nginx -t"
alias nginx-restart="nginx-stop ; nginx-start"
# php
alias php-start="launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist"
alias php-stop="killall php-fpm"
alias php-restart="php-stop && php-start"
# mysql
alias mysql-start="/usr/local/bin/mysql.server start"
alias mysql-stop="/usr/local/bin/mysql.server stop"
alias mysql-restart="/usr/local/bin/mysql.server restart"

6. 问题解决

6.1 错误一: 端口问题

nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
解决: 启动添加sudo,只有root用户才能使用1024以下端口的问题

6.2 错误二: 文件描述符限制

nginx: [warn] 10240 worker_connections exceed open file resource limit: 256
解决:
sudo launchctl limit maxfiles 16384 16384
ulimit -n 16384

Mac OS X 通过 homebrew 安装和配置nginx、mysql、php-fpm【方法一】

一. 安装nginx

1.1 通过brew安装nginx

brew install nginx
如果需要安装其他 nginx 的版本,可以 “brew edit nginx” 打开修改 nginx 的安装信息包 formula,默认会用 vi 打开,在文件开头处修改 nginx 相应版本的下载地址就行。

1.2 配置nginx

安装完后, nginx的配置文件为/usr/local/etc/nginx/nginx.conf, 按需要进行修改

1.3 开机启动nginx

mkdir -p ~/Library/LaunchAgents/
cp /usr/local/Cellar/nginx/1.4.7_1/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
##因为不是超级用户登陆,而是普通用户登陆,并且监听1024以下的端口(80端口),nginx 开机是启动不了。  
##所以要 nginx 开机启动的话,需要给予它管理员权限:
sudo chown root:wheel /usr/local/Cellar/nginx/1.4.7_1/bin/nginx  
sudo chmod u+s /usr/local/Cellar/nginx/1.4.7_1/bin/nginx

1.4 启动停止的nginx脚本

$ sudo vim /etc/init.d/nginx

#!/bin/bash
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

rh_start() {
  sudo  $DAEMON || echo -n " already running"
}

rh_stop() {
  sudo $DAEMON -s stop || echo -n " not running"
}

rh_reload() {
  sudo $DAEMON -s reload || echo -n " can't reload"
}

rh_testconfig() {
  sudo $DAEMON -t || echo -n " test failed "
}

case "$1" in
  start)
        echo "Starting $DESC: $NAME"
        rh_start
        ;;
  stop)
        echo "Stopping $DESC: $NAME"
        rh_stop
        ;;
  reload)
        echo "Reloading $DESC configuration..."
        rh_reload
        echo "reloaded."
  ;;
  t)
        echo "Test $DESC configuration..."
        rh_testconfig
  ;;
  restart)
        echo "Restarting $DESC: $NAME"
        rh_stop
        sleep 2
        rh_start
        ;;
  *)
         echo "Usage: nginx {start|stop|restart|reload|t}" >&2
         exit 3
        ;;
esac
exit 0

二. 安装mysql

2.1 用brew安装mysql

homebrew安装的版本为当前最新的稳定版. 安装好后, 实际上数据的初始化已经做好.

2.2 启动mysql

## 在登录时自动启动mysql
To have launchd start mysql at login:
    ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
## 想让该启动立即生效
Then to load mysql now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
## 不使用苹果自带的方式启动, 可以直接使用启动脚本
Or, if you don't want/need launchctl, you can just run:
    mysql.server start

## 连接数据库
To connect:
mysql -uroot

2.3 修改mysql的初始密码

$ /usr/local/bin/mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] n
 ... skipping.

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!




All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!


Cleaning up...

三. 安装php

3.1 用brew安装php

brew install homebrew/php/php54 --with-fpm --with-gmp --with-mcrypt

安装php-5.4.27的过程中出现了错误, 访问cn2.php.net发现没有该文件, 出现sha不正确的情况.  
于是从其他节点下载好 php-5.4.27.tar.bz2 文件后改名为 php54-5.4.27, 复制到/Library/Caches/Homebrew/目录, 再进行安装可以顺利进行.

3.2 配置php

php的配置: /usr/local/etc/php/5.4//php.ini
php-fpm的配置文件: /usr/local/etc/php/5.4/php-fpm.conf

3.3 开机启动php

mkdir -p ~/Library/LaunchAgents/
cp /usr/local/Cellar/php54/5.4.27/homebrew.mxcl.php54.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php54.plist

启动 php-fpm 的话就直接在终端里执行 “php-fpm”,默认打开 php-fpm 会显示一个状态 shell 出来  
把 php-fpm 的配置文件里的 “daemonize = no” 改为 “daemonize = yes”,就会以后台守护进程的方式启动  
对于刚修改的配置文件,可以执行 “php-fpm -t” 来检测配置有没有问题。

3.4 启动和关闭脚本

$ vim /etc/init.d/php-fpm  
#!/bin/bash
DESC="php-fpm daemon"
NAME=php-fpm
# php-fpm路径
DAEMON=/usr/local/Cellar/php54/5.4.27/sbin/$NAME
# 配置文件路径
CONFIGFILE=/usr/local/etc/php/5.4/$NAME.conf
# PID文件路径(在php-fpm.conf设置)
PIDFILE=/var/run/$NAME.pid

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

rh_start() {
  sudo  $DAEMON -y $CONFIGFILE || echo -n " already running"
}

rh_stop() {
  sudo kill -QUIT `cat $PIDFILE` || echo -n " not running"
}

rh_reload() {
  sudo kill -HUP `cat $PIDFILE` || echo -n " can't reload"
}

case "$1" in
  start)
        echo "Starting $DESC: $NAME"
        rh_start
        #echo "\n"
        ;;
  stop)
        echo "Stopping $DESC: $NAME"
        rh_stop
        #echo "\n"
        ;;
  reload)
        echo "Reloading $DESC configuration..."
        rh_reload
        echo "reloaded."
  ;;
  restart)
        echo "Restarting $DESC: $NAME"
        rh_stop
        sleep 2
        rh_start
        #echo "\n"
        ;;
  *)
         echo "Usage: php-fpm {start|stop|restart|reload}" >&2
         exit 3
        ;;
esac
exit 0

2014年9月4日星期四

tmux使用教程及技巧

tmux简介
tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;当然其功能远不止于此。
直接使用yum安装: yum install tmux
tmux使用C/S模型构建,主要包括以下单元模块:

- 说明
server 服务器。输入tmux命令时就开启了一个服务器。
session 会话。一个服务器可以包含多个会话。
window 窗口。一个会话可以包含多个窗口。
pane 面板。一个窗口可以包含多个面板。
操作
类似各种平铺式窗口管理器,tmux使用键盘操作,常用快捷键包括:

Ctrl+b 激活控制台;此时以下按键生效
系统操作 ? 列出所有快捷键;按q返回
d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话
D 选择要脱离的会话;在同时开启了多个会话时使用
Ctrl+z 挂起当前会话
r 强制重绘未脱离的会话
s 选择并切换会话;在同时开启了多个会话时使用
: 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器
[ 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出
~ 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息
窗口操作 c 创建新窗口
& 关闭当前窗口
数字键 切换至指定窗口
p 切换至上一窗口
n 切换至下一窗口
l 在前后两个窗口间互相切换
w 通过窗口列表切换窗口
, 重命名当前窗口;这样便于识别
. 修改当前窗口编号;相当于窗口重新排序
f 在所有窗口中查找指定文本
面板操作 将当前面板平分为上下两块
% 将当前面板平分为左右两块
x 关闭当前面板
! 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板
Ctrl+方向键 以1个单元格为单位移动边缘以调整当前面板大小
Alt+方向键 以5个单元格为单位移动边缘以调整当前面板大小
Space 在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled
q 显示面板编号
o 在当前窗口中选择下一面板
方向键 移动光标以选择面板
{ 向前置换当前面板
} 向后置换当前面板
Alt+o 逆时针旋转当前窗口的面板
Ctrl+o 顺时针旋转当前窗口的面板
tmux配置
tmux的系统级配置文件为/etc/tmux.conf,用户级配置文件为~/.tmux.conf。配置文件实际上就是tmux的命令集合,也就是说每行配置均可在进入命令行模式后输入生效。
下面是我的~/.tmux.conf配置:
# base
set -g display-time 3000    # 提示信息的持续时间;设置足够的时间以避免看不清提示,单位为毫秒
set -g history-limit 65535  # 每个窗口中可展示的历史行数

# mouse
set -g mode-mouse on         # 开启鼠标控制
set -g mouse-resize-pane on  # 开启鼠标可调整pane大小
set -g mouse-select-pane on  # 开启鼠标可选择pane
set -g mouse-select-window on # 开启鼠标可选择窗口

# bind key
unbind '"'           # 取消 '"' 的绑定, 原用于上下分割窗口
bind _ splitw -v     # 绑定 '_' 上下分割窗口 
unbind %             # 取消 '%' 的绑定, 原用于左右分割窗口
bind | splitw -h     # 绑定 '|' 左右分割窗口
bind r source-file ~/.tmux.conf \; display "Reloaded!" # 绑定 'r' 用于重载配置文件,重载后显示 "Reloaded!"
bind s setw synchronize-panes on  # 开启 pane 命令同步
bind a setw synchronize-panes off # 关闭 pane 命令同步

# window
set -w -g utf8 on    # 窗口显示内容使用utf8字符集显示
set -w -g window-status-current-bg red  # 当前选中窗口背景色为红色

# title
set -g set-titles on           # 开启终端程序的标题显示
set -g set-titles-string "#T"  # 标题显示内容为 ~/.bashrc 中 $PROMPT_COMMAND 变量的内容

# status bar
set -g status-utf8 on          # 状态栏使用utf8字符集
set -g status-bg black         # 状态栏背景色为 黑色
set -g status-fg white         # 状态栏前景色为 白色
set -g status-interval 2       # 状态栏刷新频率 2秒
set -g status-justify "left"   # 窗口列表的位置 靠左
set -g status-left "#[fg=yellow]#S "  # 状态栏最左端: Session的名称(颜色为yellow)
set -g status-right "#[fg=black]#T #[fg=yellow]%H:%M"  # 状态栏最右端: $PROMPT_COMMAND及时间
set -g status-right-length 50  # 状态栏右端的长度
tmux的session管理
Seesion 可以有效地分离工作环境。如我有三个网站, 可以分别设置'siteA','siteB','siteC'三个Session, 可以针对不同网站的需求和服务器的分布情况进行特定管理.
tmux new -s session_name # 创建一个叫做 session_name 的 tmux session
tmux attach -t session_name  # 重新开启叫做 session_name 的 tmux session
tmux switch -t session_name # 转换到叫做 session_name 的 tmux session
tmux list-sessions  # 列出现有的所有 session
tmux ls  # 列出现有的所有 session
tmux detach (prefix + d) # 离开当前开启的 session
tmux rename-session -t [current-name] [new-name] # 重命名session
Session的批量重建和管理脚本
#!/bin/bash


Session=$1
session_arr=(siteA siteB siteC)

function tmux_siteA()
{
    # mg
    tmux new-session -d -s 'siteA' -n 'mg' # 创建session siteA, 并给默认窗口命名为 mg
    tmux select-window -t 'mg'
    tmux split-window -h -p 50
    tmux send-keys -t 0 'ssh 192.168.1.101' C-m        # 其中 C-m 表示回车键 

    # ngx.web
    tmux new-window -n 'ngx.web'           # 新建 ngx.web 的窗口
    tmux split-window -h -p 50             # 左右分割 ngx.web 窗口为两个pane, 新建的pane的百分比为50%
    tmux send-keys -t 0 'ssh 1.1.1.0' C-m  # 引号内的内容是该pane中需要预先执行的命令
    tmux send-keys -t 1 'ssh 1.1.1.1' C-m  # 我这里是分别登录到两台机器中去
}

function tmux_siteB()
{
    # mg.zbx
    tmux new-session -d -s 'siteB' -n 'mg.zbx'
    tmux select-window -t 'mg.zbx'
    tmux split-window -h -p 50
    tmux select-pane -t 0
    tmux split-window -v -p 50
    tmux send-keys -t 1 'pwd' C-m
    tmux send-keys -t 2 'ssh 192.168.1.100' C-m

    # ngx.web
    tmux new-window -n 'ngx.web'
    tmux split-window -h -p 50
    tmux select-pane -t 1
    tmux split-window -v -p 50
    tmux select-pane -t 0
    tmux split-window -v -p 50
    tmux send-keys -t 0 'ssh 192.168.1.100' C-m
    tmux send-keys -t 1 'ssh 192.168.1.101' C-m
    tmux send-keys -t 2 'ssh 192.168.1.102' C-m
    tmux send-keys -t 3 'ssh 192.168.1.103' C-m

}

function tmux_siteC()
{
    # mg
    tmux new-session -d -s 'siteC' -n 'mg'
    tmux select-window -t 'mg'
    tmux split-window -h -p 50
    tmux send-keys -t 2 'g 80' C-m

    # push
    tmux new-window -n 'push'
    tmux split-window -h -p 50
    tmux select-pane -t 1
    tmux split-window -v -p 50
    tmux select-pane -t 0
    tmux split-window -v -p 50
    tmux send-keys -t 0 'ssh 192.168.1.100' C-m
    tmux send-keys -t 1 'ssh 192.168.1.101' C-m
    tmux send-keys -t 2 'ssh 192.168.1.102' C-m
    tmux send-keys -t 3 'ssh 192.168.1.103' C-m

}

for i in ${session_arr[@]}
do
     if [ "X$i" == "X$Session" ]
     then
        tmux start-server
        tmux has-session -t $Session 2>/dev/null
        Res=$?
          if [ $Res != 0 ]
          then
               tmux_$Session
          fi

        tmux attach-session -d -t $Session
     fi
done

2014年8月14日星期四

常用翻墙方法介绍

常用翻墙方法:
  1. hosts方法
  2. 专业翻墙软件 翻墙工具(自由门、无界、世界通, Tor, Gladder)
  3. VPN方法
  4. 代理软件
  5. 反向代理
  6. 正向代理
  7. 透明代理
  8. pac智能翻墙
hosts方法
原理
部分域名只是进行了dns污染, 只需设置好正确的hosts, 就可以访问被封的网站.
例:
#Goggle Services ----Starts---- 
203.208.46.146 chrome.google.com 
203.208.46.146 code.google.com 
203.208.46.146 picasaweb.google.com 
203.208.46.146 images6-focus-opensocial.googleusercontent.com 
203.208.46.146 plus.google.com 
203.208.46.146 dl.google.com 
203.208.46.146 dl-ssl.google.com 
203.208.46.146 groups.google.com 
203.208.46.146 goo.gl 
203.208.46.146 appengine.google.com 
#Google Services ----Ends----

#Twitter ----Starts---- 
199.59.150.9 api.twitter.com 
199.59.150.10 twitter.com 
199.59.150.10 www.twitter.com 
#Twitter ----Ends---- 
弊端
  1. 被dns污染的域名有限
  2. 有些域名就算设置了hosts, 还有域名关键字过滤手段等着
  3. 维护成本极高
  4. 每个设备都需要维护一份hosts, 有些设备无法修改hosts文件
翻墙软件
原理
专用翻墙软件的私有协议
常用翻墙软件
Tor, 无界门, 自由门, 无界浏览
弊端
  1. 近年来相继被封, 翻墙效果不太稳定.
  2. 需要安装和配置客户端, 但在没翻墙的情况下, 基本无法获取到这些软件.
  3. GFW未必能知道你透过翻墙软件在浏览什么,但要知道你在使用翻墙软件就绝对不难。
VPN方法
原理
通过VPN建立一条加密隧道, 让数据在该加密隧道内通信. 常用的VPN协议有OpenVPN, L2TP/IPsec, PPTP, 可以通过在国外机器上自己安装搭建VPN服务器.
免费免安装的 VPN
绝大多数不需要安装就可以使用的 VPN 都适用于任何系统的电脑和智能手机:
  • MacroVPN
  • Prox Network
  • Free UK VPN
  • Tenacy
  • Best Free VPN
只要在系统内设置好服务器地址,输入帐号和密码就可以使用了。
如: http://www.vpnforuk.com/
免费 VPN 客户端
需要安装的 VPN 客户端, 一般只适用于电脑:
  • SecurityKiss (适用于 Windows)
  • ProXPN (适用于 Windows 和 Mac)
  • Hotspot Shield (适用于 Windows 和 Mac)
  • ExpatShield (适用于 Windows)
  • Loki VPN Client (适用于 Windows)
  • OpenVPN (适用于 Windows、Mac、Linux、iOs、Android、等等)
  • RaptorVPN (适用于 Windows 和 Mac)
弊端
  1. GFW强大到可以探测协议头, 从而阻断VPN连接
  2. 需要国外拥有vps或者主机, 搭建VPN服务器
  3. vpn不区分流量, 要不全部的流量都通过VPN, 或者都不通过
  4. 为了智能翻墙, 需要维护一个路由表
  5. 就算维护了一个路由表区分国内国外流量, 但是并不是国外所有网站都是被封的, 减慢了访问正常网站的速度
代理软件
原理
用户通过浏览器访问网站的流程是: 首先浏览器发起请求, 所有的请求都是发送给本机或者局域网内的代理客户端, 客户端代理软件通过自生的加密通道连接国外的代理服务端, 服务端接收到数据后通过加密通道传输给代理客户端, 代理客户端将数据转发给浏览器呈现.
典型代表
  • goagent
  • stunnel
  • ssh隧道
弊端
  1. 需要在浏览器上手工安装proxy switchsharp设置代理, 只让浏览器生效
  2. 也可以不安装插件, 设置系统代理, 那样将进行全局代理设置
  3. 有可能遭受中间人攻击
优点
配合proxy switchsharp可以自定义规则进行翻墙 可以使用别人已经做好的配置, 直接应用就可以, 基本的被墙网站都可以打开.
反向代理和正向代理
反向代理
对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置(需要智能dns支援)。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。CDN常使用该种方法.
正向代理
正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
常用反向/正向代理软件
  • nginx
  • squid
弊端
  1. 需要对每个域名单独配置
  2. 对于https站点来说, 一样会遇到证书问题
透明代理
原理
透明代理的意思是客户端根本不需要知道有代理服务器的存在,它劫持并改编你的request fields(报文),并会传送真实IP。 如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系,而正向代理和反向代理就是表亲关系了。 透明代理一般需要在网关出口处对网络进行劫持, 一般需要专有设备支持. 我自己的测试中, 可以做到http的透明代理, 但是https的代理总提示证书错误. 透明代理实践的例子就是时下很多公司使用的行为管理软件。
常用软件
  • squid
  • 行为管理软件
特点
  1. 可以对网络行为进行比较详细的控制
  2. 需要购买专业的设备
PAC文件翻墙
原理

pac文件项目(Flora_Pac),是一个辅助翻墙工具,代理自动配置(PAC)文件是用于浏览器自动代理的脚本。PAC文件定义了浏览器和其他用户代理如何自动选择适当的代理服务器来访问一个URL。浏览器在访问其他页面以前,首先访问这个PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通过网页的网络代理自发现协议(Web Proxy Autodiscovery Protocol)自动配置的。这个pac并不是翻墙工具,它是翻墙代理的辅助软件,相当于智能调度配置各种翻墙软件和浏览器,在使用时必须自备各种翻墙工具并启动相应的软件来配合它。

Pac文件分别对应常用的自由门、逍遥游、无界、Puff、赛风3、 世界通、花园、张生翻墙、tor、Vidalia、Your Freedom、SSH、ssh+Privory、GoAgent、GAppProxy、Wallproxy、Hyk-proxy、Snova、西厢代理 等翻墙软件。