使用OpenVΡN和树莓派搭建自用校内服务器

本文第一次编辑于2018.03.14

摘要:寒假的时候,想要登录教务处查成绩,然而学校的VΡN时而好使时而不好使,很难受。于是想到搭建一个连通校园内网与公网的自用服务器。

最近看到不少树莓派的妙用,我看了一眼我尸躺的树莓派,可恶(〃>目<),我怎么养了一个这样吃白饭的儿子。

言归正传,寒假的时候,想要登录教务处查成绩,然而学校的VΡN时而好使时而不好使,很难受。于是想到搭建一个连通校园内网与公网的自用服务器。两种解决方案,一种是让树莓派连上校园网,并通过校园网认证。但,这种方案显然不可行,第一我不可能把我的校园网账号一直挂在树莓派上面,第二寒暑假回家用不着校园网账号有些费钱。于是采用第二种解决方案,如果有什么办法能够让树莓派不通过校园网账号认证就能连接公网就好了。查阅了一下相关资料,这里也有两种解决方案,一种是利用IPv6穿出,解释一下,大多数校园网对IPv6是不设限的,即使未通过认证,依然可以连接公网具有IPv6地址的服务器,再在服务器做一个v6到v4的转换,那么未通过认证的设备就能连接互联网了。然而我校并没有为设备分配IPv6地址,所以放弃;第二种是利用UDP 53端口穿出,由于大多数校园网认证服务器是允许内部设备使用外部DNS服务器的,所以把网络流量伪装成DNS流量就成了一种可行的解决方案。

So, do it……

搭建OpenVΡN认证服务器

系统环境

  • Ubuntu 16.04 LTS
  • Ubuntu Mate ARM 16.04

Ubuntu 16.04 LTS是我的公网服务器的操作系统,挂在校园内网的树莓派安装的操作系统则是Ubuntu Mate ARM 16.04。

安装必备软件

在具有公网IP地址的服务器上输入以下命令

~$ sudo apt-get -y install openvρn easy-rsa

这个命令安装了两个包

  • openvρn提供了OpenVΡN的核心
  • easy-rsa包含了一些有用的密钥管理脚本

生成证书和私匙

