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."
需要生成的证书
- CA证书, 用来给服务器和客户端发证
- 服务端证书
- 客户端证书
- 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