根据实践,pptp、IPsec甚至OpenVPN等kexue上网法已经无法顺利翻越GFW。通过抓包可知,GFW会将pptp的握手期间的ack包吞掉,导致本地一直无法收到服务器端的响应。而OpenVPN也是类似的情况。目前比较可行的上网法就是将OpenVPN的数据包进行混淆,封装成其它协议发送到服务端再解释,这时候就需要用到Obfsproxy。基本原理如下图:

笔者的软硬件环境如下:

Server:

  • 东京机房VPS
  • CentOS 6.5 32-bit

Client:

  • Win 8.1

基本步骤如下:

  • Server端安装Obfsproxy
  • Server端安装OpenVPN
  • Client端安装Obfsproxy
  • Client端安装OpenVPN

基本软件环境要求:

Server端:

  • Python2.7或以上版本(Obfsproxy需要Python2.7或以上的支持),对于CentOS 6.5或其它无法通过官方途径升级Python的系统,可以参考CentOS 下升级Python这篇文章。对于其中部分Python2.7的版本(Python 2 <2.7.9),请确保pip已正常安装及正常运行。
  • OpenSSL及OpenSSL-devel。

Server端安装Obfsproxy:

  • 安装Obfsproxy

    pip2 install obfsproxy

    此处使用pip还是pip2视具体系统环境而定。

  • 配置Obfsproxy
    将以下命令
    /usr/local/bin/obfsproxy obfs2 --dest=127.0.0.1:[server端openvpn所用端口号] server 0.0.0.0: [server端obfsproxy所用端口号]

    添加到/etc/rc.local中,以便开机启动obfsproxy。其中“/usr/local/bin/obfsproxy”应替换成具体运行环境中obfsproxy的绝对路径,否则可能无法开机启动。

Server端安装OpenVPN:

  • 运行命令:

    1. yum install epel-release
  • 安装OpenVPN
    1. yum install openvpn easy-rsa -y

    首先安装openvpn和easy-rsa。其中,easy-rsa用于生成安全密钥。

  • 配置OpenVPN
    将OpenVPN配置文件样板复制到OpenVPN目录下:
    1. cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn

    编辑/etc/openvpn/server.conf:

    port [server端openvpn所用端口号] #使用的端口号,默认为1194,可以不更改
    proto tcp #obfsproxy只支持tcp协议,因此只能设置为tcp
    dev tun
    ca ca.crt #证书、密钥文件
    cert server.crt
    key server.key
    dh dh2048.pemserver 192.168.200.0 255.255.255.0
    push "redirect-gateway def1 bypass-dhcp"
    #以下命令用于设置客户端DNS,是具体情况而定,一般设置为Google DNS
    push "dhcp-option DNS 8.8.4.4"
    push "dhcp-option DNS 8.8.8.8"
    keepalive 20 120
    #设置openvpn运行后权限
    user nobody
    group nobody
    persist-key
    persist-tun
    status openvpn-status.log
    verb 5

      

  • 生成密钥与证书
    创建密钥存放目录:

    mkdir -p /etc/openvpn/easy-rsa/keys

    将生成脚本复制到上面建立的目录中:

    cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

    编辑生成脚本的基本环境变量(非开放VPN可忽略大多数参数):

    vi /etc/openvpn/easy-rsa/vars

    将KEY_NAME编辑为server
    同步OpenSSL配置:

    cp /etc/openvpn/easy-rsa/openssl-1.0..cnf /etc/openvpn/easy-rsa/openssl.cnf

    开始生成:

    cd /etc/openvpn/easy-rsa
    source ./vars
    ./clean-all
    ./build-ca
    ./build-key-server server
    ./build-dh

      

    将证书与密钥移动到openvpn目录下:

    cd /etc/openvpn/easy-rsa/keys
    cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

    生成Client端证书:

    cd /etc/openvpn/easy-rsa
    ./build-key client
  • 路由设置
    添加iptables规则(以下命令仅做参考,请确保openvpn及obfsproxy所使用的端口不被iptables禁止):
    iptables -t nat -A POSTROUTING -s 192.168.200.0/ -o eth0 -j MASQUERADE

    保存,重启刷新规则:

    service iptables save
    service iptables restart

    设置允许转发:
    vi /etc/sysctl.conf

    修改:ipv4.ip_forward =
    刷新:sysctl –p

    开启openvpn服务及设置其开机启动

    service openvpn start
    chkconfig openvpn on
  • 将证书与密钥复制到客户端
    需要复制的文件有:
    /etc/openvpn/easy-rsa/keys/ca.crt
    /etc/openvpn/easy-rsa/keys/client.crt
    /etc/openvpn/easy-rsa/keys/client.key

至此,服务端配置工作完成。进入客户端配置。

Client端安装Obfsproxy

  • 下载Windows版obfsproxy
  • 配置obfsproxy
    运行命令:
    obfsproxy.exe obfs2 socks 127.0.0.1: [client端obfsproxy所用端口号]

    保持运行此程序。

  • *将obfsproxy配置成Windows服务
    可以使用C#编写一个基本服务来启动obfsproxy,编写方法此处不累述。

