写在前面的前言:
因为工作需要安全连接公司的内网机器。对比了几个vpn的配置及工作模式。安全性:openvpn>l2tp/ipsec>pptp ,当然还有ss+代理的模式。但是openvpn是最安全的,服务器要效验证书,客户端也要效验证书。因此选择了openvpn。之前我们也搭建过l2tp/ipsec得vpn ,需要了解的可以移步

OpenVPN的工作原理
在Linux2.4版本以上,操作系统支持一个名为tun的设备,tun设备的驱动程序中包含两个部分,一部分是字符设备驱动,一部分是网卡驱动。网卡的驱动把从TCP/IP协议栈收到的数据包结构skb放于tun设备的读取队列,用户进程通过调用字符设备接口read获得完整的IP数据包,字符驱动read函数的功能是从设备的读取队列读取数据,将核心态的skb传递给用户;反过来字符驱动write函数给用户提供了把用户态的数据写入核心态的接口,write函数把用户数据写入核心空间并穿入TCP/IP协议栈。该设备既能以字符设备的方式被读写,作为系统的虚拟网卡,也具有和物理网卡相同的特点:能够配置IP地址和路由。对虚拟网卡的使用是OpenVPN实现其SSL VPN功能的关键。
OpenVPN服务器一般需要配置一个虚拟IP地址池和一个自用的静态虚拟IP地址(静态地址和地址池必须在同一个子网中),然后为每一个成功建立SSL连接的客户端动态分配一个虚拟IP地址池中未分配的地址。这样,物理网络中的客户端和OpenVPN服务器就连接成一个虚拟网络上的星型结构局域网,OpenVPN服务器成为每个客户端在虚拟网络上的网关。OpenVPN服务器同时提供对客户端虚拟网卡的路由管理。当客户端对OpenVPN服务器后端的应用服务器的任何访问时,数据包都会经过路由流经虚拟网卡,OpenVPN程序在虚拟网卡上截获数据IP报文,然后使用SSL协议将这些IP报文封装起来,再经过物理网卡发送出去。OpenVPN的服务器和客户端在虚拟网卡之上建立起一个虚拟的局域网络,这个虚拟的局域网对系统的用户来说是透明的。
OpenVPN的服务器和客户端支持tcp和udp两种连接方式,只需在服务端和客户端预先定义好使用的连接方式(tcp或udp)和端口号,客户端和服务端在这个连接的基础上进行SSL握手。连接过程包括SSL的握手以及虚拟网络上的管理信息,OpenVPN将虚拟网上的网段、地址、路由发送给客户端。连接成功后,客户端和服务端建立起SSL安全连接,客户端和服务端的数据都流入虚拟网卡做SSL的处理,再在tcp或udp的连接上从物理网卡发送出去。

系统环境

# cat /etc/redhat-release

CentOS Linux release 7.8.2003 (Core)

# uname -a

Linux localhost 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

 

1.添加epel源

yum install epel-release -y

2.安装openvpn及easy-rsa,该包用来制作ca证书,服务端证书,客户端证书

# yum install openvpn easy-rsa -y

3.查看openvpn及easy-rsa版本

# openvpn –version
OpenVPN 2.4.9 x86_64-redhat-linux-gnu
# ls /usr/share/easy-rsa/
3 3.0 3.0.7

4.easy-rsa配置

转到/etc/openvpn目录下,将easy-rsa脚本复制到此目录下
# cd /etc/openvpn/
# cp -r /usr/share/easy-rsa/ .
然后,跳转到/etc/openvpn/easy-rsa/3/目录并创建vars文件(证书的相关信息),复制粘贴一下内容,并保存
# cat vars
set_var EASYRSA_REQ_COUNTRY “CN”
set_var EASYRSA_REQ_PROVINCE “JiangXi”
set_var EASYRSA_REQ_CITY “JiAn”
set_var EASYRSA_REQ_ORG “ycy”
set_var EASYRSA_REQ_EMAIL “ycy@163.com”
set_var EASYRSA_REQ_OU “My OpenVPN”
PS:若你有公司的证书,var可以参考以下写法
# cat vars
export KEY_COUNTRY=”CN”
export KEY_PROVINCE=”SZ”
export KEY_CITY=”SZ”
export KEY_ORG=”black8″
export KEY_EMAIL=”black8@black8.com.cn”

