centos7部署easyrsa打通内网

查看帮助手册 man openvpn

1.安装依赖包

版本信息
easy-rsa: 3.0.8
openvpn: 2.4.12

yum install -y lzo openssl pam
yum install -y epel-release
yum install -y openvpn easy-rsa iptables-services

2.配置openvpn服务端

Esay-RSA默认安装目录在/usr/share/easy-rsa/3.0.8,文档配置文件模板在/usr/share/doc/easy-rsa-3.0.8。复制一份程序到工作目录

cp -a /usr/share/easy-rsa/3.0.8 /etc/openvpn/easy-rsa

复制配置文件模板并重命名为vars

cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars

在配置文件的最后面添加
EASYRSA_REQ_COUNTRY "所在的国家"
EASYRSA_REQ_PROVINCE "所在的省份"
EASYRSA_REQ_CITY "所在的城市"
EASYRSA_REQ_ORG "所属的组织"
EASYRSA_REQ_EMAIL "邮件地址"
EASYRSA_REQ_OU "组织单位,部门"

set_var EASYRSA_REQ_COUNTRY    "CN"
set_var EASYRSA_REQ_PROVINCE   "Tianjin"
set_var EASYRSA_REQ_CITY       "Tianjin"
set_var EASYRSA_REQ_ORG        "TST"
set_var EASYRSA_REQ_EMAIL      "info@tst-cloud.com"
set_var EASYRSA_REQ_OU         "Development Dept."

需要生成的证书

  1. CA证书, 用来给服务器和客户端发证
  2. 服务端证书
  3. 客户端证书
  4. DH证书
  • 初始化PKI
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
  • 生成CA证书

这里可以去掉nopass,为证书添加密码,后续用ca发证的时候每次都得输入密码,挺麻烦的

./easyrsa build-ca nopass
  • 生成服务端证书

服务端发证的时候最好加上nopass,不然每次启动服务端程序都需要密码

./easyrsa build-server-full server nopass
  • 生成DH证书

生成Diffie-Hellman算法需要的密钥文件,创建Diffie-Hellman,确保key穿越不安全网络的命令,时间会有点长,耐心等待。

./easyrsa gen-dh
  • 将生成的证书拷贝到统一的目录

因为/usr/lib/systemd/system/openvpn@.service启动文件中,指定的配置文件目录就是/etc/openvpn
所以证书文件就全都复制到这来了

cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/private/ca.key /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/
  • 创建服务端配置/etc/openvpn/server.conf
# 监听地址
local 0.0.0.0

# 监听端口
port 11618

# 使用的协议,有udp和tcp。建议选择tcp
proto tcp

# 使用三层路由IP隧道(tun)还是二层以太网隧道(tap)。一般都使用tun
dev tun

# ca证书、服务端证书、服务端密钥和密钥交换文件。如果它们和server.conf在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用
ca ca.crt
cert server.crt
key server.key
dh dh.pem

# 使用一个文件记录已分配虚拟IP的客户端和虚拟IP的对应关系,
# 以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的IP。也就是自动续借IP的意思。
# 但是这个配置好像不生效,可以使用另一个配置固定IP
# ifconfig-pool-persist /etc/openvpn/ip.txt

# 这个配置可以给客户端做配置,只需要在下面的目录创建客户端证书名称的文件
# 例如/etc/openvpn/static_ip/zhangsan
# 文件中的内容,以固定IP地址为例
# ifconfig-push 12.34.56.100 255.255.255.0
# 如果固定IP地址是以子网的形式,配置文件中必须加上topology subnet
client-config-dir /etc/openvpn/static_ip/

# 固定IP地址用的配置
topology subnet

# vpn服务端为自己和客户端分配IP的地址池。
# 服务端自己获取网段的第一个地址(此处为10.8.0.1),后为客户端分配其他的可用地址。以后客户端就可以和10.8.0.1进行通信。
# 注意:该网段地址池不要和已有网段冲突或重复。其实一般来说是不用改的。除非当前内网使用了10.8.0.0/24的网段。
server 12.34.56.0 255.255.255.0

# vpn服务端向客户端推送vpn服务端内网网段的路由配置,以便让客户端能够找到服务端内网。多条路由就写多个Push指令
push "route 192.168.1.0 255.255.255.0"
# 这个选项会覆盖原有的路由,将push route给的路由设成主路由
#push "redirect-gateway def1 bypass-dhcp"
#push "dhcp-option DNS 114.114.114.114"
#push "dhcp-option DNS 8.8.8.8"

# 让vpn客户端之间可以互相看见对方,即能互相通信。默认情况客户端只能看到服务端一个人
client-to-client

# 每20秒ping一次,120秒后没收到ping就说明对方挂了
keepalive 20 120

# 启用lzo数据压缩格式。此指令用于低于2.4版本的老版本。且如果服务端配置了该指令,客户端也必须要配置
comp-lzo

# 允许多个客户端使用同一认证文件
# duplicate-cn

# 启动用户
user openvpn
group openvpn

# 通过ping得知超时时,当重启vpn后将使用同一个密钥文件以及保持tun连接状态
persist-key
persist-tun