Client端安装OpenVPN

  • 下载OpenVPN for Windows
  • 配置client端:
    新建ovpn文件并编辑内容如下:
    client
    dev tun
    proto tcp
    remote [server地址] [server端obfsproxy所用端口号]
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    verb 5
    ca ca.crt
    cert client.crt
    key client.key
    socks-proxy-retry
    socks-proxy 127.0.0.1 [client端obfsproxy所用端口号]

      

     
    • 将刚才下载的证书、密钥与此配置文件移动到OpenVPN安装目录下的config文件夹
    • 使用OpenVPN GUI进行连接

实例配置:

[root@east-usa01 ~]# cat /etc/openvpn/server.conf |grep -v "^#"|grep -v "^;"|grep -v "^$"
local 47.****.224
port 1194
proto udp
dev tun
ca ca.crt
cert huanqiuvpn.crt
key huanqiuvpn.key # This file should be kept secret
dh dh1024.pem
server 10.8.200.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.4.4"
push "dhcp-option DNS 8.8.8.8"
duplicate-cn
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

  

kexue shangwang的更多相关文章

  1. Bandwagon的配置记录(一) —— kexue上网

    写在前面 这是kexue上网的一种方法. 看文章前,先拉最底下,看一遍“写在最后”. 租个服务器 我租了个洛杉矶的服务器,系统是ubuntu16.04 x86_64 进入KiwiVM Control ...

  2. kexue shangwang002

    需先搭建 openvpn 海外服务端, 具体参考 https://www.cnblogs.com/weifeng1463/p/11041550.html 选择阿里云华东ecs 搭建openvpn 的客 ...

  3. 架构师养成记--8.Queue

    一.ConcurrentLinkedQueue 是一个适合在高并发场景下,无锁,无界的,先进先出原则.不允许为null值,add().offer()加入元素,这两个方法没区别:pull().peek( ...

  4. rsync错误日志

    问题一: @ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(152 ...

  5. 杂乱无章之javascript(二)

    1.浏览器与事件事件通常是由浏览器所产生,不同的浏览器会产生的事件也有所不同,即使同一浏览器不同版本所产生的事件也有不同.以下为HTML4.01中的事件 2.error事件:它可以调用一个错误处理函数 ...

  6. Windows 之间用rsync同步数据(cwRsyncServer配置)

    rsync是一款优秀的数据同步软件,在跨服务器,跨机房,跨国备份服务器的首选工具,下面就来介绍下如何配置安装cwRsyncServer很大多数软件一样是B/C架构,cwRsyncServer是rsyn ...

  7. Java中的集合与线程的Demo

    一.简单线程同步问题 package com.ietree.multithread.sync; import java.util.Vector; public class Tickets { publ ...

  8. 主机设置ss代理,虚拟机共享代理

    代理的原理: 关于代理的具体的书面定义你百度谷歌可以知道.这里,我想简单通过一个例子,说明代理的原理: 假如,你在北京,但你女朋友在广州,你有东西要给你的女朋友,但是正好你这几天公司有事,所以你不能去 ...

  9. 自然语言处理中的自注意力机制(Self-attention Mechanism)

    自然语言处理中的自注意力机制(Self-attention Mechanism) 近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中,之前我对早期注意力 ...

随机推荐

  1. The Sum of the k-th Powers(Educational Codeforces Round 7F+拉格朗日插值法)

    题目链接 传送门 题面 题意 给你\(n,k\),要你求\(\sum\limits_{i=1}^{n}i^k\)的值. 思路 根据数学知识或者说题目提示可知\(\sum\limits_{i=1}^{n ...

  2. 格式化字符串——初级% 和format

    print '{a},{b}'.format(a='hello',b='word') st='a %s %s x y z' st1=('b','c') print st%st1 print '%s % ...

  3. 项目Alpha冲刺——测试

    作业描述 课程: 软件工程1916|W(福州大学) 作业要求: 项目Alpha冲刺(团队) 团队名称: 火鸡堂 作业目标: 完成项目Alpha冲刺 团队信息 队名:火鸡堂 队员学号 队员姓名 博客地址 ...

  4. centos7部署postgresql集群高可用 patroni + etcd 之patroni篇

    实验环境:centos7.4纯净版 postgres版本: 9.6.15 etcd版本:3.3.11 patroni版本:1.6.0 patroni介绍可参考:https://github.com/z ...

  5. Pycharm中打开Terminal方式

    点击剪头的图标就可以在左侧出现Terminal

  6. 解决Mac外接显示器字体模糊的问题

    Mac外接显示器时,除非接的是Apple自家的显示器“ACD”,不然一般会遇到字体模糊发虚的问题.在终端中执行命令: defaults -currentHost write -globalDomain ...

  7. Spark Partition

    分区的意义 Spark RDD 是一种分布式的数据集,由于数据量很大,因此它被切分成不同分区并存储在各个Worker节点的内存中.从而当我们对RDD进行操作时,实际上是对每个分区中的数据并行操作.Sp ...

  8. js实现文字上下滚动效果

    大家都知道,做html页面时,为了提升网页的用户体验,我们需要在网页中加入一些特效,比如单行区域文字上下滚动就是经常用到的特效.如下图示效果: <html> <head> &l ...

  9. jupyter Notebook 设置密码

    由于服务器关闭了图形界面 所以在服务器上安装Jupyter Notebook 随后本机web访问,利用本机的显卡可以执行plt相关图形命令 本次介绍如何设置Jupyter Notebook的密码设定 ...

  10. B/S大附件上传,支持断点续传

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...