5.构建openvpn秘钥

5.1使用”easyras”命令行构建CA秘钥,服务端客户端秘钥,DH和CRL PEM文件
切换到”/etc/openvpn/easy-rsa/3″目录
# cd /etc/openvpn/easy-rsa/3
初始化PKI目录
# ./easyrsa init-pki
5.2构建ca秘钥
# pwd
/etc/openvpn/easy-rsa/3
# ./easyrsa build-ca
需要输入证书密码 :eg:123456
需要输入通用名: eg:ycy
注意:记住建立ca秘钥是的密码,后面要用到,如果忘记只能从ca秘钥这一步重新开始!!!
当然你可以不要密码 ./easyrsa build-ca nopass就行了,我这里使用了密码123456

5.3构建服务器秘钥
现在我们构建服务器秘钥,构建名可自行定义,这里我们就用”server”
注意:”nopass 选项”,用于禁用”server”秘钥的密码
# pwd
/etc/openvpn/easy-rsa/3
# ./easyrsa gen-req server nopass
需要输入通用名: eg:ycy
req: /etc/openvpn/easy-rsa/3/pki/reqs/server.req
key: /etc/openvpn/easy-rsa/3/pki/private/server.key
5.4使CA证书签署”server”秘钥
# pwd
/etc/openvpn/easy-rsa/3
# ./easyrsa sign-req server server
Confirm request details: yes
Enter pass phrase for /etc/openvpn/easy-rsa/3/pki/private/ca.key:123456
Certificate created at: /etc/openvpn/easy-rsa/3/pki/issued/server.crt
看到这个说明签署成功
已创建的所有服务器证书秘钥:
服务器私钥位于:/etc/openvpn/easy-rsa/3/pki/private/server.key
服务器证书位于:/etc/openvpn/easy-rsa/3/pki/issued/server.crt

6.创建客户端秘钥

6.1创建一个生成名为”client01″的新客户端秘钥
# ./easyrsa gen-req client01 nopass
输入一个通用名:eg:ycy
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/3/pki/reqs/client01.req
key: /etc/openvpn/easy-rsa/3/pki/private/client01.key
6.2使用ca证书签署”client01″秘钥
# ./easyrsa sign-req client client01

Confirm request details: yes
Enter pass phrase for /etc/openvpn/easy-rsa/3/pki/private/ca.key:123456
Certificate created at: /etc/openvpn/easy-rsa/3/pki/issued/client01.crt
6.3生成 Diffie-Hellman秘钥
# ./easyrsa gen-dh
DH parameters of size 2048 created at /etc/openvpn/easy-rsa/3/pki/dh.pem
6.4生成tls-auth key并将其拷贝到证书目录中(防DDos攻击、UDP淹没等恶意攻击)
#编译安装执行此句 /usr/local/openvpn/sbin/openvpn –genkey –secret ta.key # yum安装执行此句 openvpn –genkey –secret ta.key
# mkdir -p /etc/openvpn/server/certs #将本地的ta.key移动到openVPN证书目录
mv ta.key /etc/openvpn/server/certs/ta.key
后面还要将ta.key移动到用户目录下
6.5复制证书文件
复制服务器秘钥和证书
为方便 创建/etc/openvpn/server/certs目录专门存放server秘钥信息
# mkdir -p /etc/openvpn/server/certs
# cp /etc/openvpn/easy-rsa/3/pki/ca.crt /etc/openvpn/server/certs
# cp /etc/openvpn/easy-rsa/3/pki/issued/server.crt /etc/openvpn/server/certs
# cp /etc/openvpn/easy-rsa/3/pki/private/server.key /etc/openvpn/server/certs
复制client01秘钥和证书
为方便管理 创建client01目录专门存放client01用户秘钥信息,新建别的用户也创建一个新的目录
#mkdir -p /etc/openvpn/client/keys/client01
# cp /etc/openvpn/easy-rsa/3/pki/ca.crt /etc/openvpn/client/keys/client01
# cp /etc/openvpn/easy-rsa/3/pki/issued/client01.crt /etc/openvpn/client/keys/client01
# cp /etc/openvpn/easy-rsa/3/pki/private/client01.key /etc/openvpn/client/keys/client01
复制DH秘钥
# cp /etc/openvpn/easy-rsa/3/pki/dh.pem /etc/openvpn/server/certs
复制ta.key到用户目录
cp /etc/openvpn/server/certs/ta.key /etc/openvpn/client/keys/client01

 

 

