章工运维 章工运维
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

章工运维

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • 随笔

  • 面试

  • 工具

    • vpn

      • 企业级openvpn搭建
        • 基于账号密码的搭建
          • 安装依赖
          • 安装目录
          • 安装easy-rsa并生成相关证书
          • 生成相关证书
          • 准备openssl相关文件
          • 编辑证书基本信息
          • 生成服务器端秘钥
          • 生成客户端证书
          • 创建迪菲·赫尔曼密钥
          • 查看生成的所有证书
          • 安装openvpn
          • 配置openvpn
          • 生成ta.key文件(防DDos攻击、udp淹没等恶意攻击)
          • 将签名生成的CA证书秘钥和服务端证书秘钥拷贝到证书目录中
          • 拷贝配置文件模板
          • 拷贝配置文件模板
          • 编辑openvpn配置文件
          • centos7添加防火墙方式访问内部网络
          • iptables配置防火墙方式访问内部网络
          • 上传密码验证脚本
          • 配置systemd启动脚本
          • 开启内核路由转发功能
          • 安装openvpn客户端
          • 客户端配置
    • mac电脑常用软件
    • 使用这7个谷歌搜索技巧来找到你想要的,老司机必备技巧
    • vuepress配置artalk
    • windows目录实时同步工具
    • vim快捷使用方式
    • 常用操作
    • jetbrains最新版2022.2.2全系列激活教程
    • chagpt工具使用和总结
    • acme.sh使用 cloudflare dns 生成证书
    • cursor使用方式介绍
    • AI 编程工具简介
    • MarkText工具优化设置
    • RAR zip压缩包密码破解
  • 美食

  • 生活
  • 工具
  • vpn
章工运维
2022-12-15
目录

企业级openvpn搭建

# 企业级openvpn搭建

OpenVPN是一个用于创建虚拟专用网络加密通道的软件包,最早由James Yonan编写。OpenVPN允许创建的VPN使用公开密钥、电子证书、或者用户名/密码来进行身份验证。 它大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。 目前OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Microsoft Windows以及Android、iOS、MacOS(2020年官方推出Mac客户端)上运行,并包含了许多安全性的功能。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软 OpenVPN2.0后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍有一份服务器证书需要被用作加密。 OpenVPN所有的通信都基于一个单一的IP端口, 默认且推荐使用UDP协议通讯,同时TCP也被支持。OpenVPN连接能通过大多数的代理服务器,并且能够在NAT的环境中很好地工作。服务端具有向客 户端“推送”某些网络配置信息的功能,这些信息包括:IP地址、路由设置等。 OpenVPN提供了两种虚拟网络接口:通用Tun/Tap驱动,通过它们, 可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网络数据。传送的数据可通过LZO算法压缩。在选择协议时候,需要注意2个加密隧道之间的网络状况,如有高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致要隧道上层的协议进行重传,效率非常低下。 VPN的主要作用是在局域网外部时也可以访问局域网的资源,比如公司内网有许多资源只能公司内网访问,而我们外派出差员工还想访问公司内网资源[如:GitLab/测试库/其他测试环境接口]就需要通过连接公司公网出口暴露VPN来实现。

由于众所周知的原因,几种简单的VPN协议比如L2TP/IPsec和PPTP协议在大陆地区已经被干扰的基本无法正常使用了。因此也就SSL VPN还可以使用。SSL VPN有非常多种,但很多都是商业软件,不开源也不适合个人搭建。而OpenVPN是一款开源的SSL VPN,可以很容易找到搭建的方法,非常符合我们的要求。

# 基于账号密码的搭建

# 安装依赖

yum install -y openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig gcc gcc-c++
1

# 安装目录

mkdir /opt/apps
1

# 安装easy-rsa并生成相关证书

easy-rsa 下载地址:https://codeload.github.com/OpenVPN/easy-rsa-old/zip/master

unzip easy-rsa-old-master.zip
[root@host-172-16-30-22 easy-rsa-old-master]# ls
configure.ac  COPYING  COPYRIGHT.GPL  distro  doc  easy-rsa  Makefile.am
1
2
3

# 生成相关证书

[root@host-172-16-30-22 2.0]# cd /opt/apps/easy-rsa-old-master/easy-rsa/2.0
1

# 准备openssl相关文件

ln -s openssl-1.0.0.cnf openssl.cnf
1

# 编辑证书基本信息

[root@host-172-16-30-22 2.0]# pwd
/opt/apps/easy-rsa-old-master/easy-rsa/2.0
vim vars
export KEY_COUNTRY="CN"
export KEY_PROVINCE="sz"
export KEY_CITY="shenzhen"
export KEY_ORG="1quant"
export KEY_EMAIL="xxx@1quant.com"
. vars #生效环境变量
1
2
3
4
5
6
7
8
9

