OpenVPN 服务端安装配置 由于不同环境及软件版本命令使用略有差异,特别是 easy-rsa 的使用在 2.0 和 3.0 的差别有点大,所以在此先说明下安装环境及相关软件版本:
系统平台: Centos7
OpenVPN 版本: 2.4.9
easy-rsa 版本: 3.0.7
尽管不同环境及软件版本命令使用略有所差异,但是整个搭建过程都是一致的 :
安装相关软件—>生成相关证书:CA 根证书、服务器证书—>配置 open VPN 服务端—>添加防火墙规则:snat—>启动 open VPN 服务端—>创建一个用户测试连接:创建客户端 CA 证书、生成 .ovpn 配置文件、打包相关文件供客户端使用。
安装 openvpn、easy-rsa、iptables-services
1 2 yum -y install epel-release yum -y install openvpn easy-rsa iptables-services
使用 easy-rsa 生成需要的证书及相关文件,在这个阶段会产生一些 key 和证书:
CA 根证书
OpenVPN 服务器 ssl 证书
Diffie-Hellman 算法用到的 key
将 easy-rsa 脚本复制到/etc/openvpn/
,该脚本主要用来方便地生成 CA 证书和各种 key
1 cp -r /usr/share/easy-rsa/ /etc/openvpn/
进入 easy-rsa 目录并编辑 vars 文件,添加一些生成证书时用到的变量
1 2 3 4 5 6 7 8 9 10 cd /etc/openvpn/easy-rsa/3.0.7/vi vars export KEY_COUNTRY="china" export KEY_PROVINCE="shanghai" export KEY_CITY="shanghai" export KEY_ORG="bwcx" export KEY_EMAIL="1624717019@qq.com" source ./vars
生成 CA 根证书
1 2 ./easyrsa init-pki ./easyrsa build-ca nopass
生成 OpenVPN 服务器证书和密钥 第一个参数 server 为证书名称,可以随便起,比如 ./easyrsa build-server-full openvpn nopass
1 ./easyrsa build-server-full server nopass
生成 Diffie-Hellman 算法需要的密钥文件
生成 tls-auth key,这个 key 主要用于防止 DoS 和 TLS 攻击,这一步其实是可选的,但为了安全还是生成一下,该文件在后面配置 open VPN 时会用到。
1 openvpn --genkey --secret ta.key
将上面生成的相关证书文件整理到/etc/openvpn/server/certs
(这一步完全是为了维护方便)
1 2 3 4 5 6 mkdir /etc/openvpn/server/certs && cd /etc/openvpn/server/certs/ cp /etc/openvpn/easy-rsa/3/pki/dh.pem ./ cp /etc/openvpn/easy-rsa/3/pki/ca.crt ./ cp /etc/openvpn/easy-rsa/3/pki/issued/server.crt ./ cp /etc/openvpn/easy-rsa/3/pki/private/server.key ./ cp /etc/openvpn/easy-rsa/3/ta.key ./
创建 open VPN 日志目录
1 2 mkdir -p /var/log /openvpn/ chown openvpn:openvpn /var/log /openvpn
配置 OpenVPN 创建一个新的配置文件cd /etc/openvpn/
vi server.conf
填入如下内容(很多配置项不需要特别了解,重要的配置这里注释出来了,其他相关配置项想了解的话见 这里 ): server.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 port 1194 # 监听的端口号 proto udp # 服务端用的协议,udp 能快点,所以我选择 udp 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 可以省略,如果不省略,那么客户端 # 配置相应的参数该配成 1。如果省略,那么客户端不需要 tls-auth 配置 server 10.8.0.0 255.255.255.0 # 该网段为 open VPN 虚拟网卡网段,不要和内网网段冲突即可。open VPN 默认为 10.8.0.0/24 push "dhcp-option DNS 8.8.8.8" # DNS 服务器配置,可以根据需要指定其他 ns push "dhcp-option DNS 8.8.4.4" 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
防火墙相关配置(使用 iptables 添加 snat 规则) 禁用 Centos7 默认的 firewalld,使用经典的 iptables 防火墙管理软件:
1 2 systemctl stop firewalld systemctl disable firewalld
禁用 SELinux
1 2 setenforce 0 sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
启用iptables
1 2 3 systemctl enable iptables systemctl start iptables iptables -F
添加防火墙规则,将 openvpn 的网络流量转发到公网:snat 规则
1 2 iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE iptables-save > /etc/sysconfig/iptables
Linux 服务器启用地址转发
1 2 echo net.ipv4.ip_forward = 1 >> /etc/sysctl.confsysctl -p
启动 open VPN
1 2 3 systemctl start openvpn@server systemctl enable openvpn@server systemctl status openvpn@server
添加一个 OpenVPN 用户 其实创建用户的过程就是生成客户端 SSL 证书的过程,然后将其他相关的证书文件、key、.ovpn 文件(客户端配置文件)打包到一起供客户端使用。由于创建一个用户的过程比较繁琐,所以在此将整个过程写成了一个脚本 ovpn_user.sh,脚本内容比较简单,一看就懂:
首先创建一个客户端配置模板文件 sample.ovpn,该文件在脚本中会用到,放到/etc/openvpn/client/
目录,内容如下: sample.ovpn:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 client proto udp dev tun remote [open VPN服务端公网 ip,根据实际情况填写] 1194 ca ca.crt cert server.crt key server.key tls-auth ta.key 1 remote-cert-tls server persist-tun persist-key comp-lzo verb 3 mute-replay-warnings
下面为创建 open VPN 用户脚本: ./ovpn_user.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # ! /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
执行上面脚本创建一个用户:sh ovpn_user.sh
,会在/etc/openvpn/client/keys
目录下生成以用户名命名的 zip 打包文件压缩包里面文件有如下,示例:
1 2 3 4 5 6 . ├── ca.crt ├── username.crt ├── username.key ├── username.ovpn └── ta.key
删除一个 OpenVPN 用户 上面我们知道了如何添加一个用户,那么如果公司员工离职了或者其他原因,想删除对应用户 OpenVPN 的使用权,该如何操作呢?其实很简单,OpenVPN 的客户端和服务端的认证主要通过 SSL 证书进行双向认证,所以只要吊销对应用户的 SSL 证书即可。
为了方便,也将上面步骤整理成了一个脚本,可以一键删除用户: del_ovpn_user.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # ! /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
使用 下载页面
OpenVPN Windows客户端。下载页面
Mac 下推荐使用 Tunnelblick 。Tunnelblick 是一个开源、免费的 Mac 版 open VPN 客户端软件。下载页面
参考链接:
https://i4t.com/4481.html
https://qhh.me/2019/06/16/Cenos7-下搭建-OpenVPN-过程记录