7.还要配置下客户端配置

#进入客户端目录建立一个模板配置,后面新建用户也用这个配置,就是修改下秘钥名称就行了
#cd /etc/openvpn/client
# cat sample.ovpn
client
proto udp
dev tun
#这里可以填写动态域名
#remote XXX.XX.net 11194
remote 192.168.114.6 1194
resolv-retry infinite
nobind
ca ca.crt
#下面此处需要修改(以用户名命名)
cert client01.crt
#下面此处需要修改(以用户名命名)
key client01.key
tls-auth ta.key 1
remote-cert-tls server
;ns-cert-type server
persist-tun
persist-key
comp-lzo
verb 3
mute-replay-warnings
将客户端配置复制到/etc/openvpn/client/keys/client01目录下
# cp sample.ovpn /etc/openvpn/client/keys/client01/client01.ovpn

 

 

8.服务配置文件

拷贝OpenVPN配置文件
# 编译安装 cp /data/tools/openvpn-2.4.9/sample/sample-config-files/server.conf /etc/openvpn/ # yum安装 # cp /usr/share/doc/openvpn-2.4.9/sample/sample-config-files/server.conf /etc/openvpn/
修改服务端的配置文件
# cd /etc/openvpn/

# cat server.conf
port 1194 # 监听的端口号
proto udp #也可是tcp
dev tun
ca /etc/openvpn/server/certs/ca.crt # CA 根证书路径
cert /etc/openvpn/server/certs/server.crt # open VPN 服务器证书路径
key /etc/openvpn/server/certs/server.key # open VPN 服务器密钥路径,This file should be kept secret
dh /etc/openvpn/server/certs/dh.pem # Diffie-Hellman 算法密钥文件路径
tls-auth /etc/openvpn/server/certs/ta.key 0 # tls-auth key,参数 0 可以省略,如果不省略,那么客户端
server 10.1.0.0 255.255.255.0 # 该网段为 open VPN 虚拟网卡网段,不要和内网网段冲突即可。open VPN 默认为 10.1.0.0/24
push “dhcp-option DNS 8.8.8.8” # DNS 服务器配置,可以根据需要指定其他 ns
push “dhcp-option DNS 114.114.114.114”
push “redirect-gateway def1” # 客户端所有流量都通过 open VPN 转发,类似于代理开全局
compress lzo
duplicate-cn # 允许一个用户多个终端连接
keepalive 10 120
comp-lzo
persist-key
persist-tun
user openvpn # open VPN 进程启动用户,openvpn 用户在安装完 openvpn 后就自动生成了
group openvpn
log /var/log/openvpn/server.log # 指定 log 文件位置
log-append /var/log/openvpn/server.log
status /var/log/openvpn/status.log
verb 3
explicit-exit-notify 1

 

9.路由及防火墙配置

