首发微信公众号,结果被删除了。所以博客还是得坚持

《冰与火之歌》中有一道绝境长成保护着七国子民。我们也有一道绝境长成,给我们打造良好健康的信息环境。

不过我们程序员想用github快一点,google查询资料全一点,怎么破?我今天将把走出绝境长成的地图交给你们。

记得收藏保存,万一被删了呢。

免费方案

用的最多的就是蓝灯,下载地址:https://github.com/getlantern/forum

另外还有个集合大全:https://github.com/bannedbook/fanqiang/wiki

下面开始我要开始进行openvpn的翻墙技术交流了,通过 openvpn 实现的穿越长城。

OpenVPN

OpenVPN 是一个用于创建虚拟专用网络加密通道的软件包,最早由James Yonan编写。OpenVPN允许创建的VPN使用公开密钥、电子证书、或者用户名/密码来进行身份验证。

它大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。

OpenVPN 实现翻墙的原理是它虚拟了一张网卡,客户端所有的请求通过这张网卡的包装进行重新的请求与接受。从而完成翻墙。下面来看具体的操作。

安装 OpenVPN

为了详细说明每一个软件的安装原因,我将会按照依次顺序进行,每一个可能的错误尽可能展示。

安装的环境:

  • CentOS: 6.8 64位
  • 1核 1G内存
  • 服务器位置:香港

下载:

1
wget https://swupdate.openvpn.org/community/releases/openvpn-2.4.3.tar.gz

解压:

1
tar -zxvf openvpn-2.4.3.tar.gz && cd openvpn-2.4.3

生成Makefile,为编译做准备:

1
./configure --prefix=/usr/local/openvpn

第一个报错:

checking for SSL_CTX_new… no

configure: error: openssl check failed

错误原因: 没有 openssl 服务,安装: yum install openssl openssl-devel -y

第二次执行: ./configure --prefix=/usr/local/openvpn

第二个报错:

configure: error: lzo enabled but missing

因为 openvpn 会用到 lzo 压缩算法。安装:yum install lzo lzo-devel -y

第三次执行:./configure --prefix=/usr/local/openvpn

第三个报错:

configure: error: libpam required but missing

根据提示安装 yum install pam pam-devel -y

再次执行:./configure --prefix=/usr/local/openvpn

成功运行,生成了编译需要的 Makefile,进行编译安装

1
make && make install

备注:在安装 openall lzo pam 的时候,我们同时安装了 *-devel 包。该包是开发库,一般编译软件的时候都需要。大家也可以试试看不安装是否报错,报错的时候在装上去

加密证书生成

为了确保数据交互的安全,在客户端与服务端交互时,需要进行加密,签名等操作。在进行这一步前我们需要生成供客户端、服务端使用的相关证书。证书生成工具 easy-rsa

准备工作:

1
2
3
git clone https://github.com/OpenVPN/easy-rsa.git
cd /easy-rsa/easyrsa3/
cp vars.example vars

然后修改以下信息,主要是跟自己组织相关的信息,自己随意改

1
2
3
4
5
6
7
8
9
vim vars

// 这些组织信息,根据自己的实际情况进行修改
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Beijing"
set_var EASYRSA_REQ_CITY "Zhao Yang"
set_var EASYRSA_REQ_ORG "Ai Zhong Guo"
set_var EASYRSA_REQ_EMAIL "foo@aiguo.com"
set_var EASYRSA_REQ_OU "aiguo Openvpn"

创建 ca 证书

1
2
./easyrsa init-pki
./easyrsa build-ca

这个过程需要输入密码,与 ca 证书的名称; 请记住这个密码,后面签名服务端与客户端密钥的时候需要。
假设我这里是:

  • 名称: aiguoca
  • 密码:123456

创建服务端证书

1
./easyrsa gen-req server-aiguo nopass

又需要一个名字,不能跟之前的ca冲突: aiguoserver

对服务端证书签名

1
./easyrsa sign server server-aliguo

根据提示输入:yes 以及ca证书的密码:123456

创建Diffie-Hellman证书

该证书主要作用是确保共享KEY安全穿越不安全网络

1
./easyrsa gen-dh

这一步时间有点久。可以倒杯水在过来继续

创建客户端证书
有的教程这里又 init 了一个 pki环境。其实完全没有必要。直接继续在原先的基础上继续即可。

跟着我的姿势继续往下

1
./easyrsa gen-req client-aiguo nopass

客户端创建证书的命令是不是跟服务端创建命令很像?仅仅是取了个不同名字。当然名字还是不要跟上面用过的名字冲突就好: aiguoclient

紧接着对它签名,步骤跟服务端一样。

1
./easyrsa sign client client-ssl

这里需要注意呃,签名的 sign 后面 server 换成了 client 。也正是基于此,才能够知晓那个是服务端证书,那个是客户端证书。签名过程中还是需要输入 yes 以及ca证书的密码 123456

至此证书生成完毕。现在开始相关配置。

OpenVPN 服务端配置

准备工作已经搞定,现在来做服务端的配置,以及让他运行起来。

由于我们是通过编译安装的,在 /etc/ 下面并没有 openvpn 这个目录。手动创建该目录。

1
mkdir /etc/openvpn/

拷贝 openvpn 提供的样板配置文件进去
cp sample-config-files/server.conf /etc/openvpn/

