用树莓派搭建VPN(上):服务端原理与实践

到处都是免费开放的WIFI,但是在这种有可能被嗅探窃听的网络中你最好不要登录网银。怎么办呢?用VPN(虚拟专用网)。

使用VPN,可以将你的私人网络延伸到公共区域。所以即使你在蹭着星巴克的网,你的网络浏览记录依然是加密安全的。

有很多免费和付费的VPN,但是取决于提供商的运行收费以及服务种类,它们都各有利弊。

最省事的办法就是彻底远离公共WIFI,但对我来说这太极端了。而且在家用一个$35的树莓派来架设一个自己的VPN服务器,相对来说还是比较简单便宜。

我的树莓派和手机差不多大,但确是一个完整的VPN服务器。无论我人在哪里,我都可以连接到家中的网络,访问所有共享的文件和媒体资源。最近我去波士顿的一次旅行中它就派上了用场,我能看到存在华盛顿的家里的视频。

接下来我将给你一篇实用的教程来叫你如何搞定,起码一般的计算机用户都能感到满意。有很多教程都教你如何用树莓派搭建VPN,但是却没有解释为什么。

我读了很多的不同的文章,拼凑出这篇简单易懂又方便上手的教程。

那我们来开始吧!不要迟疑了。

材料

硬件

树莓派Model B:以及附带的电源、保护盒。保护盒可以防止意外短路以免造成永久损伤,你用纸板自己折一个都可以。

SD卡:建议8G以上存储空间。像所有树莓派的项目一样,需要安装NOOBS。

Cat5e线:用来把树莓派的连接到以太网路由器

软件

OpenVPN:这就是我们今天将要安装的开源VPN软件

项目需求

1)在树莓派上设置NOOBS并安装Raspbian。可以参考之前的教程

2)为树莓派分配一个静态的IP地址。需要参照你的路由器的说明书进行设置。可以参考这篇教程

3)启用SSH。我们将使用SSH来连接树莓派。这样在设置树莓派的时候我们就不需要显示器和无线键盘了。可以参见这篇教程

4)转发1994端口(UDP)到树莓派的内部IP地址,如何操作同样取决于你的路由器型号。请参照你的路由器说明书。如果你想用其他端口或者用TCP协议,请记得把本教程中的1994端口及UDP的地方都做相应修改。同样可以参见这篇教程

可见,本项目需要一些树莓派的基本知识。所以,对大多数初学者来说,不适合作为第一个树莓派项目。

注意

本教程中我附上了我用的所有代码。但是当跟着教程重新操作的时候,我发现从文章里复制代码再粘贴到命令行中,总是出现空格和格式的错误。如果你遇到问题,我建议你先重新手动输入命令试试。

第一步

1)开机,改密码。如果你用默认的用户名(pi)和密码(raspberry)的话,那我们这个安全项目就毫无意义了。
打开终端或者PuTTY窗口
sudo passwd
改一个复杂而又记得住的用户名和密码(参加微软提供的建议)。

2)安全更新
sudo apt-get update
sudo apt-get upgrade

应该很快完成,并且会保存故障恢复点。

3)下安装开源软件OpenVPN
sudo apt-get install openvpn

需要消耗部分存储空间,树莓派会要求确定并继续。对于我们准备的8GB内存卡来说这不是问题。

生成密钥

4) 避免我们的VPN服务器被黑客找到并连接上。我们需要为这个服务器地址生成一个密钥,就像给房间门加一把锁。

OpenVPN自带了一个轻量易用的RSA加密工具,Easy_RSA。RSA是1977年开发,时至今日应用最广泛的的加密系统。它的加密密钥是公开的,解密密钥是私有的。如果你读过比特币的原理的话,这听起来会有点熟悉。

使用Easy_RSA生成一个新的独立的密钥。

首先,切换为超级用户。当命令行提示从pi@raspberrypi变成root@raspberrypi,代表切换成功。

sudo -s

这个命令将会以超级用户权限开启当前工作窗口的实例。不然,树莓派会提示没有权限来生成密钥。

接下来输入:

cp –r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa

这里,“cp”代表赋值, “-r”代表递归,就是复制这个目录里的所有东西。

/2.0和 /etc之间的空格表示我们在将第一个地址(示例文件)复制到第二个目录中,这个目录就是OpenVPN存放密钥的地方。

