《冰与火之歌》中有一道绝境长成保护着七国子民。我们也有一道绝境长成,给我们打造良好健康的信息环境。
不过我们程序员想用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
3git clone https://github.com/OpenVPN/easy-rsa.git
cd /easy-rsa/easyrsa3/
cp vars.example vars
然后修改以下信息,主要是跟自己组织相关的信息,自己随意改1
2
3
4
5
6
7
8
9vim 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 | ll /etc/openvpn/ |
server.conf 文件的配置
该文件配置项含义中文翻译,看这里: https://my.oschina.net/liucao/blog/863112
这里只讲诉几个关键配置。其他未说明的默认即可。
首先修改协议,建议使用 tcp
协议。网络上讲 udp
在高延时的情况下会存在很多丢包现象。
配置证书路径:1
2
3
4ca /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 才可使用
设置dns1
2push "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
2sed -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
3scp 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 项目配置
注意图中标红的地方。类型一定要选择 用户名/密码 + 证书 的类型。
- ca证书 找到刚刚拷贝到手机上的
ca.crt
文件 - 客户端证书 找到刚刚拷贝到手机上的
client-aiguo.crt
文件 - 客户端证书密钥 找到刚刚拷贝到手机上的
client-aiguo.crt
文件
另外,这里一定要启用 lzo 压缩算法。
在底部的用户与密钥。用户随便填写接口,密码留空(在本教程中,我们没有为用户分配用户名与密码,因此可以这样操作)
服务器列表 项目配置
这一比较简单,主要就是两个配置。其一是:
服务器的地址,填写你购买的服务器外网地址。端口如果没有修改过,请默认
其二是将协议修改为:tcp
AUTHENTICATION/ENCRYPTION 项目配置
该项配置很简单,将默认所有打勾的选项,全部取消即可。
至此,配置全部完成,篇幅虽然长,但是并没有什么难点。现在可以回到首页,你会看到刚配置的文件名称,点击它即可连接。
本教程的目的仅仅是技术交流,希望大家翻跃长城后技术实力更上一层楼。