然后把服务端需要的证书,也全部拷贝进去
cp pki/ca.crt pki/issued/server-aiguo.crt pki/private/server-aiguo.key pki/dh.pemy /etc/openvpn/
这里千万不要选错了目录。

1
2
3
4
5
6
7
ll /etc/openvpn/ 

# 完成后,该目录有以下文件
-rw------- 1 root root 1159 Sep 7 13:27 ca.crt
-rw-r--r-- 1 root root 10782 Sep 7 13:25 server.conf
-rw------- 1 root root 4547 Sep 7 13:27 server-aiguo.crt
-rw------- 1 root root 1708 Sep 7 13:27 server-aiguo.key

server.conf 文件的配置

该文件配置项含义中文翻译,看这里: https://my.oschina.net/liucao/blog/863112

这里只讲诉几个关键配置。其他未说明的默认即可。
首先修改协议,建议使用 tcp 协议。网络上讲 udp 在高延时的情况下会存在很多丢包现象。

配置证书路径:

1
2
3
4
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server-ssl.crt
key /etc/openvpn/server-ssl.key
dh /etc/openvpn/dh.pem

这里的文件路径,自己根据实际情况调整

注释掉: ;tls-auth ta.key 0 。因为我们并没有生存该key文件。

打开 comp-lzo 压缩

日志开启到 verb 6 ,方便后续调试

;explicit-exit-notify 1 注释掉,仅有 udp 才可使用

设置dns

1
2
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

打开 duplicate-cn 项,默认是关闭状态。

注释 explicit-exit-notify 1 默认是关闭。

到这一步,配置全部完成。保存退出。

启动服务端

先检查一下,可以在前台运行 openvpn 服务,检查错误以及调试:

1
/usr/local/openvpn/sbin/openvpn --config /etc/openvpn/server.conf

以守护进行运行的命令

1
/usr/local/openvpn/sbin/openvpn --daemon --config /etc/openvpn/server.conf

这里两个命令的使用,是因为以下原因:

  • 本教程安装路径是 /usr/local/openvpn
  • 本教程配置都是放在 /etc/openvpn 中。

情况不同者,根据实际情况设置即可

防火墙与路由转发

!!!如果你用的是 CentOS7 以上的操作系统,下面部分不适合你

首先关闭SELinux:SELINUX=disabled

配置防火墙,准许 1194 端口通过,如果你修改了默认端口,这里记得修改

1
iptables -I INPUT -p tcp --dport 1194 -m comment --comment "openvpn" -j ACCEPT

允许vpn客户端所在网段流量转发到其它网卡

1
iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT

将 vpn 流量转到eth0网卡上

1
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j  MASQUERADE

保存配置结果

1
/etc/init.d/iptables save

开启路由转发

1
2
sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
sysctl -p

sysctl -p 是查看修改后的结果,如果你看到 net.ipv4.ip_forward = 1 ,说明配置正确

至此,服务器上的事情,全部搞定。下面列举一个android手机客户端的配置。其它端也是大同小异。

客户端 Android 的配置

当我们有了服务端,它已经可以进行工作了,如果再有一个客户端,那就能够天下我有了。这里就仅以android为代表说明一下客户端配置,其它端大同小异。

下载开源的android客户端

1
https://f-droid.org/repo/de.blinkt.openvpn_153.apk

客户端的主要作用,就是用来连接上我们的服务器。

将服务器上面的客户端证书拷贝到本地,我选用的是scp。任何能够完成该项任务的手段都可以。

1
2
3
scp root@192.168.11.11:/home/easy-rsa/easyrsa3/pki/private/client-aiguo.key ./
scp root@192.168.11.11:/home/easy-rsa/easyrsa3/pki/issued/client-aiguo.key ./
scp root@192.168.11.11:/home/easy-rsa/easyrsa3/pki/ca.crt ./

唯一需要注意的是,不要搞错了文件路径,这个路径根据每个人设置是不同的,不要完全进行拷贝。

在完成上面步骤后,可以通过qq或者手机助手之类的,将文件发送到自己的手机,请记得文件路径位置。下面会用到。

打开客户端app,新建一个配置文件。名字任意取(最好别用中文)。下面开始说需要配置的项目,未提到的项目默认即可,不需要设置。

BASIC 项目配置

image

注意图中标红的地方。类型一定要选择 用户名/密码 + 证书 的类型。

  • ca证书 找到刚刚拷贝到手机上的 ca.crt 文件
  • 客户端证书 找到刚刚拷贝到手机上的 client-aiguo.crt 文件
  • 客户端证书密钥 找到刚刚拷贝到手机上的 client-aiguo.crt 文件

另外,这里一定要启用 lzo 压缩算法。

在底部的用户与密钥。用户随便填写接口,密码留空(在本教程中,我们没有为用户分配用户名与密码,因此可以这样操作)

服务器列表 项目配置

image

这一比较简单,主要就是两个配置。其一是:
服务器的地址,填写你购买的服务器外网地址。端口如果没有修改过,请默认

其二是将协议修改为:tcp

AUTHENTICATION/ENCRYPTION 项目配置

该项配置很简单,将默认所有打勾的选项,全部取消即可。


至此,配置全部完成,篇幅虽然长,但是并没有什么难点。现在可以回到首页,你会看到刚配置的文件名称,点击它即可连接。

本教程的目的仅仅是技术交流,希望大家翻跃长城后技术实力更上一层楼。