# 生成服务器端秘钥

./build-key-server server
1

# 生成客户端证书

./build-key client
1

# 创建迪菲·赫尔曼密钥

./build-dh
1

# 查看生成的所有证书

[root@host-172-16-30-22 keys]# ls
01.pem  ca.crt  client.crt  client.key  index.txt       index.txt.attr.old  serial      server.crt  server.key
02.pem  ca.key  client.csr  dh2048.pem  index.txt.attr  index.txt.old       serial.old  server.csr  ta.key
1
2
3

# 安装openvpn

下载地址:https://openvpn.net/community-downloads/(可能需要翻墙)

 tar -xf openvpn-2.5.8.tar.gz
 cd /opt/apps/openvpn-2.5.8
 ./configure --prefix=/opt/apps/openvpn && make && make install
 [root@host-172-16-30-22 apps]# ll
total 1904
drwxr-xr-x  5 root  root     4096 Jan 23  2018 easy-rsa-old-master
-rw-------  1 root  root    59661 Dec 27 12:30 easy-rsa-old-master-1.zip
drwxr-xr-x  7 root  root     4096 Dec 27 14:37 openvpn
drwxrwxr-x 12 admin admin    4096 Dec 27 14:02 openvpn-2.5.8
-rw-------  1 root  root  1875551 Dec 27 11:37 openvpn-2.5.8.tar.gz
1
2
3
4
5
6
7
8
9
10

# 配置openvpn

配置 OpenVPN 服务端
创建配置文件目录和证书目录:
mkdir -p /etc/openvpn        # openvpn 配置文件路径
mkdir -p /etc/openvpn/pki    # openvpn 证书存放位置
1
2
3
4

# 生成ta.key文件(防DDos攻击、udp淹没等恶意攻击)

cd /opt/apps/easy-rsa-old-master/easy-rsa/2.0/keys
/opt/apps/openvpn/sbin/openvpn --genkey --secret ta.key
1
2

# 将签名生成的CA证书秘钥和服务端证书秘钥拷贝到证书目录中

cp {ca.crt,ca.key,dh2048.pem,server.crt,server.key,ta.key} /etc/openvpn/pki/
[root@host-172-16-30-22 pki]# ll
total 32
-rw-r--r-- 1 root root 2419 Dec 27 14:15 ca.crt
-rw------- 1 root root 3268 Dec 27 14:15 ca.key
-rw-r--r-- 1 root root  424 Dec 27 14:15 dh2048.pem
-rw-r--r-- 1 root root 8203 Dec 27 14:15 server.crt
-rw------- 1 root root 3272 Dec 27 14:15 server.key
-rw------- 1 root root  636 Dec 27 14:15 ta.key
1
2
3
4
5
6
7
8
9

# 拷贝配置文件模板

cp openvpn-2.5.8/sample/sample-config-files/server.conf /etc/openvpn/
1

# 拷贝配置文件模板

cp openvpn-2.5.8/sample/sample-config-files/server.conf /etc/openvpn

1
2

# 编辑openvpn配置文件

local 0.0.0.0
port 8888
proto tcp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/server.crt
key /etc/openvpn/pki/server.key  # This file should be kept secret
dh /etc/openvpn/pki/dh2048.pem
server 10.8.0.0 255.255.255.0
push "dhcp-option DNS 114.114.114.114"
push "dhcp-option DNS 8.8.8.8"
push "route 172.16.30.0 255.255.255.0"
push "route 172.16.60.253 255.255.255.0"
ifconfig-pool-persist ipp.txt
client-to-client
keepalive 10 120
tls-auth /etc/openvpn/pki/ta.key 0 # This file is secret
cipher AES-256-CBC
comp-lzo
user nobody
group nobody
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
script-security 3
verify-client-cert none
username-as-common-name
persist-key
persist-tun
status /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
verb 3
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

# centos7添加防火墙方式访问内部网络

#在服务端开启防火墙,放行openvpn服务,并且开启masquerade。
#优点:只需在OpenVPN服务端配置防火墙规则,内部网络主机无需配置
systemctl start firewalld
firewall-cmd --add-masquerade --permanent
firewall-cmd --add-service=openvpn --permanent
firewall-cmd --reload
1
2
3
4
5
6

# iptables配置防火墙方式访问内部网络

iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
也可以这样做:添加 iptables 转发规则,对所有源地址(openvpn为客户端分配的地址)为 10.10.10.0/24 的数据包转发后进行源地址转换,伪装成 openvpn 服务器内网地址 x.x.x.x, 这样 VPN 客户端就可以访问服务器内网的其他机器了。

iptables -A POSTROUTING -s 10.10.10.0/24 -j SNAT --to-source 192.168.1.160
iptables -I INPUT -p tcp -m tcp --dport 8888 -j ACCEPT
1
2
3
4
5

