当前位置: 移动技术网 > IT编程>数据库>Mysql > ubuntu搭建OpenVpn服务器的教程

ubuntu搭建OpenVpn服务器的教程

2018年03月19日  | 移动技术网IT编程  | 我要评论

参考: OpenVpn For Ubuntu 16.04

环境介绍

服务器系统: Ubuntu 16.04

客户端系统: Ubuntu 16.04

版本: OpenVPN 2.3.10

基本配置

OpenVpn的技术核心是虚拟网卡,其次是SSL协议实现

安装OpenVpn服务之后,主机上会多出一个名为tun0的虚拟网卡。而客户端在与服务器成功建立SSL连接之后,也会在本地多出一个tun0的虚拟网卡

搭建VPN服务的第一步,我们先使客户端与服务器能正确建立SSL连接

step1: 安装openvpn和easy-rsa

在服务器上安装openvpn和easy-rsa

$ sudo apt install openvpn easy-rsa

step2: 复制easy-rsa临时目录到home目录下

$ make-cadir ~/openvpn-rsa

step3: 配置生成证书的所需要的变量

使用文本编辑器打开~/openvpn-rsa/vars,修改如下变量的值

(这些变量具体有什么意义,我也不清楚,大家随便改改吧 o(╯□╰)o)

export KEY_COUNTRY="CN"
export KEY_PROVINCE="GD"
export KEY_CITY="ShenZhen"
export KEY_ORG="ORG"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
export KEY_NAME="EasyRSA"

step4: 生成CA证书

$ cd ~/openvpn-rsa
$ source vars
$ ./clean-all
$ ./build-ca

step5: 生成服务器证书

$ ./build-key-server server
$ ./build-dh
$ cd keys/
$ sudo cp server.crt server.key ca.crt dh2048.pem /etc/openvpn/

server是指服务器名,此处可自行更改,为了方便,我把它设为server

此过程中,有几处需要用户确认的地方,根据提示输入回车或者y就行了

网上有些资料提示,server需要与vars文件中的KEY_NAME的值保持一致,但亲测貌似没必要

step6: 生成客户端证书

$ cd ~/openvpn-rsa
$ source vars
$ ./build-key clietn1

~/openvpn-rsa/keys目录下会生成client1.crt和client1.key文件,客户端会用到

此处client1可换成自己的名称

step7: 配置并启动服务器

为了让OpenVpn起来,我们先简单配置一下

$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ sudo gzip -d /etc/openvpn/server.conf.gz

使用编辑器修改/etc/openvpn/server.conf文件,配置证书和密钥的正确路径

ca ca.crt
cert server.crt
key server.key
dh dh2048.pem

我们可以通过systemctl命令来启动、关闭或查看OpenVpn状态

$ sudo systemctl start/status/stop/restart openvpn@CONFIGFILENAME

上面的命令中,CONFIGFILENAME是指配置文件名,我们现在使用的配置文件是server.conf,所以CONFIGFILENAME替换成”server”即可

启动服务之后,我们通过ifconfig会发现一个新的网卡,信息如下

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:610374 errors:0 dropped:0 overruns:0 frame:0
          TX packets:721198 errors:0 dropped:9706 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:40928674 (40.9 MB)  TX bytes:927687322 (927.6 MB)``

step8: 配置客户端

我们还是在服务器PC上生成客户端的配置

$ mkdir ~/openvpn-rsa/clients
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/openvpn-rsa/clients/base.conf

base.conf就是我们客户端通用的配置文件了

使用编辑器修改客户端配置文件,在上面对应~/openvpn-rsa/clients/base.conf,配置证书和密钥的正确路径以及服务器的地址等信息

ca ca.crt
cert client.crt
key client.key
remote vpnserver.example.com 1194

把vpnserver.example.com改为服务器的IP或域名,其他需要按上面的填写

step9: 打包客户端配置

编辑打包脚本~/openvpn-rsa/clients/make_client_tar.sh

#!/bin/bash

