远程办公免费方案——OPENVPN部署案例

发布于 2020-02-14  456 次阅读


新冠肺炎疫情之下,很多公司都开始在家远程办公。我公司用深信服SSL VPN,这个的确非常好用。对于小企,推荐一个免费方案。注意,这不是最佳的配置方案,只是自己在家无聊折腾一下而已的方案。
因easy-rsa 2的版与3的版本配置有点差异,请注意。
环境
公司服务器 10.0.0.2
公司内的一台服务器 10.0.0.151 使用端口 11112
系统 Centos7
OpenVPN 版本 2.4.8
easy-rsa 版本:3.0.x

开始部署
一 、升级 update

yum update -y

二、关闭 seliux

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

三、安装软件

yum install -y epel-release zip vim
    yum install -y openvpn easy-rsa iptables-services

四、配置证书
1.将easy-rsa 执行脚本 cp 到 openvpn 目录下

cp /usr/share/easy-rsa/ /etc/openvpn/ -r

2.编辑vars文件,生产证书的变量填写好。其实这个不写使用默认也是可以的。

cd /etc/openvpn/easy-rsa/3/
    vim vars #这应要自己新建
export KEY_COUNTRY="CN"
    export KEY_PROVINCE="GD"
    export KEY_CITY="GZ"
    export KEY_ORG="BILIBALA.CC"
    export KEY_EMAIL="TamaGeci@BILIBALA.CC"
    source ./vars #更新脚本变量

3.生成证书

 ./easyrsa init-pki   #初始化 pki 相关目录
    ./easyrsa build-ca nopass  #生成 CA 根证书, 输入 Common Name,名字随便起。

4.生成 OpenVPN 服务器证书和密钥
./easyrsa build-server-full 【服务器证书的名字】 nopass

./easyrsa build-server-full openvpnserver nopass

5 生成 Diffie-Hellman 算法需要的密钥文件

./easyrsa gen-dh

6.生成 ta key,这个 key 主要用于防止 DoS 和 TLS 攻击

openvpn --genkey --secret ta.key

7 将上面生成的相关证书文件整理到

/etc/openvpn/server/certs
mkdir -p /etc/openvpn/server/certs
    cp /etc/openvpn/easy-rsa/3/pki/{dh.pem,ca.crt} /etc/openvpn/server/certs/
    cp /etc/openvpn/easy-rsa/3/pki/issued/openvpnserver.crt /etc/openvpn/server/certs/
    cp /etc/openvpn/easy-rsa/3/pki/private/openvpnserver.key /etc/openvpn/server/certs/
    cp /etc/openvpn/easy-rsa/3/ta.key /etc/openvpn/server/certs/

8 创建 open VPN 日志目录

mkdir -p /var/log/openvpn/
    chown openvpn:openvpn /var/log/openvpn

五、配置 OpenVPN

 cd /etc/openvpn/
    vim server.conf

#以下是我自己的server.conf 详细配置请参考 https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage

 port 11112   # 监听的端口号
    proto udp   # 服务端用的协议,udp 能快点,所以我选择 udp
    dev tun   #win服务器用dev tap
    ca /etc/openvpn/server/certs/ca.crt  #   CA 根证书路径
    cert /etc/openvpn/server/certs/openvpnserver.crt  # open VPN 服务器证书路径
    key /etc/openvpn/server/certs/openvpnserver.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 可以省略,如果不省略,那么客户端
# 配置相应的参数该配成 1。如果省略,那么客户端不需要 tls-auth 配置
    server 10.8.0.0 255.255.255.0   # 该网段为 open VPN 虚拟网卡网段,不要和内网网段冲突即可。open VPN 默认为 10.8.0.0/24
    push "redirect-gateway def1 bypass-dhcp"
    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

六、防火墙配置
1.禁用 Centos7 默认的 firewalld

systemctl stop firewalld
    systemctl mask firewalld

2.启用iptables

systemctl enable iptables  #设置iptables 开启启动
    systemctl start iptables   #设置iptables启动
    iptables -F   # 清理所有防火墙规则

3.添加防火墙规则

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
    iptables-save > /etc/sysconfig/iptables

4.Linux 服务器启用地址转发

echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
    sysctl -p #配置立即生效

5.启动 open VPN

systemctl start openvpn@server  # 启动
    systemctl enable openvpn@server  # 开机自启动
    systemctl status openvpn@server  # 查看服务状态

七、添加用户
接下来在服务端创建一个 open VPN 用户:其实创建用户的过程就是生成客户端 SSL 证书的过程,然后将其他相关的证书文件、key、.ovpn 文件(客户端配置文件)打包到一起供客户端使用。由于创建一个用户的过程比较繁琐,所以在此将整个过程写成了一个脚本 add_ovpn_user.sh,脚本内容比较简单,一看就懂:

首先创建一个客户端配置模板文件 sample.ovpn,该文件在脚本中会用到,放到 /etc/openvpn/client/ 目录,内容如下:
sample.ovpn:

client
proto udp
dev tun
remote [open VPN服务端公网 ip,根据实际情况填写] [你的端口]
ca ca.crt
cert admin.crt
key admin.key
tls-auth ta.key 1
remote-cert-tls server
persist-tun
persist-key
comp-lzo
verb 3
mute-replay-warnings

下面为创建 open VPN 用户脚本:
./add_ovpn_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/admin/'"$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

例如添加用户 test :可以直接在目录

/etc/openvpn/client

执行

./add_ovpn_user.sh test

,会在

/etc/openvpn/client/keys

目录下生成以用户名命名的 zip 打包文件,将该压缩包下载到本地解压,客户端软件即可使用。

八、删除用户
提供脚本删除
del_ovpn_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
exit 0

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。