cd /etc/openvpn/easy-rsa

5)下一步,进入刚才指定的easy-rsa的目录。这里我们需要打开/etc/openvpn/easy-rsa/vars进行编辑,可以输入/etc/openvpn/easy-rsa/vars,在当前目录里,我们可以直接输入nano vars

Nano是一个Raspbian自带的编辑工具,尽管有许多编辑工具供更多高级用户使用,在本教程中我们使用nano完成所有的文本编辑。

现在,找到EASY_RSA变量,改为export EASY_RSA=”/etc/openvpn/easy-rsa”,我的文件里它在第13行。

这步就是告诉电脑把生成的密钥放在easy-ras的根目录。

在vars文件里,可以设置把加密位数从1024位提高到2048位。

不过这那会让生成密钥的时间更长,在这里我们就不这么做了。

export KEY_SIZE=1024

按下Control键+X键来保存并退出nano编辑器。

生成密码

6)是时候生成CA证书和根证书了

在密码学里,数字证书认证机构(CA)是一个签发数字证书的实体。这个数字证书证明对一个公钥的所有权。

你可能一直在使用却不知道它。比如,登录网银的时候,如果我点击地址栏前HTTPS的链接那把锁,会看见一个公司的名字GeoTrust,验证了当前访问的银行网站的合法性。所以我知道,这不是一个钓鱼网站。(不过,最近的HeartBleed漏洞揭露了HTTPS并非如我们想象的那样安全。)

在这里,我充当自己的认证授权机构,签发给我自己OpenVPN的密钥,而不是信赖某个第三方公司。

现在,进入了另外的目录。输入一下命令:

source ./vars → 载入之前之前编辑的vars文件

./clean-all → 将会删除所以之前存在的密钥。如果你不想删除某些这个目录里的密钥(例如你在照着本教程进行进行第二遍尝试),跳过这个命令。

./build-ca → 建立了自己的数字证书认证机构。

三条命令之后,树莓派会让你填写一堆选项,都是可选的。国家、省份、所在地,组织名称、单位、常用名、名字、电子邮件等。如果你不想填的话,敲回车保持默认选项。如截图所示:

现在可以给服务器命名。我的就叫“服务器”,你想叫什么都可以,别忘了就好。

./build-key-server [Server_Name]

树莓派又会给出一些可选项让填写,随便怎么填都行。但是注意以下三个:

Common Name 常用名必须是你所设置的服务器名,默认设置如此。

A challenge password? 必须留空

Sign the certificate? [y/n] 显然,必须填y

可以看到,证书将有效期为3650天。所以如果你用这个VPN足够长的话,10年后你必须再来做这一步。

服务端设置。为每个用户或者“客户”生成密钥。我在家有5个密钥,给家里的电脑、平板和电话各一个。也可以比较懒,只生成一个全都使用相同的。但那样一来,同一时间只有一个设备能够访问这个VPN。./build-key-pass UserName 最简单的命名办法是 客户1,客户2,客户3。。。

之后又是更多提示

Enter PEM pass phrase 牢记,将会让你输入两次。
A challenge password? 必须留空.
Sign the certificate? [y/n] 填y.

cd keys
openssl rsa -in Client1.key -des3 -out Client1.3des.key

从这行命令里可以看到我们在使用des3加密,des3是一个复杂的加密算法,对每个数据块使用3次des算法加密防止暴力破解。openssl的意思是开源安全套接字层的实现,是用来保证安全链接的办法。需要为设置的每个用户执行一次。

有人觉得这一步没有必要,你可以跳过这一行。但是,如果你在安卓或者ios上运行OpenVPN的客户端程序的话,这一步是必须的。否则,当前的OpenVPN的版本无法解析你刚才生成的密钥。

Enter pass phrase for Client1.key

老实说,我还是输入了相同的,另外两次也是。如图所示:

现在我们已经建立了服务器的证书以及至少一个客户端,输入
cd /etc/openvpn/easy-rsa/
或者
cd ..
都会切换到/easy-rsa/目录

7)现在生成Diffie-Hellman密钥交换。这是让你的VPN服务器工作的核心代码。密钥交换,让两个没有对方先验知识的实体在公共服务器上共享密钥,和RSA一样,这是最早的加密系统之一。