if [[ $# != "1" ]] ; then
    echo usage: $0 clientname
    exit 1
fi

KEY_DIR=~/openvpn-rsa/keys
CLIENT=$1

mkdir ${CLIENT}
cp ${KEY_DIR}/ca.crt ${CLIENT}/ca.crt
cp ${KEY_DIR}/${CLIENT}.crt ${CLIENT}/client.crt
cp ${KEY_DIR}/${CLIENT}.key ${CLIENT}/client.key

cp base.conf ${CLIENT}/client.conf

tar -cf ${CLIENT}.tar ${CLIENT}
rm ${CLIENT} -rf

修改权限并运行脚本

$ cd ~/openvpn-rsa/clients/
$ chmod u+x make_client_tar.sh
$ ./make_client_tar.sh client1

则会生成client1.tar打包文件

客户端证书只会在客户端用到,我们还需要把clietn1.tar通过安全的途径传输到客户端

如果只图方便而不考虑安全因素,可以使用python创建一个httpd服务器,然后客户端通过网页下载证书即可

$ sudo python2.7 -m SimpleHTTPServer 80

step10: 启动客户端

在客户端安装openvpn

$ sudo apt-get install openvpn

把之前打包的文件下载下来之后,解压配置文件

$ cd /etc/openvpn/
$ sudo cp ~/Downloads/client1.tar ./
$ sudo tar -xf client1.tar
$ sudo mv client1/* ./
$ sudo rm client1.tar client1 -rf

systemctl的使用方式还是一样

$ sudo systemctl start/status/stop/restart openvpn@CONFIGFILENAME

此处,把CONFIGFILENAME替换成client

启动客户端之后,通过ifconfig同样可以发现一个新网卡,信息如下

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 B)  TX bytes:261 (261.0 B)

step11: 确认连接是否成功

我们可以通过ping来检查服务器与客户端是否建立连接

$ ping -I tun0 10.8.0.1

如果能ping通,则说明一切正常

如果你在服务器本地有搭建服务的话,则可以通过tun0来安全访问了

但我们此时还不能通过OpenVpn上外网,使用命令ping -I tun0 8.8.8.8是ping不通的

因为数据到了服务器的tun0之后并不能转发出去,我们还需要一些其他配置

高级配置

step1: 打开ip转发功能

编辑文件/etc/sysctl.conf,去掉下面语句前的#

#net.ipv4.ip_forward=1 

重载配置

$ sudo sysctl -p /etc/sysctl.conf

step2: 通过iptables配置NAT

创建一个shell脚本/etc/openvpn/openvpn_nat.sh用来配置NAT

#!/bin/bash

iptables -F
iptables -A FORWARD -o eth0 -i tun0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables-save

其中eth0是服务器连接到外网的网卡

设置脚本权限

$ sudo chmod u+x /etc/openvpn/openvpn_nat.sh

在/etc/rc.local中设置开机执行脚本

/etc/openvpn/openvpn_nat.sh

备注:

本来打算在/etc/openvpn/server.conf中配置,让脚本在OpenVpn启动时执行的

up "/etc/openvpn/openvpn_nat.sh"

但测试发现,虽然手动重启OpenVpn时,脚本会被执行

但重启服务器却不会执行脚本

step3: 修改服务器配置

使用编辑器修改服务器配置文件/etc/openvpn/server.conf

$ push "redirect-gateway def1 bypass-dhcp"

使所有客户端把默认网关指向VPN,如果不配置这一项,需要在客户端手动配置路由表

step4: 让OpenVpn服务器开机启动

$ sudo systemctl enable openvpn@server

step5: 重启OpenVpn

在服务器上执行

$ sudo systemctl restart openvpn@server

在客户端执行

$ sudo systemctl restart openvpn@client

step6: 配置客户端DNS服务器

通过以上步骤,如果你能通过tun0 ping通8.8.8.8,那么说明服务器的NAT设置成功了

$ ping -I tun0 8.8.8.8

但是,如果你还ping不通www.baidu.com,那么你就需要指定默认DNS服务器

编辑/etc/network/interfaces,在文件中添加如下内容

dns-nameservers 8.8.8.8 74.82.42.42 8.8.4.4

重新加载DNS配置

$ sudo systemctl restart networking.service

如果成功,/etc/resolv.conf文件中会更新DNS服务器地址

step7: 查看VPN是否正常工作

在百度中搜索IP,如果显示的是你服务器的IP,则说明VPN正常工作了

TODO

现在已经能通过VPN正常上(翻)网(墙)了

但是所有的数据都会从VPN过,希望访问国内网站时,能不走VPN

具体要怎么配置还有待研究

如果有知道的朋友,请告知,谢谢

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网