# 在文件中输出当前的连接信息,每分钟截断并重写一次该文件
status /etc/openvpn/openvpn-status.log

# 默认vpn的日志会记录到rsyslog中,使用这两个选项可以改变。
# log指令表示每次启动vpn时覆盖式记录到指定日志文件中,
# log-append则表示每次启动vpn时追加式的记录到指定日志中。
# 但两者只能选其一,或者不选时记录到rsyslog中
# log /etc/openvpn/openvpn.log
log-append  /etc/openvpn/openvpn.log

# 日志记录的详细级别。
verb 1

# 沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志。
mute 20

# 吊销证书验证文件,如果不加这个就算吊销的证书还可以联通进来
# 默认吊销时会在pki目录下生成crl.pem,所以就直接指定这里
crl-verify /etc/openvpn/easy-rsa/pki/crl.pem
  • 创建吊销证书的pem文件
cd /etc/openvpn/easy-rsa
./easyrsa gen-crl
  • 关闭安全策略
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i s@SELINUX=enforcing@SELINUX=disabled@ /etc/selinux/config
  • 启用ipv4转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
  • 配置openvpn回包时源地址转换,确保服务器可以转发数据包到内网和外网

将vpn分配的地址转换成出接口的地址,回包给客户端

iptables -t nat -A POSTROUTING -s 12.34.56.0/24 -o eth0 -j MASQUERADE
service iptables save
  • 启动openvpn服务器

这个@符号后面的东西会传递给service文件,替换service文件中的变量

systemctl start openvpn@server
systemctl enable openvpn@server
systemctl status openvpn@server

3.配置客户端

  • 生成客户端证书
cd /etc/openvpn/easy-rsa
# 不带密码的证书
./easyrsa build-client-full zhangsan nopass
# 带密码的证书
./easyrsa build-client-full zhangsan
  • 汇总客户端需要的文件
mkdir /etc/openvpn/client/zhangsan/
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/client/zhangsan/
cp /etc/openvpn/easy-rsa/pki/private/zhangsan.key /etc/openvpn/client/zhangsan/
cp /etc/openvpn/easy-rsa/pki/issued/zhangsan.crt /etc/openvpn/client/zhangsan/
  • 编辑客户端配置文件

zhangsan.ovpn

# 标识这是个客户端
client

# 使用的协议,有udp和tcp。服务端是什么客户端就是什么
proto tcp

# 使用三层路由IP隧道(tun)还是二层以太网隧道(tap)。服务端是什么客户端就是什么
dev tun

# 服务端的地址和端口
remote 39.9.2.6 1118

# ca证书、客户端证书、客户端密钥
# 如果它们和client.conf或client.ovpn在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用
ca ca.crt
cert zhangsan.crt
key zhangsan.key

# 一直尝试解析OpenVPN服务器的主机名。
# 在机器上非常有用,不是永久连接到互联网,如笔记本电脑。
resolv-retry infinite

# 大多数客户机不需要绑定到特定的本地端口号。
nobind

mute-replay-warnings

# 心跳测试
keepalive 20 120

# 启用压缩
comp-lzo

# 仅linux系统使用
#user openvpn
#group openvpn

# 尝试在重新启动时保留某些状态。
persist-key
persist-tun

# 日志仅linux系统使用
#status openvpn-status.log
#log-append openvpn.log
#verb 3

# 沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志。
mute 20
  • 将三个密钥和一个配置文件放到客户端中,客户端读取配置文件就可以联通vpn了

4.吊销客户端

吊销客户端需要在服务端配置文件中添加
crl-verify /etc/openvpn/easy-rsa/pki/crl.pem

cd /etc/openvpn/easy-rsa
./easyrsa revoke <证书名称>
./easyrsa gen-crl

5.续期证书

证书续期后需要重新下发证书给相应的人,如果续期的是服务器证书,服务器也需要更换证书
pki/private/xxx.key
pki/issued/xxx.crt

cd /etc/openvpn/easy-rsa
./easyrsa renew <证书名称> nopass

6.固定IP

这块已经在开头的配置文件中表明了,怕忘了在这又写一下

# 使用一个文件记录已分配虚拟IP的客户端和虚拟IP的对应关系,
# 以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的IP。也就是自动续借IP的意思。
# 但是这个配置好像不生效,可以使用另一个配置固定IP
# ifconfig-pool-persist /etc/openvpn/ip.txt

# 这个配置可以给客户端做配置,只需要在下面的目录创建客户端证书名称的文件
# 例如/etc/openvpn/static_ip/zhangsan
# 文件中的内容,以固定IP地址为例
# ifconfig-push 12.34.56.100 255.255.255.0
# 如果固定IP地址是以子网的形式,配置文件中必须加上topology subnet
client-config-dir /etc/openvpn/static_ip/

# 固定IP地址用的配置
topology subnet

7.创建证书时指定过期时间

export EASYRSA_CERT_EXPIRE=30
./easyrsa build-client-full user10

8.查看证书信息

openssl x509 -in cert_file.pem -text
posted @ 2022-11-02 14:48  ForLivetoLearn  阅读(1022)  评论(0编辑  收藏  举报