./build-dh

这一步会需要一些时间。如果你选择的是2048位加密的话就会更长。不过没有办法预测将会运行多久,因为它是在采用随机数来寻找特定的关系。实际上,我在做这个教程的时候,只花了5分钟就生成好了。

8)最后,我们将会实现OpenVPN内建的拒绝服务攻击保护。你可能知道当黑客发现你的服务器地址时,产生大量的访问请求拖垮你的服务器的拒绝服务攻击很奏效.

OpenVPN通过使用预先共享的基于哈希报文摘要的授权码(HMAC) 密钥,来防止这样的攻击产生。这样的话,在服务器检测到静态的授权码密钥之前,不会接受访问请求。这样黑客就无法使用随机的重复的请求来进行攻击了。

用下面这行命令生成HMAC密钥

openvpn –-genkey –-secret keys/ta.key

整合

9)我们已经生成了密钥以及CA来签发。 现在还需要是设置OpenVPN。

OpenVPN的程序已经在运行,但是它不知道使用哪个密钥,你将会从那里访问,你要建立什么样的连接,或者使用哪个IP地址或端口。

由于我们在树莓派上使用的Linux系统没有图形界面来配置。所以我们只能通过nano编辑器在命令行下创建一个.conf配置文件。

nano /etc/openvpn/server.conf

用/etc/openvpn这个地址的原因是,最后我们将会在openvpn的目录里。现在这个文件还是完全空白的,复制这个示例配置文件。在需要改变的地方,数字,名字,IP地址等,我都用大写注释了。

10)编辑另一个配置文件。树莓派默认不会进行网络转发。我们需要配置另一个文件来开启转发流量到我们的新网络。

nano /etc/sysctl.conf

在靠近顶部的地方,有一行“取消这行的注释来启用IPV4包转发”。我在截图中高亮了。

取消注释,删除开头的#。完成这一步,树莓派就成为因特网上的一个中继了,它既接受报文也发送报文。

按Control+X保存并退出。输入下面的命令来应用设置

sysctl -p

这个系统命令sysctl “配置运行时内核参数.” -p代表重新载入你刚刚改变过的文件。

 

11)我们只是创建了一个可以访问互联网的服务器。但是还不能使用它,因为Raspbian自带了的防火墙将会组织来访连接。

Raspbian有一个防火墙来阻断树莓派和未知网络资源连接。我们仍然需要它来保护我们绝大部分网络的进出访问,但是我们需要为OpenVPN在这个防火墙上凿一个洞。

另外,树莓派的防火墙配置在重启后将会重置为默认。我们必须保证它记得OpenVPN的访问总是允许的。需要编写一个小脚本在每次启动时运行。

nano /etc/firewall-openvpn-rules.sh

这是一个空白的可执行脚本文件,输入以下代码。

#!/bin/sh

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT –to-source 192.168.XX.X

别忘记把默认IP地址改为你的树莓派的IP地址。

分析:10.8.0.0是默认的树莓派地址。“eth0”代表使用的以太网卡。如果使用无无线网卡的话,可以修改为wan0,不过不推荐这样做。按CONTROL+X保存退出。

Linux系统的安全策略是创建的文件默认不可执行的,所我们需要改变文件权限和所有者。 首先改变到模式700(所有者可以读,写,执行)。然后改变所有者到root用户,root是Linux系统的超级用户。

chmod 700 /etc/firewall-Openvpn-rules.sh

chown root /etc/firewall-Openvpn-rules.sh

在防火墙上为OpenVPN设置好规则了,现在只需要让它在启动时运行这个脚本。

nano /etc/network/interfaces

找到这一行,“iface eth0 inet dhcp”,在它下方添加一行。修改成这样:

iface eth0 inet dhcp

pre-up /etc/firewall-openvpn-rules.sh

按Control+X保存退出。

最后,最后,最后,重启树莓派。

sudo reboot

恭喜你,树莓派VPN服务器架设成功了!

不过现在还没有客户来连接,它没有起到作用!记住第六步生成的客户名,然后参见本教程另一部分——《用树莓派搭建VPN服务器(下):如何创建加密的客户端》

树莓派照片由Tors提供,其余来自Lauren Orsini。