# 上传密码验证脚本

[root@host-172-16-30-22 openvpn]# ll
total 28
-rwxr-xr-x 1 root root   901 Dec 27 14:36 checkpsw.sh
-rw------- 1 root root     0 Dec 27 14:40 ipp.txt
drwxr-xr-x 2 root root  4096 Dec 27 14:15 pki
-rw-r--r-- 1 root root    22 Dec 27 14:37 psw-file
-rw-r--r-- 1 root root   807 Dec 28 11:42 server.conf
cat checkpsw.sh
#!/bin/sh
###########################################################
PASSFILE="/etc/openvpn/psw-file"
LOG_FILE="/opt/apps/openvpn/logs/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
###########################################################
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
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

# 配置systemd启动脚本

[root@host-172-16-30-22 openvpn]# cat /usr/lib/systemd/system/openvpn.service
[Unit]
Description=openvpn
After=network.target
[Service]
EnvironmentFile=-/etc/openvpn/openvpn
ExecStart=/opt/apps/openvpn/sbin/openvpn --config /etc/openvpn/server.conf
Restart=on-failure
Type=simple
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
[root@host-172-16-30-22 openvpn]# systemctl status openvpn
● openvpn.service - openvpn
   Loaded: loaded (/usr/lib/systemd/system/openvpn.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-12-28 11:43:13 CST; 6min ago
 Main PID: 10319 (openvpn)
    Tasks: 1
   Memory: 1004.0K
   CGroup: /system.slice/openvpn.service
           └─10319 /opt/apps/openvpn/sbin/openvpn --config /etc/openvpn/server.conf

Dec 28 11:43:13 host-172-16-30-22 systemd[1]: Stopped openvpn.
Dec 28 11:43:13 host-172-16-30-22 systemd[1]: Started openvpn.
Dec 28 11:43:13 host-172-16-30-22 openvpn[10319]: 2022-12-28 11:43:13 WARNING: Compression for receiving enabled. Compression has been used in the past to break encryption. Sent packets are not compressed unless "allow-comp...yes" is also set.
Hint: Some lines were ellipsized, use -l to show in full.
[root@host-172-16-30-22 openvpn]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      911/sshd            
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      10319/openvpn       
tcp6       0      0 :::22                   :::*                    LISTEN      911/sshd            
udp        0      0 0.0.0.0:68              0.0.0.0:*                           593/dhclient
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 开启内核路由转发功能

vim /etc/sysctl.conf
添加如下内容
net.ipv4.ip_forward = 1
sysctl -p
1
2
3
4

# 安装openvpn客户端

windows和linux下载地址:https://openvpn.net/community-downloads/(可能需要翻墙)

  1. 安装成功后,打开应用,选择导入配置、导入client.ovpn文件

  2. 导入成功后,选择连接即可

macos安装包:Tunnelblick_3.7.8_build_5180.dmg

  1. 下载安装MacOS客户端 https://tunnelblick.net/downloads.html 选择Stable稳定版 Tunnelblick 3.7.8

  2. 安装成功后 双击client.ovpn(附件)

  3. 选择连接client 弹窗显示connected 则连接成功

Android系统 安装包:openvpn-connect-3-0-5.apk

  1. 下载安装客户端 https://openvpn-connect.en.uptodown.com/android 选择最新版本

  2. 安装成功后、点击client.ovpn, 选择使用openVPN connect 打开

  3. 进入app, 点击连接即可

ios客户端

1.国内app store屏蔽了openvpn client,暂时不支持

2.国外app store下载后导入openvpn client即可

# 客户端配置

windows客户端配置

client
dev tun
proto tcp
remote 220.231.216.147 8888
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-auth ta.key 1
cipher AES-256-CBC
comp-lzo
verb 3
auth-user-pass
1
2
3
4
5
6
7
8
9
10
11
12
13
14

app端配置

注意:APP端配置在windwos主机配置要注意文件格式,不然会报错line is too long

client
dev tun
proto tcp
remote 220.231.216.147 8888 tcp-client
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-CBC
comp-lzo
verb 3
<ca>
-----BEGIN CERTIFICATE-----
xxx
-----END CERTIFICATE-----

</ca>

key-direction 1

<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
xxxx
-----END OpenVPN Static key V1-----

</tls-auth>
auth-user-pass
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
微信 支付宝
上次更新: 2023/02/23, 18:13:16

← 云平台的性能问题 mac电脑常用软件→

最近更新
01
shell脚本模块集合
05-13
02
生活小技巧(认知版)
04-29
03
生活小技巧(防骗版)
04-29
更多文章>
Theme by Vdoing | Copyright © 2019-2025 | 点击查看十年之约 | 鄂ICP备2024072800号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式