申明:本文章仅供研究学习使用,请勿用于商业、非法用途,本文禁止转载!
注意:根据《中华人民共和国计算机信息网络国际联网管理暂行规定》,计算机信息网络直接进行国际联网,必须使用邮电部国家公用电信网提供的国际出入口信道。任何单位和个人不得自行建立或者使用其他信道进行国际联网。
使用一个虚拟专用网,也就是VPN(virtual private network)可以使你的私有网络拓展至公共场所,即使你连接着星巴克的 Wi-Fi,你的网络浏览仍然保持着安全的加密。当前有很多免费和付费的VPN,但是取决于提供商的运行收费以及服务种类,它们都各有利弊。本文以树莓派为例,主要介绍如何使用Open VPN搭建VPN服务器并建立加密客户端。
不加密情况下假设我们在北京访问百度http网站,ISP是北京联通,百度的服务器在电信,ISP是广东电信。如果没有连接VPN,那么全程数据都是不加密的,如左图。
加密情况下如果使用了VPN,那么从用户到VPN这块通信是经过加密的(绿线表示),无法截取通信内容。不过VPN服务器到目的网站这块还是原来的未加密,如右图。
需要提前准备的材料:
- Open VPN:这是一个开源VPN服务软件
- Linux VPS(本文以 Raspberry Pi 为例)
- 设置内网静态IP地址 并 启用SSH
- 将路由器的1194端口映射至树莓派的内网IP地址(采用UDP协议),如何操作取决于你的路由器型号。请参照你的路由器说明书。
如果你想用其他端口或者用TCP协议,请记得把本教程中的1994端口及UDP的地方都做相应修改。
一、服务端(Linux VPS)部署
(1)前期准备
#修改树莓派的密码
sudo passwd
#软件包升级
sudo apt-get update
sudo apt-get upgrade
(2)安装OpenVPN
OpenVPN是一个用于创建虚拟专用网络加密通道的软件包,允许创建的VPN使用公开密钥、数字证书、或者用户名/密码来进行身份验证。OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Windows 2000/XP/Vista/7以及Android和iOS上运行,并包含了许多安全性的功能。
sudo apt-get install openvpn
(3)安全性配置
为防止任何发现你的VPN的人就可以自由连接,我们会为这个安全的地址准备一个来验证身份的密钥。这就像为你的家门准备一把锁一样。
1. 配置密钥环境(本质上是围绕easy-rsa做文章)
OpenVPN自带了Easy_RSA,发明于1977年,RSA是第一个沿用至今仍旧可用的加密系统。加密的密钥是公开的,解密的密钥是保密的。
#没有root权限,树莓派将不会允许我们创建密钥,因此要获得树莓派的系统权限,
sudo -s #将命令提示符中的"pi@raspberrypi"转换成"root@raspberrypi"
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa #设置让OpenVPN寻找密钥的地址/etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
sudo vim vars #设置密钥存放地址
#将EASY_RSA 变量改为:
export EASY_RSA="/etc/openvpn/easy-rsa"
#可以将KEY_SIZE修改为2048,但这会增长生成密钥的时间
export KEY_SIZE=1024
这样 OpenVPN寻找密钥的地址 = 新建密钥的存放地址
2. 加密(本质上还是围绕easy-rsa做文章)
配置OpenVPN的第一步是建立一个PKI(public key infrastructure 公钥基础设施)。PKI包括:
1.服务端和每个客户端都有一个证书(也称做公钥)和私钥;
2.一个认证机构(CA)的证书和私钥,用来为每一个服务端和客户端颁发证书(sign each of the server and client certificates)。
服务端和客户端验证对方的第一步是验证对方提供的证书是由认证机构(CA)颁发的。然后测试第一步认证通过的证书的头部信息,如:证书的common name,证书的类型(客户端还是服务端)。OpenVPN 支持基于证书的双向认证,也就是说客户端需认证服务端,服务端也要认证客户端,服务端仅仅接受拥有CA颁发的证书的客户端。
在加密学中,授权机构(certificate authority (CA))负责颁布电子证书,电子证书证明公钥的所有者。
1) 为服务端生成公钥(证书)&私钥
cd /etc/openvpn/easy-rsa
source ./vars # 加载你之前修改的文件(vars)
./clean-all # 删除之前所有的密钥文件
./build-ca # 创建根证书
输入第三条命令之后,树莓派会弹出一堆选项,你可以填写这些选项如果你愿意的话--国家名字,州名或省名,位置名,机构名,机构单位和电子邮件地址。如果你不想填写,只要在每个选项出现时按"enter"就行了,树莓派会使用默认值。
./build-key-server [Server_Name] #[Server_Name]处给服务器取个名字
Common Name 输入给服务器取的[Server_Name]
"Sign the certificate?" 输入[y]
"1 out of 1 certificate requests certified, commit?" 输入[y]
必须为OpenVPN服务端生成 Diffie Hellman 参数,这是使你的VPN工作的关键代码,一个使两个没有先前信息的双方通过服务器交换密钥的协议。像RSA一样,这是现有的最早发明的加密系统。
./build-dh # 确保key穿越不安全网络的命令,这一步会花一些时间
2) 为客户端生成公钥(证书)&私钥
服务器端设置完毕后,该为各位用户生成密钥了,或者说"客户"。不要以为在所有客户端使用同样的密钥就可以节省时间,这样的话,一次只能有一个设备能访问VPN。
source ./vars #加载你之前修改的文件(vars)
./build-key clientName # 在keys目录下生成了客户器端的证书和秘钥文件
# 完成后生成client.crt、client.csr和client.key
# 如果vpn拨号想要输入密码,使用该方式:./build-key-pass clientName
# UserName处给服务器取个名字,建议使用Client1, Client2, Client3
# 客户端密钥和证书可以共用,也可以给不同的客户端生成不同的client。生成的client会在keys目录下。
./build-key clientName 命令下:
./build-key-pass clientName 命令下:
Enter PEM pass phrase 设置密码
A challenge password? 必须留空
Sign the certificate? [y/n] 输入[y]
如果你想通过Android或者iOS设备连接OpenVPN,需要补充如下操作:
cd keys
openssl rsa -in Client1.key -des3 -out Client1.3des.key
在显示 Enter pass phrase for Client1.key 后输入密码(建议密码保持一致)
OpenSSL 代表开源的加密套接字实现,是一个建立安全连接的标准方法。你需要为你生成的每一个客户端运行这一步。
3) 添加安全策略(ta.key密钥)
服务阻断攻击(DOS攻击)是骇客找到你的服务器地址后很有效的攻击手段,这种攻击通过生成大量的访问请求来使你的服务器崩溃。关于DOS攻击,在之前的关于kali系列博文中有过介绍。因此,在这里我们需要实现OpenVPN内建的服务阻断攻击防护。
openvpn --genkey --secret keys/ta.key # 生成静态的HMAC(hash-based message authentication code)密钥
(4)将上述安全性配置加入OpenVPN
在keys目录下生成的私钥和证书。下面是这些文件的解释:
sudo vim /etc/openvpn/server.conf #生成一个.conf (configuration) 文件来告诉OpenVPN如何配置服务器
将如下的配置复制入编辑器:
local 192.168.2.0 # 填写 YOUR RASPBERRY PI IP ADDRESS
dev tun # dev tap:基于桥接的隧道 dev tun:基于路由的隧道
proto udp # 若HTTP proxy,则使用TCP协议。 Don't change it if you don't know.
port 1194 # 监听端口号
ca /etc/openvpn/easy-rsa/keys/ca.crt # 证书文件路径
cert /etc/openvpn/easy-rsa/keys/Server.crt # 服务器证书路径 SWAP WITH YOUR CRT NAME
key /etc/openvpn/easy-rsa/keys/Server.key # 服务器私有密钥路径 SWAP WITH YOUR KEY NAME
dh /etc/openvpn/easy-rsa/keys/dh1024.pem # 加密文件路径 If you changed to 2048, change that here!
server 10.8.0.0 255.255.255.0
# server and remote endpoints
ifconfig 10.8.0.1 10.8.0.2
# Add route to Client routing table for the OpenVPN Server
push "route 10.8.0.1 255.255.255.255"
# Add route to Client routing table for the OpenVPN Subnet
push "route 10.8.0.0 255.255.255.0"
# your local subnet
push "route 192.168.2.0 255.255.255.0" # SWAP THE IP NUMBER WITH YOUR RASPBERRY PI IP ADDRESS
# Set primary domain name server address to the SOHO Router
# If your router does not do DNS, you can use Google DNS 8.8.8.8
push "dhcp-option DNS 192.168.2.1" # This should already match your router address and not need to be changed.
# Override the Client default gateway by using 0.0.0.0/1 and
# 128.0.0.0/1 rather than 0.0.0.0/0. This has the benefit of
# overriding but not wiping out the original default gateway.
push "redirect-gateway def1" # 允许客户端重定向穿越VPN到外网
client-to-client
duplicate-cn # 允许同一个证书和密钥在多个客户端登录,以便手机电脑能同时上网
keepalive 10 120
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
cipher AES-128-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log 20
log /var/log/openvpn.log
verb 1
openvpn --daemon --config /etc/openvpn/server.conf # 启动服务
netstat –ln #检测服务端是否已开启:
若检测未开启服务,则说明服务端配置参数有误,去掉–daemon运行参数,执行:
openvpn –config /etc/openvpn/server.conf
即可看到运行的错误提示信息,根据信息更改server.conf文件
若成功运行,执行ifconfig命令会多出一个tun0,即VPN的虚拟网卡。
(5)转发网络流量
在默认配置下树莓派并不会转发网络流量,我们需要另一个配置文件来使树莓派启用对我们新建网络中的网络流量的转发。
方法一:临时生效重启失效
echo 1 > /proc/sys/net/ipv4/ip_forward
方法二:永久生效
sudo vim /etc/sysctl.conf #去掉net.ipv4.ip_forward=1 注释
sudo sysctl -p #启用此配置
(6)OpenVPN防火墙配置(搭建“隧道”)
树莓派有内置的防火墙来限制传输入的网络连接。我们仍然需要防火墙来保护我们,但是我们要在防火墙中挖一个OpenVPN样子的洞,使OpenVPN的连接可以顺利通过。
sudo vim /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
iptables -t 表名 -A 在哪个链的末尾添加规则 -s 源地址 -o 报文流出的网卡 -j 动作;
用iptables把所有10.8.0.0网段的数据包 转换 成 192.168.XX.X 的IP发出去.
10.8.0.0 是客户端连接树莓派VPN后树莓派的默认地址;
"eth0"代表以太网接口。 如果你使树莓派用无线连接互联网的话将其改为"wlan0";
“192.168.XX.X” 不要忘记将默认IP地址改为你树莓派的IP地址。
chmod 700 /etc/firewall-OpenVPN-rules.sh # 默认不可被运行,要将权限设定为700 (所有者可以读、写、执行)
chown root /etc/firewall-OpenVPN-ruels.sh # 将此脚本的所有者改为root
接下来将脚本插入到网络interface初始化的代码中,使其在每次开机时运行。
sudo vim /etc/network/interfaces
找到带有"iface eth0 inet dchp"的那一行,在这行之后的缩进中加上一行:
iface eth0 inet dhcp
pre-up /etc/firewall-openvpn-rules.sh
sudo /etc/init.d/openvpn start
sudo reboot
至此,我们已经在树莓派上配置好了一个全功能的VPN服务器。
二、客户端(计算机和移动设备)部署
1. 配置文件
尽管我们已经配置好了一个全功能的VPN服务器,但是我们目前仍然无法在使用免费WiFi时用这个服务器来传输加密信息,或者访问保存在你家里网络中共享的文件以及媒体。
那是因为我们现在尽管已经为客户端(计算机和移动设备)创建了访问的密钥(前面我们已经为需要连接VPN的不同客户端创建了不同的密钥。已分别命名为 Client1、 Client2 和 Client3等),但是我们还没有告诉客户端(计算机和移动设备)服务器的访问地址、如何连接、以及用什么密钥访问。
这些信息,我们需要打包成一个配置文件,用于客户端OpenVPN识别。
1.1 方法一(批处理):
(1)配置跟随脚本
这个脚本会访问我们的默认设置,从而为每一个客户端生成各自的配置文件。这样我们无需为每个客户端从零单独生成一个配置文件。
sudo vim /etc/openvpn/easy-rsa/keys/Default.txt
在空白文件中写入如下配置::
client
dev tun
proto udp
remote X.X.X.X 1194 #X.X.X.X为服务器IP地址,或者域名 此处端口号必须与服务器中的端口号保持一致
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ns-cert-type server
key-direction 1
cipher AES-128-CBC
comp-lzo
verb 1
mute 20
如果你树莓派没有一个静态的公网ip的话,你需要使用动态DNS服务来给你自己一个域名来代替公网ip,内网穿透。
(2)配置文件
sudo vim /etc/openvpn/easy-rsa/keys/MakeOPVN.sh
在空白文件中写入如下配置::
#!/bin/bash
# Default Variable Declarations
DEFAULT="Default.txt"
FILEEXT=".ovpn"
CRT=".crt"
KEY=".3des.key"
CA="ca.crt"
TA="ta.key"
#Ask for a Client name
echo "Please enter an existing Client Name:"
read NAME
#1st Verify that client’s Public Key Exists
if [ ! -f $NAME$CRT ]; then
echo "[ERROR]: Client Public Key Certificate not found: $NAME$CRT"
exit
fi
echo "Client’s cert found: $NAME$CR"
#Then, verify that there is a private key for that client
if [ ! -f $NAME$KEY ]; then
echo "[ERROR]: Client 3des Private Key not found: $NAME$KEY"
exit
fi
echo "Client’s Private Key found: $NAME$KEY"
#Confirm the CA public key exists
if [ ! -f $CA ]; then
echo "[ERROR]: CA Public Key not found: $CA"
exit
fi
echo "CA public Key found: $CA"
#Confirm the tls-auth ta key file exists
if [ ! -f $TA ]; then
echo "[ERROR]: tls-auth Key not found: $TA"
exit
fi
echo "tls-auth Private Key found: $TA"
#Ready to make a new .opvn file - Start by populating with the
default file
cat $DEFAULT > $NAME$FILEEXT
#Now, append the CA Public Cert
echo "<ca>" >> $NAME$FILEEXT
cat $CA >> $NAME$FILEEXT
echo "</ca>" >> $NAME$FILEEXT
#Next append the client Public Cert
echo "<cert>" >> $NAME$FILEEXT
cat $NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $NAME$FILEEXT
echo "</cert>" >> $NAME$FILEEXT
#Then, append the client Private Key
echo "<key>" >> $NAME$FILEEXT
cat $NAME$KEY >> $NAME$FILEEXT
echo "</key>" >> $NAME$FILEEXT
#Finally, append the TA Private Key
echo "<tls-auth>" >> $NAME$FILEEXT
cat $TA >> $NAME$FILEEXT
echo "</tls-auth>" >> $NAME$FILEEXT
echo "Done! $NAME$FILEEXT Successfully Created."
#Script written by Eric Jodoin
\ No newline at end of file
cd /etc/openvpn/easy-rsa/keys/
chmod 700 MakeOPVN.sh
./MakeOPVN.sh # 执行文件
如果一切正常 会显示 Done! Client1.opvn Successfully Created.
在脚本运行途中,他会要求你输入现有的客户端名称。例如: "Client1"。注意只输入已经存在的客户端名称。
为剩下的客户端都重复执行这一步,有多少个客户端,就应当生成多少个.opvn文件。
(3)将配置文件(.opvn文件)传输至客户端
让客户端下载这些配置文件,你需要使用一个SCP (Secure Copy Protocol)客户端来实现它。在Windows中,我推荐WinSCP。而我在mac中一直使用Fugu。
注意:如果你没有连接SCP客户端的权限,你需要为自己授权在此文件夹的读/写的权限。回到树莓派中输入:
chmod 777 -R /etc/openvpn
注意在你复制完文件后要取消这一步,以防止其他人从这里下载文件!完成之后将权限改为600, 仅让 用户 pi 能读/写文件:
chmod 600 -R /etc/openvpn
1.2 方法二(推荐):
(1)首先从服务器拷贝下列文件到客户端设备
(如果已经下载了OpenVPN 客户端,可以拷贝至默认目录:C:Program Files (x86)OpenVPNconfig)
/etc/openvpn/ta.key
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client.crt
/etc/openvpn/easy-rsa/keys/client.key
再次附keys目录下文件列表:
(2)客户端设备上创建client.opvn文件(与服务端server.conf对应)
client.opvn文件是OpenVPN 客户端的配置文件,配置文件如下所示,大部分地方需要与服务器配置匹配。
默认目录:C:Program Files (x86)OpenVPNconfig
client #指定当前VPN是客户端
dev tun #必须与服务器端的保持一致 基于路由的隧道
proto udp #必须与服务器端的保持一致 采用UDP协议
remote 10.2.8.213 1194 #指定连接的远程服务器的实际IP地址和端口号
resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。
nobind #不绑定特定的本地端口号
persist-key
persist-tun
ca ca.crt #指定CA证书的文件路径
cert client.crt #指定当前客户端的证书文件路径
key client.key #指定当前客户端的私钥文件路径
ns-cert-type server #指定采用服务器校验方式
tls-auth ta.key 1 #如果服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开启;如果未设置,则注释掉这一行;
comp-lzo #与服务器保持一致
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
2. 客户端配置方法
Windows:
(1) 下载并安装 OpenVPN 客户端
OpenVPN 官网下载地址:https://openvpn.net/index.php/open-source/downloads.html
链接:https://pan.baidu.com/s/1zV_Zn4Vo6xe0-jgLBrjDog
提取码:he2q
(2) Import files
打开电脑端的openvpn软件 ——>点击 Import files ——> 方法一导入.ovpn文件,方法二导入5个文件(ca.crt、client.crt、client.key、ta.key、client.opvn)
右下角右键选择Connect ——>输入虚拟 Hub 里设置的一对账号密码 ——> 图标变绿表示成功
2. mac
安装 Tunnelblick
移动和复制 OpenVPN 连接设置文件 (.ovpn 文件) 到在桌面上自动创建的 "Empty Tunnelblick VPN Configuration" 文件夹。
重命名桌面上 "Empty Tunnelblick VPN Configuration" 文件夹为 "anyname.tblk" 。("anyname"的部分可以变化。) 重命名后,你必须指定后缀 ".tblk" 。
当你要重命名时,将显示以下消息。点击 "Add" 按钮。
双击 .tblk 文件夹,将显示以下屏幕。点击 "Only Me" 。
你将输入 Mac OS X 的用户名和密码。
3. Android
安装客户端程序,右上角菜单依次选择 Import-Import Profile from SD Card,选择保存的 l3 的 ovpn 文件,输入账号密码点击 connect,信任即可。
4. iOS
APP store 搜索下载 OpenVPN。
导入.ovpn文件
开启
明白了
博主也太强了,用的什么参考资料啊