使用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="[email protected]"
  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证书,本例中,可通过在公网服务器上执行cat /home/ubuntu/ovρn-client/ca.crt查看
# 将 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 之间的内容粘贴在此处


# 客户端证书,本例中,可通过在公网服务器上执行cat /home/ubuntu/ovρn-client/laptop.crt查看


# 客户端私匙,本例中,可通过在公网服务器上执行cat /home/ubuntu/ovρn-client/laptop.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,至此外通互联网、内通校园内网的树莓派已经搭建完毕了。
ヽ(・ω・。)ノ

参考

  • [1] https://www.linuxidc.com/Linux/2014-08/105925.htm

你可能感兴趣的:(使用OpenVΡN和树莓派搭建自用校内服务器)