~$ sudo mkdir /etc/openvρn/easy-rsa
~$ sudo cp -r /usr/share/easy-rsa/* /etc/openvρn/easy-rsa

在创建CA的私钥之前,先编辑/etc/openvρn/easy-rsa/vars

~$ sudo vim /etc/openvρn/easy-rsa/vars

我喜欢用Vim编辑器,你可以按照自己的喜好。

在文件的尾部,设置主证书和密钥的信息

  1. export KEY_COUNTRY="CN"
  2. export KEY_PROVINCE="HuBei"
  3. export KEY_CITY="WuHan"
  4. export KEY_ORG="None"
  5. export KEY_EMAIL="nobody@163.com"
  6. export KEY_CN="VΡN"
  7. export KEY_NAME="VΡN"
  8. export KEY_OU="None"
  9. export KEY_ALTNAMES="VΡN"

特别注意最后KEY_ALTNAMES这一行,尽管这不是原本vars文件中有的,但是还是要把它加到文件的尾部,不然build-ca脚本会运行失败。

保存更改,现在,切换到root访问权限,继续生成主证书和私钥。

~$ sudo su
/home/ubuntu# cd /etc/openvρn/easy-rsa
/etc/openvρn/easy-rsa# source vars
/etc/openvρn/easy-rsa# sh clean-all
/etc/openvρn/easy-rsa# sh build-ca

上面的命令中,所有问题的答案都选择了默认的。在运行了build-ca脚本后,生成了主证书文件(keys/ca.crt)和对应的私钥(keys/ca.key)。私钥必须保密。

生成OpenVΡN服务器的证书和私钥

/etc/openvρn/easy-rsa# sh build-key-server delta

当脚本成功运行完的时候,我们就得到了服务器的证书(keys/delta.crt)和私钥(keys/delta.key)。注意服务器证书被CA的私钥签名了。

生成Diffie-Hellman参数

/etc/openvρn/easy-rsa# sh build-dh

证书,私钥和包含Diffie-Hellman参数的文件已生成,它们都储存在/etc/openvρn/easy-rsa/keys,所以我们到现在为止已经有如下五个文件了:

  1. ca.crt – 证书颁发机构(CA)的证书
  2. ca.key – CA的私钥
  3. delta.crt – OpenVΡN服务器的证书
  4. delta.key – OpenVΡN服务器的私钥
  5. dh2048.pem – Diffie-Hellman参数文件

现在我们需要拷贝除了ca.key的文件到/etc/openvρn

/etc/openvρn/easy-rsa# cd keys
/etc/openvρn/easy-rsa/keys# cp ca.crt delta.crt delta.key dh2048.pem /etc/openvρn
/etc/openvρn/easy-rsa/keys# cd ..

为OpenVΡN客户端生成证书和私钥

我们首先需要为客户端(比如我的树莓派)生成证书和私钥,在/etc/openvρn/easy-rsa有一个脚本帮我们完成这项工作

/etc/openvρn/easy-rsa# source vars
/etc/openvρn/easy-rsa# ./build-key laptop

上面为密钥选取的名字是"laptop",当build-key脚本运行完之后,我们就得到了在keys/laptop.crt的证书和在keys/laptop.key的私钥。有了这两个文件和CA的证书,我们得把这三个文件拷贝到用户有(比如用户ubuntu)权访问的地方。比如我们可以在用户的home目录中新建一个目录并把三个文件拷贝过去

/etc/openvρn/easy-rsa# mkdir /home/ubuntu/ovρn-client
/etc/openvρn/easy-rsa# cd keys
/etc/openvρn/easy-rsa/keys# cp ca.crt laptop.crt laptop.key /home/ubuntu/ovρn-client

OpenVΡN服务器设置

在/usr/share/doc/openvρn/examples/sample-config-files中有一个示例配置文件,它可以简化我们的配置,这个文件叫server.conf.gz

/etc/openvρn/easy-rsa# cd /etc/openvρn
/etc/openvρn# cp /usr/share/doc/openvρn/examples/sample-config-files/server.conf.gz .
/etc/openvρn# tar -xvf server.conf.gz
/etc/openvρn# mv server.conf delta.conf

你可以按个人喜好给OpenVΡN服务器配置文件取名字,但是它必须有".conf"扩展名。我们现在用Vim打开配置文件

/etc/openvρn# vim delta.conf

下面是我们应该做出的更改。
修改端口号和协议如下
port 53
proto udp
定位到这一行
cert server.crt
key server.key
确认OpenVΡN服务器证书和私钥的位置和名称,在我们的例子中,这两行要改成
cert delta.crt
key delta.key
然后定位到这一行
dh dh1024.pem
用"2048"代替"1024":
dh dh2048.pem
在配置文件的末尾,我们添加下面这两行
push "redirect-gateway def1"
push "dhcp-option DNS 114.114.114.114"
最后这两行指示客户端用OpenVΡN作为默认的网关,并用114作为DNS服务器。

后台运行OpenVΡN服务器

~# setsid openvρn --config /etc/openvρn/delta.conf

开启IP转发

~# echo "1" > /proc/sys/net/ipv4/ip_forward

为了让这个设置重启也好用,我们编辑 /etc/sysctl.conf

~# vim /etc/sysctl.conf

找到这一行:
#net.ipv4.ip_forward=1
取消注释。
还需要激活一些iptables相关的规则:

/etc/openvρn# iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
/etc/openvρn# iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
/etc/openvρn# iptables -A FORWARD -j REJECT
/etc/openvρn# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

为了保证服务器重启之后我们不做重复性工作,编辑/etc/rc.local:

~# vim /etc/rc.local

在exit前输入以下内容并保存

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

setsid openvρn --config /etc/openvρn/delta.conf

至此,服务端已经配置完毕。

配置树莓派

安装openvρn

/home/pi$ sudo apt install openvρn

新建config.ovρn文件

/home/pi$ vim config.ovρn

client
dev tun
proto udp
remote x.x.x.x 53 #修改为你的公网服务器的IP地址
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
<ca>
# ca证书,本例中,可通过在公网服务器上执行cat /home/ubuntu/ovρn-client/ca.crt查看
# 将 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 之间的内容粘贴在此处
</ca>
<cert>
# 客户端证书,本例中,可通过在公网服务器上执行cat /home/ubuntu/ovρn-client/laptop.crt查看
</cert>
<key>
# 客户端私匙,本例中,可通过在公网服务器上执行cat /home/ubuntu/ovρn-client/laptop.key查看
</key>

执行客户端OpenVΡN

/home/pi$ sudo su
/home/pi# setsid openvρn --config /home/pi/config.ovρn

执行完后发现树莓派连接手机热点时VΡN正常工作,连接校园网时又无法解析域名地址,百度了一下,原来是Linux操作系统下OpenVΡN客户端修改DNS服务器地址需要借助脚本。

/home/pi$ vim config.ovρn

添加以下三行代码

script-security 2
up /etc/openvρn/update-resolv-conf
down /etc/openvρn/update-resolv-conf

重启OpenVΡN客户端

/home/pi# ps aux|grep openvρn
/home/pi# kill xxxx #此处将xxxx替换为openvρn的PID
/home/pi# setsid openvρn --config /home/pi/config.ovρn

至此未通过校园网认证的树莓派已经可以连接互联网,测试一下

/home/pi$ curl www.youku.com

如果看到一大串输出则表明一切正常。
但是由于OpenVΡN客户端代理了所有的网络连接,树莓派无法连通校园网内网的其他服务器(如教务处等)。
修改OpenVΡN路由规则,使到校园网内网其他服务器的正常请求不走代理

/home/pi$ vim config.ovρn

route 192.168.3.5 255.255.255.255 10.129.255.254
route 10.240.0.0 255.255.0.0 10.129.255.254
route 222.198.120.0 255.255.248.0 10.129.255.254
# 10.129.255.254 是我的树莓派所连接的校园网的网关
重启OpenVΡN,至此外通互联网、内通校园内网的树莓派已经搭建完毕了。
ヽ(・ω・。)ノ

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341