9.1开启内核路由转发功能
echo “net.ipv4.ip_forward = 1” >>/etc/sysctl.conf sysctl -p
9.2防火墙设置
如果有iptables可以开启iptables策略
# iptables -P FORWARD ACCEPT
# iptables -I INPUT -p tcp –dport 1194 -m comment –comment “openvpn” -j ACCEPT
# iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j MASQUERADE
centos7版本的默认应该都是firewalld防火墙,操作如下:
添加openvpn服务到防火墙
# firewall-cmd –permanent –add-service openvpn
添加端口1194/tcp和1194/udp(默认vpn端口为1194)
# firewall-cmd –add-port=1194/tcp –permanent
# firewall-cmd –add-port=1194/udp –permanent
添加vpn源地址
添加源地址-源地址为:你的OpenVPN为VPN客户端所分配的地址段 10.1.0.0(默认openvpn配置文件)
firewall-cmd –add-source=10.1.0.0 –permanent     #添加源IP地址,也就是openvpn要分给客户端的网段
firewall-cmd –query-source=10.1.0.0 –permanent  #将该源IP地址绑定在public和这块网卡上
开启伪装
开启伪装(NAT)-masquerade
# firewall-cmd –add-masquerade –permanent
# firewall-cmd –query-masquerade –permanent
重启firewalld
# systemctl restart firewalld.service
检查服务是否添加
# firewall-cmd –list-services
#检查端口是否添加
# firewall-cmd –list-ports
# firewall-cmd –list-all

10.服务启动及检查

启动openvpn服务
# cd /etc/openvpn/
# /usr/sbin/openvpn –daemon –config /etc/openvpn/server.conf
检查服务
netstat -lntup|grep 1194
我这用虚拟机搭建的,并未启动成功。查看报错:
# tail -6 /var/log/messages
Jul 8 14:19:08 localhost openvpn[28331]: Warning: Error redirecting stdout/stderr to –log file: /var/log/openvpn/server.log: No such file or directory (errno=2)
Jul 8 14:19:08 localhost openvpn[28331]: Warning: Error redirecting stdout/stderr to –log file: /var/log/openvpn/server.log: No such file or directory (errno=2)
Jul 8 14:19:08 localhost openvpn[28331]: Options error: –status fails with ‘/var/log/openvpn/status.log’: No such file or directory (errno=2)
Jul 8 14:19:08 localhost openvpn[28331]: Options error: Please correct these errors.
Jul 8 14:19:08 localhost openvpn[28331]: Use –help for more information.
很明显是没有创建/var/log/openvpn 这个日志目录,但是openvpn居然自己不创建日志目录?奇怪。手动创建下
# mkdir /var/log/openvpn/
再启动openvpn服务
# /usr/sbin/openvpn –daemon –config /etc/openvpn/server.conf
# netstat -lntup|grep 1194
udp 0 0 0.0.0.0:1194 0.0.0.0:* 28476/openvpn
# ps -ef | grep openvpn
openvpn 28476 1 0 14:25 ? 00:00:00 /usr/sbin/openvpn –daemon –config /etc/openvpn/server.conf
这下服务启动正常了
设置开机启动:(可选)
echo “/usr/local/openvpn/sbin/openvpn –daemon –config /etc/openvpn/server.conf > /dev/null 2>&1 &” >> /etc/rc.local

11.客户端配置

上面我们已经配置了,就是这个文件
/etc/openvpn/client/keys/client01/client01.ovpn
# cat client01.ovpn
client
proto udp
dev tun
#这里可以填写动态域名
#remote XXX.XX.net 11194
remote 192.168.114.6 1194
resolv-retry infinite
nobind
ca ca.crt
#下面此处需要修改(以用户名命名)
cert client01.crt
#下面此处需要修改(以用户名命名)
key client01.key
tls-auth ta.key 1
remote-cert-tls server
;ns-cert-type server
persist-tun
persist-key
comp-lzo
verb 3
mute-replay-warnings
将用户的证书打个包,windows客户端连接需要使用到这些证书
# pwd
/etc/openvpn/client/keys/client01
# ll
total 24
-rw——- 1 root root 1139 Jul 7 18:04 ca.crt
-rw——- 1 root root 4389 Jul 7 18:04 client01.crt
-rw——- 1 root root 1704 Jul 7 18:04 client01.key
-rw-r–r– 1 root root 405 Jul 8 14:31 client01.ovpn
-rw——- 1 root root 636 Jul 7 18:11 ta.key
这5个全部都打包
# cd /etc/openvpn/client/keys && zip -r client01.zip client01/
# ls
client01 client01.zip
# sz client01.zip
添加用户
以后我们如果想添加用户只需要到cd /usr/local/easy-rsa-old-master/easy-rsa/2.0目录下执行./build-key 用户名,在将keys目录下生成的用户名.crt和key导出,修改一下client.ovpn的用户key名称即可
这种手动添加有点麻烦,下面会有一个脚本专门用来添加和删除用户使用

