技术文档收录
ASCII
Tcpdump
Linux
WireGuard 一键安装脚本 | 秋水逸冰
SSH Config 那些你所知道和不知道的事 | Deepzz's Blog
Linux 让终端走代理的几种方法
ubuntu 20.04 server 版设置静态 IP 地址 - 链滴
Linux 挂载 Windows 共享磁盘的方法 - 技术学堂
将 SMB/CIFS 网络硬盘永久的挂载到 Ubuntu 上 - 简书
linux 获取当前脚本的绝对路径 | aimuke
[Linux] Linux 使用 / dev/urandom 生成随机数 - piaohua's blog
Linux 生成随机数的多种方法 | Just Do It
Linux 的 Centos7 版本下忘记 root 或者普通用户密码怎么办?
Git 强制拉取覆盖本地
SSH 安全加固指南 - FreeBuf 网络安全行业门户
Linux 系统安全强化指南 - FreeBuf 网络安全行业门户
Linux 入侵排查 - FreeBuf 网络安全行业门户
sshd_config 配置详解 - 简书
SSH 权限详解 - SegmentFault 思否
CentOS 安装 node.js 环境 - SegmentFault 思否
如何在 CentOS 7 上安装 Node.js 和 npm | myfreax
几款 ping tcping 工具总结
OpenVpn 搭建教程 | Jesse's home
openvpn 一键安装脚本 - 那片云
OpenVPN 解决 每小时断线一次 - 爱开源
OpenVPN 路由设置 – 凤曦的小窝
OpenVPN 设置非全局代理 - 镜子的记录簿
TinyProxy 使用帮助 - 简书
Ubuntu 下使用 TinyProxy 搭建代理 HTTP 服务器_Linux_运维开发网_运维开发技术经验分享
Linux 软件包管理工具 Snap 常用命令 - 简书
linux systemd 参数详解
Systemd 入门教程:命令篇 - 阮一峰的网络日志
记一次 Linux 木马清除过程
rtty:在任何地方通过 Web 访问您的终端
02 . Ansible 高级用法 (运维开发篇)
终于搞懂了服务器为啥产生大量的 TIME_WAIT!
巧妙的 Linux 命令,再来 6 个!
77% 的 Linux 运维都不懂的内核问题,这篇全告诉你了
运维工程师必备:请收好 Linux 网络命令集锦
一份阿里员工的 Java 问题排查工具单
肝了 15000 字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收
作业调度算法(FCFS,SJF,优先级调度,时间片轮转,多级反馈队列) | The Blog Of WaiterXiaoYY
看了这篇还不会 Linux 性能分析和优化,你来打我
2019 运维技能风向标
更安全的 rm 命令,保护重要数据
求你了,别再纠结线程池大小了!
重启大法好!线上常见问题排查手册
Docker
「Docker」 - 保存镜像 - 知乎
终于可以像使用 Docker 一样丝滑地使用 Containerd 了!
私有镜像仓库选型:Harbor VS Quay - 乐金明的博客 | Robin Blog
exec 与 entrypoint 使用脚本 | Mr.Cheng
Dockerfile 中的 CMD 与 ENTRYPOINT
使用 Docker 配置 MySQL 主从数据库 - 墨天轮
Alpine vs Distroless vs Busybox – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
再见,Docker!
Python
Pipenv:新一代Python项目环境与依赖管理工具 - 知乎
Python list 列表实现栈和队列
Python 各种排序 | Lesley's blog
Python 中使用 dateutil 模块解析时间 - SegmentFault 思否
一个小破网站,居然比 Python 官网还牛逼
Python 打包 exe 的王炸 - Nuitka
Window
批处理中分割字符串 | 网络进行时
Windows 批处理基础命令学习 - 简书
在Windows上设置WireGuard
Windows LTSC、LTSB、Server 安装 Windows Store 应用商店
中间件
Nginx 中的 Rewrite 的重定向配置与实践
RabbitMQ 的监控
RabbitMq 最全的性能调优笔记 - SegmentFault 思否
为什么不建议生产用 Redis 主从模式?
高性能消息中间件——NATS
详解:Nginx 反代实现 Kibana 登录认证功能
分布式系统关注点:仅需这一篇,吃透 “负载均衡” 妥妥的
仅需这一篇,妥妥的吃透” 负载均衡”
基于 nginx 实现上游服务器动态自动上下线——不需 reload
Nginx 学习书单整理
最常见的日志收集架构(ELK Stack)
分布式之 elk 日志架构的演进
CAT 3.0 开源发布,支持多语言客户端及多项性能提升
Kafka 如何做到 1 秒处理 1500 万条消息?
Grafana 与 Kibana
ELK 日志系统之通用应用程序日志接入方案
ELK 简易 Nginx 日志系统搭建: ElasticSearch+Kibana+Filebeat
记一次 Redis 连接池问题引发的 RST
把 Redis 当作队列来用,你好大的胆子……
Redis 最佳实践:业务层面和运维层面优化
Redis 为什么变慢了?常见延迟问题定位与分析
好饭不怕晚,扒一下 Redis 配置文件的底 Ku
rabbitmq 集群搭建以及万级并发下的性能调优
别再问我 Redis 内存满了该怎么办了
Nginx 状态监控及日志分析
数据库
SQLite全文检索
Mysql 查看用户连接数配置及每个 IP 的请求情况 - 墨天轮
防火墙-iptables
iptables 常用规则:屏蔽 IP 地址、禁用 ping、协议设置、NAT 与转发、负载平衡、自定义链
防火墙 iptables 企业防火墙之 iptables
Linux 防火墙 ufw 简介
在 Ubuntu 中用 UFW 配置防火墙
在 Ubuntu20.04 上怎样使用 UFW 配置防火墙 - 技术库存网
监控类
开箱即用的 Prometheus 告警规则集
prometheus☞搭建 | zyh
docker 部署 Prometheus 监控服务器及容器并发送告警 | chris'wang
PromQL 常用命令 | LRF 成长记
持续集成CI/CD
GitHub Actions 的应用场景 | 记录干杯
GithubActions · Mr.li's Blog
工具类
GitHub 中的开源网络广告杀手,十分钟快速提升网络性能
SSH-Auditor:一款 SHH 弱密码探测工具
别再找了,Github 热门开源富文本编辑器,最实用的都在这里了 - srcmini
我最喜欢的 CLI 工具
推荐几款 Redis 可视化工具
内网代理工具与检测方法研究
环境篇:数据同步工具 DataX
全能系统监控工具 dstat
常用 Web 安全扫描工具合集
给你一款利器!轻松生成 Nginx 配置文件
教程类
手把手教你打造高效的 Kubernetes 命令行终端
Keras 作者:给软件开发者的 33 条黄金法则
超详细的网络抓包神器 Tcpdump 使用指南
使用 fail2ban 和 FirewallD 黑名单保护你的系统
linux 下 mysql 数据库单向同步配置方法分享 (Mysql)
MySQL 快速删除大量数据(千万级别)的几种实践方案
GitHub 上的优质 Linux 开源项目,真滴牛逼!
WireGuard 教程:使用 Netmaker 来管理 WireGuard 的配置 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Tailscale 基础教程:Headscale 的部署方法和使用教程 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Nebula Graph 的 Ansible 实践
改进你的 Ansible 剧本的 4 行代码
Caddy 2 快速简单安装配置教程 – 高玩梁的博客
切换至 Caddy2 | 某不科学的博客
Caddy2 简明教程 - bleem
树莓派安装 OpenWrt 突破校园网限制 | Asttear's Blog
OpenVPN 路由设置 – 凤曦的小窝
个性化编译 LEDE 固件
盘点各种 Windows/Office 激活工具
[VirtualBox] 1、NAT 模式下端口映射
VirtualBox 虚拟机安装 openwrt 供本机使用
NUC 折腾笔记 - 安装 ESXi 7 - 苏洋博客
锐捷、赛尔认证 MentoHUST - Ubuntu 中文
How Do I Use A Client Certificate And Private Key From The IOS Keychain? | OpenVPN
比特记事簿: 笔记: 使用电信 TR069 内网架设 WireGuard 隧道异地组网
利用 GitHub API 获取最新 Releases 的版本号 | 这是只兔子
docsify - 生成文档网站简单使用教程 - SegmentFault 思否
【干货】Chrome 插件 (扩展) 开发全攻略 - 好记的博客
一看就会的 GitHub 骚操作,让你看上去像一位开源大佬
【计算机网络】了解内网、外网、宽带、带宽、流量、网速_墩墩分墩 - CSDN 博客
mac-ssh 配置 | Sail
如何科学管理你的密码
VirtualBox NAT 端口映射实现宿主机与虚拟机相互通信 | Shao Guoliang 的博客
CentOS7 配置网卡为静态 IP,如果你还学不会那真的没有办法了!
laisky-blog: 近期折腾 tailscale 的一些心得
使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书 · Ruby China
acme 申请 Let’s Encrypt 泛域名 SSL 证书
从 nginx 迁移到 caddy
使用 Caddy 替代 Nginx,全站升级 https,配置更加简单 - Diamond-Blog
http.proxy - Caddy 中文文档
动手撸个 Caddy(二)| Caddy 命令行参数最全教程 | 飞雪无情的总结
Caddy | 学习笔记 - ijayer
Caddy 代理 SpringBoot Fatjar 应用上传静态资源
使用 graylog3.0 收集 open××× 日志进行审计_年轻人,少吐槽,多搬砖的技术博客_51CTO 博客
提高国内访问 github 速度的 9 种方法! - SegmentFault 思否
VM16 安装 macOS 全网最详细
2022 目前三种有效加速国内 Github
How to install MariaDB on Alpine Linux | LibreByte
局域网内电脑 - ipad 文件共享的三种方法 | 岚
多机共享键鼠软件横向测评 - 尚弟的小笔记
本文档发布于https://mrdoc.fun
-
+
首页
OpenVpn 搭建教程 | Jesse's home
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [www.jesse.top](https://www.jesse.top/2018/06/23/Linux-Service/Openvpn%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA/) [](#OpenVpn-搭建教程 "OpenVpn 搭建教程")OpenVpn 搭建教程 -------------------------------------------- 参考下面文档 [centos7 搭建 openvpn](http://www.startupcto.com/server-tech/centos/setting-up-openvpn-server-on-centos) #### [](#环境 "环境:")环境: KVM 虚拟机 操作系统: centos7.4 openvpn 版本: 2.4 easyrsa 版本: 3.0 VPN 客户端内网地址段: 10.0.80.0/24 公司服务器内网地址网段: 10.0.0.0/24 note: RSA3.0 的版本和 2.0 的使用有差别, 注意区分 #### [](#步骤 "步骤:")步骤: **一. 获取新版本 yum 源** ``` [root@localhost ~]$wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm ``` **二. 安装 yum 源** ``` [root@localhost ~]$rpm -Uvh epel-release-7-11.noarch.rpm ``` **三. 安装 openvpn 和 easy-rsa** ``` [root@localhost ~]$ yum install easy-rsa openssh-server lzo openssl openssl-devel openvpn NetworkManager-openvpn openvpn-auth-ldap ``` **四. 拷贝 server.conf 配置文件到 / etc/openvpn** ``` [root@localhost ~]$cp /usr/share/doc/openvpn-2.4.6/sample/sample-config-files/server.conf /etc/openvpn ``` **五. 拷贝 easy-rsa 程序到 / etc/openvpn** ``` [root@localhost openvpn]$cp -R /usr/share/easy-rsa/ /etc/openvpn [root@localhost openvpn]$cd /etc/openvpn/easy-rsa/3 ``` **六. easyrsa 初始化私钥..easyrsa3.0 的配置步骤和老版本 2.0 比有点变化. 不需要定义 var 变量.** ``` [root@localhost 3.0.3]$./easyrsa init-pki ``` ``` [root@localhost 3.0.3]$./easyrsa build-ca nopass Generating a 2048 bit RSA private key ...+++ ......................+++ writing new private key to '/etc/openvpn/easy-rsa/3.0.3/pki/private/ca.key.4VoxQD3h0Y' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]:dwd CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /etc/openvpn/easy-rsa/3.0.3/pki/ca.crt ``` **七. 创建服务端秘钥. openvpn 表示 openvpn 服务器的服务器名称. nopass 选项说明不需要密码.** ``` [root@localhost 3.0.3]$./easyrsa build-server-full openvpn nopass Generating a 2048 bit RSA private key ...+++ ...........................................................................................+++ writing new private key to '/etc/openvpn/easy-rsa/3.0.3/pki/private/openvpn.key.XpsmN8YpAx' ----- Using configuration from ./openssl-1.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'openvpn' Certificate is to be certified until May 28 08:57:19 2028 GMT (3650 days) Write out database with 1 new entries Data Base Updated ``` **八. 生成 dh 密码算法** ``` [root@localhost 3.0.3]$./easyrsa gen-dh ``` **九. 拷贝生成的秘钥到 openvpn 的配置文件夹下** ``` [root@localhost 3.0.3]$cd pki [root@localhost pki]$ls ca.crt certs_by_serial dh.pem index.txt index.txt.attr index.txt.attr.old index.txt.old issued private reqs serial serial.old [root@localhost pki]$cp dh.pem ca.crt /etc/openvpn/ [root@localhost pki]$cp issued/openvpn.crt /etc/openvpn/server.crt [root@localhost pki]$cp private/openvpn.key /etc/openvpn/server.key ``` **十. 修改 server.conf 配置文件** 关于配置文件的说明可以参考:[https://my.oschina.net/liucao/blog/863112](https://my.oschina.net/liucao/blog/863112) ``` [root@openvpn ~]$sed -e 's/^[;#].*//g' /etc/openvpn/server.conf | sed '/^$/d' port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key # This file should be kept secret dh dh.pem server 10.0.80.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 10.0.0.0 255.255.0.0" push "redirect-gateway" push "dhcp-option DNS 114.114.114.114" push "dhcp-option DNS 210.22.70.3" duplicate-cn keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log log-append openvpn.log verb 3 explicit-exit-notify 1 ``` 特别注意 push “redirect-gateway” 选项和 duplicate-cn 选项.. 下面来重点分析一下 1.**redirect-gateway** 参数表示将推送一条指向本机的默认网关到客户端. 这就意味着只要客户端拨了 VPN, 不管他访问什么, 只要是访问互联网就走 VPN 通道. 先到 VPN 服务器, 由你 VPN 服务器转发请求再返回给你客户端. 这样一来访问互联网速度会受很大影响. 注释该参数, 表示不推送默认网关给客户端. 这样客户端只访问公司内网服务器才走 VPN 通道, 而访问互联网仍然是走本地网络. 在我这个例子中. push “route 10.0.0.0 255.255.0.0” 表示推送给客户端的公司内网服务器网段. 当客户端访问 10.0.0.0/16 网络时走 VPN 通道 2.**duplicate-cn:** 这个选项表示可以多人同时共用一个客户端账号. 如果注释此选项, 则同一个账号, 同时只能一个人使用. 如果有第二个人用同样的账户登录, 会将之前的使用该账号登录的人挤下去. 这一点后续还会讲到 **十一. 关闭 centos7 自带的 firewalld. 然后保存 iptables 设置, 开启自起** ``` [root@openvpn ~]$systemctl stop firewalld.service [root@openvpn ~]$systemctl disable firewalld.service [root@openvpn ~]$yum install iptables-services [root@openvpn ~]$systemctl enable iptables.service [root@openvpn ~]$systemctl start iptables [root@openvpn ~]$service iptables save ``` **十二. 修改防火墙. 将下列保存成脚本文件, 然后执行** ``` #!/bin/bash # REMEMBER: Run this as a single bash script or you'll lock yourself out of your machine. # Flushing all rules iptables -F FORWARD iptables -F INPUT iptables -F OUTPUT iptables -X # Setting default filter policy iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # Allow unlimited traffic on loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Accept outbound on the primary interface iptables -I OUTPUT -o eth0 -d 0.0.0.0/0 -j ACCEPT # Accept inbound TCP packets iptables -I INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # Allow incoming SSH iptables -A INPUT -p tcp --dport 22 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT # Allow incoming OpenVPN iptables -A INPUT -p udp --dport 1194 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT # Enable NAT for the VPN iptables -t nat -A POSTROUTING -s 10.0.80.0/24 -o eth0 -j MASQUERADE # Allow TUN interface connections to OpenVPN server iptables -A INPUT -i tun0 -j ACCEPT # Allow TUN interface connections to be forwarded through other interfaces iptables -A FORWARD -i tun0 -j ACCEPT iptables -A OUTPUT -o tun0 -j ACCEPT iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT # Allow outbound access to all networks on the Internet from the VPN iptables -A FORWARD -i tun0 -s 10.0.80.0/24 -d 0.0.0.0/0 -j ACCEPT # Block client-to-client routing on the VPN iptables -A FORWARD -i tun0 -s 10.0.80.0/24 -d 10.0.80.0/24 -j DROP ``` 上面的 Iptables 规则过于严格. 如果你的服务器 Iptables 不需要做任何限制. 那么只需要添加一条 iptables 的 nat 规则就可以了: ``` iptables -t nat -A POSTROUTING -s 10.0.80.0/24 -o eth0 -j MASQUERADE ``` **十三. 开启 OpenVPN 服务器的网卡转发功能 *** ``` echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf sysctl -p ``` **十四. 启动 openvpn** ``` # sudo systemctl -f enable openvpn@server.service # sudo systemctl start openvpn@server.service ``` note: 这个 openvpn@server 格式的 server 表示 Openvpn 使用 erver.conf 配置文件启动 **十五. 创建一个客户端秘钥. dwdtech 是客户端名称, nopass 选项表示不需要密码** ``` [root@localhost 3.0.3]$./easyrsa build-client-full dwdtech nopass Generating a 2048 bit RSA private key ......................................+++ .........................................................................................................................................+++ writing new private key to '/etc/openvpn/easy-rsa/3.0.3/pki/private/dwdtech.key.klfqyxWXig' ----- Using configuration from ./openssl-1.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'dwdtech' Certificate is to be certified until May 28 09:03:05 2028 GMT (3650 days) Write out database with 1 new entries Data Base Updated ``` **十六. 配置客户端的配置文件** 1. 创建客户端配置文件夹. 拷贝客户端秘钥 ``` [root@openvpn 3]$ mkdir ~/vpn-client [root@openvpn 3]$ cd /etc/openvpn/easy-rsa/3 [root@openvpn 3]$cp pki/ca.crt ~/vpn-client/ [root@openvpn 3]$cp pki/issued/dwdtech.crt ~/vpn-client/client.crt [root@openvpn 3]$cp pki/private/dwdtech.key ~/vpn-client/client.key ``` 2. 创建客户端配置文件 ``` [root@openvpn 3]$cd ~/vpn-client/ [root@openvpn vpn-client]$vim client.ovpn client dev tun proto udp remote xx.xx.xx.xx 1194 #客户端远程拨号公司出口公网IP地址 resolv-retry infinite redirect-gateway nobind persist-key persist-tun ca ca.crt cert client.crt key client.key comp-lzo verb 3 sndbuf 393216 #关于sndbuf和rcvbuf参数,请参考另一篇笔记 rcvbuf 393216 [root@openvpn vpn-client]$ls ca.crt client.crt client.key client.ovpn ``` 3. 打包配置文件. 下载到本地, 并且拷贝到客户端 ``` [root@openvpn ~]$tar -cvf vpnclient.tar vpn-client vpn-client/ vpn-client/ca.crt vpn-client/client.crt vpn-client/client.key vpn-client/client.ovpn vpn-client/vpnclient.tar ``` 十七. 修改出口设备的 NAT 转发 在出口设备上增加一条 NAT 转发规则. 注意是 UDP 协议转发. 转发 1194 端口到 Openvpn 服务器的 1194 端口 至此配置完成.. 接下来使用 openvpn 客户端拨号 推荐 VPN 客户端软件 Windows: OpenVPN && Mac:Tunnelblick 如果是 windows, 安装完以后把服务器上配置的客户端秘钥, 配置文件拷贝到 openvpn 安装路径的 config 路径下 如果是 MAC, 安装完成后把 ovpn 配置文件拖拽到 Tunnelblick 软件界面即可 [](#第二部分-多账号使用Openvpn "第二部分: 多账号使用Openvpn")第二部分: 多账号使用 Openvpn -------------------------------------------------------------- 一个比较懒散的做法是像刚才的教程一样, 所有人都使用同一个秘钥账号连接 Openvpn. 但是公司里如果所有人都使用一个秘钥的话, 人员离职后, 仍然可以使用该秘钥通过 Openvpn 访问公司内网, 非常不安全. 而此时重新创建秘钥则又” 前一发动全身”, 意味着每个人都要更新 VPN 秘钥. 非常复杂. 此时就需要对于每个用户创建并注销单独的秘钥. 接下来的教程演示如何实现这一功能 #### [](#一-创建多个客户端账户 "一.创建多个客户端账户")一. 创建多个客户端账户 创建客户端账户步骤和刚才教程一模一样 **1. 修改 server.conf 配置文件, 注释 duplicate-cn 参数** ``` [root@openvpn openvpn]$vim server.conf # Uncomment this directive if multiple clients # might connect with the same certificate/key # files or common names. This is recommended # only for testing purposes. For production use, # each client should have its own certificate/key # pair. # # IF YOU HAVE NOT GENERATED INDIVIDUAL # CERTIFICATE/KEY PAIRS FOR EACH CLIENT, # EACH HAVING ITS OWN UNIQUE "COMMON NAME", # UNCOMMENT THIS LINE OUT. ;duplicate-cn ``` Note: 注释这个参数就表示每个客户端秘钥账户就只能同时一个人使用, 如果多个人同时同一个账户会挤掉前面已经连接上的 vpn 的用户: 下面是故障出现时, 服务器 Openvpn 日志的报错: ``` Sat Jun 16 01:08:56 2018 10.0.99.1:29167 [dwdtech] Peer Connection Initiated with Sat Jun 16 01:08:56 2018 MULTI: new connection by client 'dwdtech' will cause previous active sessions by this client to be dropped. Remember to use the --duplicate-cn option if you want multiple clients using the same certificate or username to concurrently connect. ``` **2. 创建另外一个客户端秘钥** ``` [root@openvpn 3]$./easyrsa build-client-full test nopass Generating a 2048 bit RSA private key ..........+++ ....................+++ writing new private key to '/etc/openvpn/easy-rsa/3/pki/private/test.key.VGKwuGH2p6' ----- Using configuration from ./openssl-1.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'test' Certificate is to be certified until Jun 12 06:33:21 2028 GMT (3650 days) Write out database with 1 new entries Data Base Updated ``` 此时就创建了多个客户端秘钥 #### [](#二-注销客户端账户 "二.注销客户端账户")二. 注销客户端账户 这里以刚才的 test 账户为例 **1. 删除该客户端秘钥** ``` [root@openvpn 3]$./easyrsa revoke test Please confirm you wish to revoke the certificate with the following subject: subject= commonName = test Type the word 'yes' to continue, or any other input to abort. Continue with revocation: yes Using configuration from ./openssl-1.0.cnf Revoking Certificate D6A90A078F182F97CBB3C37172DFFFC7. Data Base Updated IMPORTANT!!! Revocation was successful. You must run gen-crl and upload a CRL to your infrastructure in order to prevent the revoked cert from being accepted. ``` **2. 按照提示, 生成 crl 文件** ``` [root@openvpn 3]$./easyrsa gen-crl Using configuration from ./openssl-1.0.cnf An updated CRL has been created. CRL file: /etc/openvpn/easy-rsa/3/pki/crl.pem ``` **3. 复制 crl.pem 文件到 OpenVpn 根目录下** ``` [root@openvpn 3]$cp pki/crl.pem /etc/openvpn/ ``` **4. 添加配置到 server.conf 配置文件, 开启 crl 验证功能, 并且制定 crl 文件路径. crl 文件可以用绝对路径也可以用相对路径** 添加下面这一行到 server.conf 配置文件 ``` [root@openvpn openvpn]$tail -1 server.conf crl-verify /etc/openvpn/crl.pem ``` 使用下面命令可以检查 crl.pem 文件查看被注销的账户信息 ``` [root@openvpn openvpn]$openssl crl -in /etc/openvpn/crl.pem -text -noout Certificate Revocation List (CRL): Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: /CN=dwd Last Update: Jun 15 06:53:38 2018 GMT Next Update: Dec 12 06:53:38 2018 GMT CRL extensions: X509v3 Authority Key Identifier: keyid:87:B0:CC:51:14:B2:0D:C3:75:75:D1:9C:AB:0D:2E:3C:D8:F7:05:8D DirName:/CN=dwd serial:8F:2C:45:27:E1:42:46:D3 Revoked Certificates: Serial Number: D6A90A078F182F97CBB3C37172DFFFC7 Revocation Date: Jun 15 06:53:07 2018 GMT Signature Algorithm: sha256WithRSAEncryption be:59:e5:14:06:a9:5c:cd:41:60:1c:e2:81:db:a0:47:2c:75: 9d:0f:75:14:6b:fc:ff:f2:3f:51:8b:f6:c5:d4:cf:1b:13:41: 24:2f:94:fb:29:e9:a9:2d:fd:5f:b3:c0:af:42:95:65:a4:00: 44:55:bd:b4:61:26:64:4b:d0:51:49:02:94:cd:d0:71:98:99: 5d:2a:a1:b4:a1:01:2e:9c:2e:dc:f9:44:5f:23:c9:6c:56:47: df:35:e2:9f:05:3d:98:6b:80:61:ce:36:be:01:df:18:22:36: c6:fe:14:bf:aa:55:de:2b:ca:9c:17:03:49:60:47:0f:7d:e2: f4:c2:75:41:9e:54:88:49:ce:29:c6:4d:79:db:68:ed:46:64: 3f:98:19:c7:72:73:c1:1a:69:03:9e:a2:57:43:04:61:fa:94: 43:18:24:fc:5b:3b:62:e6:4e:5e:be:28:b5:dd:ea:16:cc:47: 2e:62:86:15:cb:ff:4f:1a:a1:e6:40:9f:7e:11:00:3b:b4:41: 1b:1a:13:cd:24:ce:83:34:88:2f:c8:05:b3:0f:af:f7:6a:c8: be:71:08:92:e5:26:64:ae:7b:92:52:b3:3c:02:3d:cd:1a:d7: bd:f2:7a:93:02:73:5f:7e:3a:94:74:ab:ff:49:1e:d1:b0:f9: c3:88:b5:6c [root@openvpn openvpn]$ ``` 在 pki 目录下. 有一个 index.txt 文件. 此文件列举了活跃的和已经注销的客户端证书信息: ``` cd /etc/openvpn/easy-rsa/3/pki [root@openvpn pki]$cat index.txt V 280528085719Z 9BF6331DD9E82F354F8E5867591E15BC unknown /CN=openvpn V 280528090305Z AC3AB23DB02135A37CFB20B158813BF1 unknown /CN=dwdtech R 280612063321Z 180615065307Z D6A90A078F182F97CBB3C37172DFFFC7 unknown /CN=test V 280612070037Z E39E66223879C19CB521589A8F82246B unknown /CN=yongge R 280629065514Z 180703015608Z 871C32C7042E841B625C34E57D526039 unknown /CN=huangyong ``` 第一个字母 R 表示已经注销的账户. 此时, test 客户端虽然有秘钥, 但是无法拨入 Openvpn. 服务端的 openvpn.log 日志记录了这一行为: ``` Tue Jul 3 02:23:47 2018 10.0.99.1:23273 VERIFY ERROR: depth=0, error=certificate revoked: CN=test Tue Jul 3 02:23:47 2018 10.0.99.1:23273 OpenSSL: error:14089086:SSL routines:ssl3_get_client_certificate:certificate verify failed Tue Jul 3 02:23:47 2018 10.0.99.1:23273 TLS_ERROR: BIO read tls_read_plaintext error Tue Jul 3 02:23:47 2018 10.0.99.1:23273 TLS Error: TLS object -> incoming plaintext read error Tue Jul 3 02:23:47 2018 10.0.99.1:23273 TLS Error: TLS handshake failed Tue Jul 3 02:23:47 2018 10.0.99.1:23273 SIGUSR1[soft,tls-error] received, client-instance restarting ``` 后续删除其他客户端账户, 需要重复上面 1-3 步骤. note: 我在这里踩过很深的坑. 如果需要注销多个账户时, 会生成新的 crl.pem 文件. 此时直接把新的 crl.pem 文件覆盖老的就可以, 其他不用管. 请看我的 stackoverflow 的提问:[how to revoke multiple OpenVPN clients Certificate](https://stackoverflow.com/questions/51146190/how-to-revoke-multiple-openvpn-clients-certificate) ### [](#第三部分-Openvpn加速 "第三部分.Openvpn加速")第三部分. Openvpn 加速 这篇文档详细解释了为什么 Openvpn 拨号之后宽带速度很慢的原因 [https://www.lowendtalk.com/discussion/40099/why-openvpn-is-so-slow-cool-story](https://www.lowendtalk.com/discussion/40099/why-openvpn-is-so-slow-cool-story) #### [](#配置步骤 "配置步骤:")配置步骤: **1. 修改内核缓冲区参数** ``` [root@openvpn ~]$vim /etc/sysctl.conf net.core.rmem_default = 393216 net.core.wmem_default = 393216 [root@openvpn ~]$sysctl -p net.ipv4.ip_forward = 1 net.core.rmem_default = 393216 net.core.wmem_default = 393216 ``` **2. 修改 Openvpn 的配置文件, 添加下面 2 个参数** ``` [root@openvpn ~]$tail -2 /etc/openvpn/server.conf sndbuf 393216 rcvbuf 393216 ``` 如果客户端文件已经下发给用户, 无法手动修改, 则继续在 server.conf 添加下面 2 个参数, 将配置推送给客户端 push “sndbuf 393216” push “rcvbuf 393216” **3. 重启 openvpn** ``` [root@openvpn openvpn]$systemctl restart openvpn@server.service ``` **4. 重新编辑客户端的 ovpn 配置文件, 添加下面 2 个参数** ``` [root@openvpn ~]$tail -2 vpn-client/client.ovpn sndbuf 393216 rcvbuf 393216 ``` **5. 将客户端配置文件重新下载到本地, 拷贝到 openvpn 安装目录的 conf 目录下. 重新拨号** ### [](#第四部分-批量创建openvpn客户端账号 "第四部分 批量创建openvpn客户端账号")第四部分 批量创建 openvpn 客户端账号 每次手动创建客户端账号的工作太繁琐. 于是写了一个脚本来进行批量化创建工作 **脚本功能如下:** 1. 使用 - f 参数从文件中批量读取账户进行创建, 也可以使用 - u 参数指定要创建的账户. 2. 判断账户是否已经存在 3. 创建完客户端证书和秘钥文件后, 会自动创建客户端配置文件. 4. 打包客户端所需要的文件到 / root 目录下. 如果需要加入注销客户端账号的功能可以自行修改脚本, 或者联系本人 ``` #!/bin/bash #description:批量创建Openvpn的用户账户.可以指定创建单个vpn账号,也可以创建一个账号文件.批量从文件中读取账号来创建 #author:huangyong #date:2018-07-02 #创建账户函数 function create_user () { name=$1 vpnDir="/etc/openvpn/easy-rsa/3" homeDir="/root/${name}" cert="${name}.crt" key="${name}.key" # 判断账户是否已经创建过了,如果是,则直接返回到主程序 [ -f $vpnDir/pki/issued/${cert} ] && echo "${name} is already existed " && return 0 #进入到easyrsa目录下创建不带密码的VPN账户.这里必须要在想对目录内执行easyrsa命令 cd $vpnDir ./easyrsa build-client-full ${name} nopass > /dev/null 2>&1 #如果创建账户失败,则退出整个程序 [ $? -ne 0 ] && exit 1 #将创建的账户证书,秘钥文件拷贝到该用户的文件夹内 [ -d $homeDir ] || mkdir $homeDir cp $vpnDir/pki/ca.crt $homeDir cp $vpnDir/pki/issued/${cert} $homeDir cp $vpnDir/pki/private/${key} $homeDir # 创建客户端账户配置文件 cat > $homeDir/${name}.ovpn << EOF client dev tun proto udp remote xx.xx.xx.xx 1194 #客户端远程拨号公司出口公网IP地址 resolv-retry infinite redirect-gateway nobind persist-key persist-tun ca ca.crt cert $cert key $key comp-lzo verb 3 EOF #打包账户文件 tar -C /root -cf ${homeDir}.tar ${homeDir} > /dev/null 2>&1 #删除账户文件夹 rm -rf ${homeDir} } # 检测用户是否输入了正确的选项 if ! ` echo $1 | grep '-' > /etc/null 2>&1 `;then echo "Usage $0 {-f filename contains a group of account name | -u specify an account }" fi # 读取用户输入的选项和参数 while getopts "f:u:" SWITCH;do case $SWITCH in f) #如果用户指定了一个账户文件,则判断用户输入的账号文件是否存在 [ ! -f $OPTARG ] && echo " the file doesn't exist" && exit 1 #读取文件,循环获取文件内的账号 cat $OPTARG | while read line do create_user $line #调用函数 [ $? -ne 0 ] && echo " something wrong" && exit 1 || echo "create ${line} successfully" done ;; u) #将用户输入的用户名代入到函数 create_user $OPTARG [ $? -ne 0 ] && echo " something wrong" && exit 1 || echo " create $OPTARG successfully" ;; *) echo "Usage $0 {-f filename contains a group of account name | -u specify an account }" ;; esac done ``` 例如从文件中批量创建账号: ``` [root@openvpn ~]$./createAccount.bak.sh -f name.txt create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully create VPN account successfully [root@openvpn ~]$ ```
Jonny
2022年2月23日 18:12
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
【腾讯云】爆款2核2G4M云服务器一年45元,企业首购最高获赠300元京东卡
【腾讯云】爆款2核2G4M云服务器一年45元,企业首购最高获赠300元京东卡
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期