12.windows/mac客户端连接vpn

Windows客户端下载
win10安装:
傻瓜式安装,一直下一步就行了
说下替换路径,将打包的那5个文件,解压后默认放置在C:\Program Files\OpenVPN\config 目录下
具体目录视乎你的安装地址

双击桌面图标启动openvpn

连接上了,但是出现了不能访问外网!!
先检查下开启了路由转发没
# sysctl -p
net.ipv4.ip_forward = 1
若正常:
猜测原因如下。。我的vpn是搭建在宿主机上的虚拟机。同时我有时用宿主机做的连接测试。导致网络环境异常。下面我试试在宿主机上的另外的windows虚拟机上测试下。

虚拟机获取ip正常。测试能否访问外网及访问vpn的内网地址

证实了我的猜想。。果然是因为这个原因。,虚拟机是通过宿主机上外网的,宿主机在连接虚拟机vpn,形成了一个环!

安装完后,也是添加config的五个文件,然后点开client.ovpn就可以自动链接
成功后有下面的流量图
ping 下就可以看到是否连上的vpn网段

至此openvpn搭建完毕。下面补充下添加和删除用户的脚本
添加用户
# cd /etc/openvpn/client/
# cat add_user.sh 
# ! /bin/bash

set -e

OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_VERSION=3
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
PKI_DIR=$EASY_RSA_DIR/$EASY_RSA_VERSION/pki

for user in "$@"
do
  if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
    rm -rf $OVPN_USER_KEYS_DIR/$user
    rm -rf  $PKI_DIR/reqs/$user.req
    sed -i '/'"$user"'/d' $PKI_DIR/index.txt
  fi
  cd $EASY_RSA_DIR/$EASY_RSA_VERSION
  # 生成客户端 ssl 证书文件
  ./easyrsa build-client-full $user nopass
  # 整理下生成的文件
  mkdir -p  $OVPN_USER_KEYS_DIR/$user
  cp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/   # CA 根证书
  cp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/   # 客户端证书
  cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/  # 客户端证书密钥
  cp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件
  sed -i 's/client01/'"$user"'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
  cp /etc/openvpn/server/certs/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key  # auth-tls 文件
  cd $OVPN_USER_KEYS_DIR
  zip -r $user.zip $user
done
exit 0

删除用户
# cat del_user.sh 
#!/bin/bash

set -e
OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_VERSION=3
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
for user in "$@"
do
  cd $EASY_RSA_DIR/$EASY_RSA_VERSION
  echo -e 'yes\n' | ./easyrsa revoke $user
  ./easyrsa gen-crl
  # 吊銷掉證書後清理客戶端相關文件
  if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
    rm -rf $OVPN_USER_KEYS_DIR/${user}*
  fi
  systemctl restart openvpn@server
done

 

最后为懒人提供懒人专用一键安装openvpn脚本,因个人能力有限,请慎用哦~

感谢您的阅读,若对您有帮助,转发分享。我们下一期再见~

为Kubernetes v1.5.2版本安装dashboard图形界面

一、前言 dashboard是一个图形化管理界面,由于我这边的Kubernetes v1.5.2比较老,按官网的安装方法没有效果,现在试试手动安装,使用下面2个yaml文件安装 ...

阅读全文

k8s简单部署

K8s中文手册地址:https://www.kuboard.cn/learning/k8s-basics/kubernetes-basics.html#kubernetes%E5%8A%9F%E8%83%BD   这边安装的Kubernetes v1.5.2 比较...

阅读全文

redis 主从复制及keepalived高可用

前言及思路: 这边的思路是以3作为主,4作为从,110作为VIP漂移地址,应用通过110的6379端口访问redis数据库。 正常运行下,当主节点3宕机后,VIP飘逸到4上,...

阅读全文

欢迎留言