OpenVPN(虚拟专用网络)
OpenVPN 部署
阿里云 OpenVPN 实战环境(https:www.aliyun.com)
阿里云服务器购买专有网络标准:
1、按量付费,华北3张家口可用区A区,X86通用g6 2cpu 8GiB,买三台,要求系统一样,公共镜像rukey8.6 64位,ESSD AutoPL 40GiB ,创建交换机,选择专有网络,并给交换机起名M50-NET,取消弹性公网IP
2、自定义密码,主机名openvpn-server,然后同意创建
3、停止实例,资源管理台,右边选择修改私有ip,修改各自主机名,openvpn-server、web01、web02,启动
4、openvpn-server创建公网IP(弹性IP)选择华北3张家口按量收费,其他默认。就可以本地连接openvpn-server
5、两台web安装nginx 并启动服务,systemctl enable --noe nginx
6、nginx写默认页面hostname > /usr/share/nginx/html/index.html
7、公网地址的openvpn-server连接xshell,web01、web02可以在网络打开。
8、 重设所有实例密码,修改安全组打开 1194/TCP/UDP
配置Openvpn服务
服务器配EPEL源 https://developer.aliyun.com/mirror/
选择epel,打开:https://mirrors.aliyun.com/epel/?spm=a2c6h.13651104.0.0.6b5233a1mG2Mqv,进入8/,进入everything/,进入x86_64/
进入/etc/yum.repos.d/epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
gpgcheck=0
安装openvpn :yum -y install openvpn
安装证书管理工具:yum -y install openvpn easy-rsa
查看包中相关文件:rpm -qi openvpn easy-rsa rpm -ql openvpn
准备相关配置文件
准备证书颁发相关文件:把证书管理里面的3文件拷贝到openvpn新建的easy-rsa目录中,
cp -r /usr/share/easy-rsa/3/ /etc/openvpn/easy-rsa
openvpn由原来两个文件夹增加到三个:client(客户端)server(服务端)easy-rsa
准备颁发证书相关变量的配置文件:把证书管理里面的文件拷贝并改名到openvpn/easyrsa/vars
cp /usr/share/doc/easy-rsa/vars.example /etc/openvpn/easyrsa/vars
接下来,需要颁发三种证书,openvpn服务器的证书、若干客户端的证书、颁发证书的CA证书 建议修改给CA和OpenVPN服务器颁发的证书的有效期,可适当加长
vim /etc/openvpn/easy-rsa/vars可查看证书有效期
CA的证书默认有效期为10年,可以适当延长,比如:36500天
set_var EASYRSA_CA_EXPIRE 3650 改
set_var EASYRSA_CA_EXPIRE 36500
openvpn服务器证书默认为825天,可适当延长,比如:3650天
set_var EASYRSA_CA_EXPIRE 825 改
set_var EASYRSA_CA_EXPIRE 3650
tree /etc/openvpn/查看文件树
准备证书相关文件
初始化PKI和CA颁发机构环境
初始化PKI生成PKI相关目录和文件
cd /etc/openvpn/easy-rsa/ 进入文件
初始化数据,在当前目录下生成pki目录及相关文件
./easyrsa init-pki
创建 CA 机构证书环境
cd /etc/openvpn/easy-rsa/
tree pki
./easyrsa build-ca nopass一条命令执行了私钥的创建和证书的自颁发nopass表示不给私钥加密
执行后出现Common Name:可改成OpenVPN CA(改不改都可以)
ca.crt生成的自签名证书文件
ca.key生成的私钥文件
cat pki/ca.crt 查看文件
openssl x509 -in pki/ca.crt -noout -text可显示证书内容
也可以sz pki/ca.crt存到windows上查看 如果sz没安装 可用 yum -y install lrzsz安装
准备服务端证书环境
创建服务端证书申请
cd /etc/openvpn/easy-rsa 进入
创建服务器证书申请文件,其中server是文件前缀
./easyrsa gen-req openvpn-server nopass 生成证书申请文件,创建私钥
颁发服务端证书
查看颁发证书命令用法
cd /etc/openvpn/easy-rsa/
./easyrsa sign server openvpn-server 颁发服务器证书
tree 可看到 CA的ca.crt证书文件和issued下的openvpn-server.crt的服务器证书文件
查看证书相关文件
cat pki/index.txt 记录下来颁发服务器证书
创建Diffie-Hellman密钥(实现交换对称密钥的数学算法)
cd /etc/openvpn/easy-rsa
./easyrsa gen-dh生成密钥文件引用openssl 生成过程中根据你的硬件信息调用随机数,需要随意动下鼠标和键盘。 生成/etc/openvpn/easy-rsa-sever/3/pki/dh.pem文件
创建客户端证书申请
cd /etc/openvpn/easy-rsa/
建议修改给客户端颁发证书的有效期,可适当减少,比如:100天。
在vim /etc/openvpn/easy-rsa/vars
客户端证书在原来服务器证书的有效期那里修改,因为服务器证书用不上了。
生成客户端用户的证书申请
set_var EASYRSA_CA_EXPIRE 825 改
set_var EASYRSA_CA_EXPIRE 100 (不要设置太长时间,如员工离职,可以提前把证书吊销)
./easyrsa gen-req mengfanchao nopass
req: /etc/openvpn/easy-rsa/pki/reqs/mengfanchao.req私钥文件
key: /etc/openvpn/easy-rsa/pki/private/mengfanchao.key证书申请文件
颁发客户端证书(需要指定用户)
cd /etc/openvpn/easy-rsa/
颁发客户端证书
./easyrsa sign client mengfanchao
certificate created at:/etc/openvpn/easy-rsa/pki/issued/mengfanchao.crt证书文件
客户端证书自动颁发脚本
read -p "请输入用户的姓名拼音(如:${NAME}):" NAME
cd /etc/openvpn/easy-rsa/
./easyrsa gen-req ${NAME} nopass <<EOF
EOF
./easyrsa sign client ${NAME} <<EOF
yes
EOF
将CA和服务器证书相关文件复制到服务器相应的目录
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/ CA证书放到服务器目录下
cp /etc/openvpn/easy-rsa/pki/issued/openvpn-server.crt /etc/openvpn/server 服务器的证书也放到服务器目录下
cp /etc/openvpn/easy-rsa/pki/private/openvpn-server.key /etc/openvpn/server 服务器私钥放到服务器目录下
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server
Diffie-Hellman加密也放在服务器
tree /etc/openvpn/srecer 四个文件
将客户端私钥与证书相关文件复制到服务器相关的目录
cd /etc/openvpn/client
mkdir mengfanchao
cd /etc/openvpn/easy-rsa
find -name "mengfanchao*" -exec cp {} /etc/openvpn/client/mengfanchao/ \;
拷贝过来有三个文件,可以删除客户端证书申请文件
rm -f mengfanchao/mengfanchao.req
tree server/client/
server下四个文件
ca.crt
dh.pem
openvpn-server.crt
openvpn-server.key
client下有一个文件 mengfanchao
mengfanchao 下有两个文件
mengfanchao.crt
mengfanchao.key
但是需要注意,ca.crt还需要放在mengfanchao文件中一份,因为需要通过ca.crt来证明mengfanchao文件下的证书是正确的,所以还需要把ca.crt文件拷贝进来
cp /server/ca.crt client/mengfanchao/
到此,证书的活结束,接下来准备openvpn服务器配置
配置 OpenVPN 服务器并启动服务
生成服务器配置文件:案例
cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf/etc/openvpn
ls /etc/openvpn 下四个文件
client easy-rsa server server.conf(最后这个文件就是我们要改的配置文件)
打开配置文件vim /etc/openvpn/server.conf
port 1194 端口 #需要在阿里云管理控制台ECS实例设置安全组,允许1194端口连接
proto tcp 协议,生产推荐使用TCP
#proto udp #默认协议udp
dev tun #创建IP路由隧道,生产推存使用tun.互联网使用tun,一个tun设备大多时候被用于基 于IP协议的通讯.tun模拟了网络层设备,操作第三层数据包比如IP数据封包.
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/openvpn-server.crt
key /etc/openvpn/server/openvpn-server.key 这个文件应该保密
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0 有可能需要更改,这个网段负责传输两边的请求,双方如果有一方是10网段就需要错开。冲突了就在配置文件里面改
push "route 172.30.0.0 255.255.255.0"希望互联网通过vpn连过来,访问内网的地址,就需要把内网网段推送给互联网
keepalive 10 120活动时间
cioher AES-256-CBC 加密算法
compress lz4-v2压缩
push"compress lz4-v2"推送压缩,两边都压缩,才支持压缩
max-clients 2048 最多连接客户数
user openvpn vpn用户
group openvpn
status /var/log/openvpn/openvpn-status.log vpn状态日志
log-append /var/log/openvpn/openvpn.log vpn其他日志
verb 3日志详细程度
mute 20相同类型日志,只记录前二十条,多了就不记了
配置文件清空
把以上信息复制到配置文件里面:
vim /etc/openvpn/server.conf打开配置文件:其中汉字部分不要复制,为注释#,写入删除汉字
port 1194
proto tcp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/openvpn-server.crt
key /etc/openvpn/server/openvpn-server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
push "route 172.30.0.0 255.255.255.0" #公司内部网段,有几个网段加几个网段
keepalive 10 120
cioher AES-256-CBC
compress lz4-v2
push"compress lz4-v2"
max-clients 2048 #并发连接
user openvpn vpn
group openvpn
status /var/log/openvpn/openvpn-status.log 注释:默认没有,需要提前建立起来,并把所有者和所属组改了,操作如下
#新建文件夹: mkdir/var/log/openvpn
#确认:ll -d /var/log/openvpn
#修改所有者和所属组: chown openvpn.openvpn /var/log/openvpn
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20
调试阿里云安全组,打开网络与安全中的安全组,点进去默认带端口22和3389.在里面手动添加协议tcp,端口号1194,源0.0.0.0,描述openvpn。协议udp,端口号1194,源0.0.0.0,描述openvpn。
启动 OpenVPN 服务
准备 OpenVPN 服务的service文件
CentOS8 缺失unit文件,从CentOS7复制文件
cat /usr/lib/systemd/system/[email protected]
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target
[Service]
Type=notify
PrivateTmp=ture
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf
[Install]
wantedBy=multi-user.target
在centos8上把以上内容复制到 vim /lib/systemd/system/[email protected]
systemctl daemon-reload 启动服务
ss -ntl 启动之前看下端口
systenctl enable --now openvpn@sercer
ss -ntl 1194端口已打开,服务器已搭完
syetemctl status openvpn@server 查看服务状态
在windows nmd 上输入telnet 服务器公网地址 1194
如果windows没有安装telnet命令,可按照以下流程安装:
设置→应用→程序和功能→启用或关闭windows功能→telnet客户端
安装好执行 telnet 服务器公网地址 1194 命令,出现黑屏 证明可以,此命令是检查端口是否能连接
ip a查看 多了设备tun0: 获取网络中的第一个地址。
查看日志状态:cat /var/log/openvpn/openvpn.log 已建立连接,可接受用户请求
cat /var/log/openvpn/openvpn-status.log 查看其他日志
准备 OpenVPN 客户端配置文件
客户端默认范例配置文件说明
client 指明客户端
dev tun 指定和服务端一致的接口类型
proto tcp 指定和服务端一致的协议类型
remote openvpn-server 1194服务器端的ip或FQDN及端口 写上公网地址,最好写域名,怕公网地址变
resolv-retry infinite 指定服务器端FQDN而非IP时,当客户端重新连接后会重新解FQDN对应的IP nobind 客户端不绑定监听端口,随机打开端口连接到服务端的端口
persist-key
persist-tun
ca ca.crt
cert client.crt
这个文件属于在谁的名字下,叫什么文件,可统一改成client.crt,这样配置文件就不用来一个改一个了,如mengfanchao文件下,mengfanchao.crt 和 mengfanchao.key 都改成client.crt
key client.key mengfanchao.key 改client.key
remote-cert-tls sercer使用服务器证书验证方式
tls-auth ta.key 1 安全加强
cipher AES-256-CBC
verb 3 此值不能随意指定,否则无法通信
compress 1z4-v2 在openvpn中使用,需要和服务器端保持一致,如不指定,默认使用comp-lz压缩
如果有域名,最好写域名,如何配置域名到公网地址
登录阿里云。左上角三条横线,云解析DNS,点击解析设置,新建一个,主机记录是openvpn,记录值是公网地址,确定。 在windows上ping openvpn 域名看是否生效
whois可查域名到期时间
apt install whois
如:whois mfc001.com
公网IP绑定域名
工作台--云解析DNS--添加域名--添加记录
生成客户端用户的配置文件
生成客户端文件,文件后缀必须为.ovpn,放在mengfanchao目录下,进入mengfanchao目录
vim /etc/openvpn/client/mengfanchao/client.ovpn 写入内容
其中汉字部分不要写入,为注释,写入时删除
client
dev tun
proto tcp
remote openvpn-server 1194 注释(没有openvpn域名就写入公网地址)
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls sercer
#tls-auth ta.key 1
cipher AES-256-CBC
verb 3
compress 1z4-v2
把写好的服务器配置文件和客户端配置文件放到windows上
把客户端文件放到windows桌面,sz /etc/openvpn/client/mengfanchao/client.ovpn
把服务器配置文件放到桌面上,sz /etc/openvpn/server.conf
实现 OpenVPN 客户端
配置部署窗口的OpenVPN客户端
客户端很可能在网上无法传播,想办法下载好
安装好文件,右键打开文件所在位置,回到上级目录,找到config,放客户端配置文件
进入mengfanchao文件,对里面的文件打包
tar cf mengfanchao.tar *生成mengfanchao.tar文件
传到windows sz mengfanchao.tar
把打包的文件放入并解开到config目录下,切记放到解压后的目录里,需要挪出来,删除config里面的其他文件,只留下解压出来的四个文件。
打开软件,右下角点击连接即可,连接成功后图表显示绿色
tail -f /var/log/openvpn/* 打开日志可以看到连接情况
windows就可以直接ping私网地址
如果之前连接过私网地址,会被记录,导致无法在此连接,可在c盘用户、admini下把ssh下的隐藏文件删除
然后ssh root@私网地址输入密码进行vpn连接,但无法连接vpn后面的机器
数据包只是到了vpn服务器,但还没有把包转过去,需要开启openvpn server的ip_forward
vim /etc/sysctl.conf 最后一行加入 net.ipv4.ip_forward=1
sysctl -p
做到这一步可以连接vpn后的机器了,用tcpdump -i eth0 -nn icmp命令进行抓包,会发现请求有去无回,什么原因?
因为两个私网地址机器的网段和数据来源的网段不是一个网段,请求从vpn机器转发过来,私网地址机器可以收到请求,但是他把请求转到了他的网关上去,这个网关和openvpn没有关系,所以不会回到vpn上。
解决方法:把vpn后边的机器网关指向vpn。
解决方法有二:
一:在内网主机指定的路由器上添加路由
route add -net 10.8.0.0/24 gw 172.30.0.1
二:在OpenVPN服务器配置iptables规则
解释:当外网发请求到openvpn的时候,openvpn收到请求把数据包转发到后面服务器的瞬间,
把外网来的地址地换成openvpn的内网地址再转发给服务器,数据包回来时回到vpn内网,然后内网再把地址转换成公网地址回到外网上
在openvpn服务上增加规则
方法一:echo 'iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j MASQUERADE' >> /etc/rc.d/rc/local
方法二:echo 'iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SANT --to-source 172.30.0.1' >> /etc/rc.d/rc/local
设置完成就可以写私网地址直接访问内部服务器主机了。
OpenVPN 管理 功能主要关于安全加强及客户端的证书管理,用户密码验证等
启用安全增强功能
1、共享客户端证书,但是不安全
在服务器配置文件中加入duplicate-cn 多个用户共用一个证书,一般用于测试环境
vim /openvpn/server.conf
最后加上 duplicate-cn
重启服务 systemctl restart [email protected]
2、启用安全增强功能防止DoS等攻击的安全增强配置
tls-auth ta.key 0|1访止DoS等攻击的安全增强配置,服务器和每个客户端都需要拥有此密钥文 件.第二个参数在服务器端为0,客户端为1,操作如下
第一步:生成密钥 openvpn --genkey --secret /etc/openvpn/server/ta.key
查看密钥 cat /etc/openvpn/server/ta.key
把/etc/openvpn/server/ta.key文件拷贝到/etc/openvpn/server中
第二步:写入服务器端配置文件中 vim /etc/openvpn/sercer.conf
最后加上 tls-auth /etc/openvpn/sercer/ta.key 0
第三步:把/etc/openvpn/server/ta.key拷贝到/etc/openvpn/client/mengfanchao/
写入客户端配置文件中 vim /etc/openvpn/client/mengfanchao/client.ovpn
最后写上 tls-auth ta.key 1(可以不写路径)
第四步:重启服务 systemctl restart [email protected]
然后重新把这五个文件打包到windows,替换原来的四个文件
3、设置客户端的私钥密码增强安全性
新建一个账户wang,并且设置证书密码,提高证书及登录VPN的安全性.
创建新用户对应的有密码的私钥和证书申请
申请证书:cd /etc/openvpn/easy-rsa/
./easyrsa gen-req wang 没有加nopass 默认有密码,就这一点区别
颁发证书:./easyrsa sign client wang
cd /etc/openvpn/client
mkdir wang
cd wang/
find /etc/openvpn/easy-rsa/ -name "wang*"找到关于wang的key、req、crt
find /etc/openvpn/easy-rsa/ -name "wang*" -exec cp {} . \;把上面三个文件cp到wang目录,req用不到,可以删除。
目前只有两个文件,还差三个文件,可以从mengfanchao文件下把ca.crt client.ovpn ta.key拷贝过来,wang.key和wang.crt 修改成 client.crt和client.key
cp ../mengfanchao/{ca.crt,client.ovpn,ta.key} *
打包加密
zip -e /root/wang.zip *
输入密码
sz /root/wang.zip 发到windows
解密需要密码,解开后把五个文件放到config目录下
打开openvpn 连接,需要密码
可以写成脚本
员工离职 证书手动注销
查看当前证书的有效性(证书有效为V,无效为R)
cat /etc/openvpn/easy-rsa/pki/index.txt 查看证书有效性
吊销指定的用户的证书
cd /etc/openvpn/easy-rsa/
./easyrsa revoke wang
生成证书吊销列表
吊销客户端证书后,vpn是不知道的,需要生成证书吊销列表文件
./easyrsa gen-crl
生成的文件为:/etc/openvpn/easy-rsa/pki/crl.pem
查看文件可把文件放到windows看图形页面
sz /etc/openvpn/easy-rsa/pki/crl.pem
windows后缀不识别,可加后缀crl
要把证书吊销列表文件放到vpn服务端配置文件里面去
第一次吊销证时需要编辑配置文件调用吊销证书的文件,后续吊销无需此步
vim /etc/openvpn/server.conf
crl-verify /etc/openvpn/easy-rsa/pki/crl.pem
每次吊销证书后,都需要重新启动才能生效
systemctl restart [email protected]
自动化的客户端证书颁发脚本(内有注释,不可直接复制)
#!/bin/bash
OPENVPN_SERVER=openvpn.mfc001.com (域名或公网地址)
PASS=123456
remove_cert () {
rm -rf /etc/openvpn/client/${NAME}
find /etc/openvpn/ -name "$NAME.*" -delete
}
create_cert () {
cd /etc/openvpn/easy-rsa
./easyrsa gen-req ${NAME} nopass <<EOF
EOF
cd /etc/openvpn/easy-rsa
./easyrsa import-req /etc/openvpn/easy-rsa/pki/reqs/${NAME}.req ${NAME}
./easyrsa sign client ${NAME} <<EOF
yes
EOF
mkdir /etc/openvpn/client/${NAME}
cp /etc/openvpn/easy-rsa/pki/issued/${NAME}.crt /etc/openvpn/client/${NAME}
cp /etc/openvpn/easy-rsa/pki/private/${NAME}.key /etc/openvpn/client/${NAME}
cp /etc/openvpn/server/{ca.crt,ta.key} /etc/openvpn/client/${NAME}
cat > /etc/openvpn/client/${NAME}/client.ovpn <<EOF
client
dev tun
proto tcp
remote $OPENVPN_SERVER 1194
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert $NAME.crt
key $NAME.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
compress lz4-v2
EOF
echo "证书存放路径:/etc/openvpn/client/${NAME},证书文件如下:"
echo -e "\E[1;32m******************************************************************\E[0m"
ls -l /etc/openvpn/client/${NAME}
echo -e "\E[1;32m******************************************************************\E[0m"
cd /etc/openvpn/client/${NAME}
zip -qP "$PASS" /root/${NAME}.zip *
echo "证书的打包文件已生成: /root/${NAME}.zip"
}
read -p "请输入用户的姓名拼音(如:mengfanchao): " NAME
remove_cert
create_cert
多人共用一个证书,并每个人单独设置用户密码验证,员工离职删用户即可
修改服务端配置(在server.conf配置文件最后面加入三行)
vim /etc/openvpn/server.conf #添加三行,实现服务端支持密码认证方式
script-security 3 #允许使用自定义脚本
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #指定自定义脚本路径
username-as-common-name #开启用户密码验证
创建自定义脚本写入 vim /etc/openvpn/checkpsw.sh
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <[email protected]>
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
PASSFILE="/etc/openvpn/psw-file"
LOG_FILE="/var/log/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
增加执行权限
chmod +x /etc/openvpn/checkpsw.sh
创建用户密码文件
创建用户和密码认证文件,每行是一个用户和密码
cat > /etc/openvpn/psw-file <<EOF
wang 123456
manman 123456
EOF
systemctl restart openvpn@server 重启服务
修改客户端配置
修改客户端配置文件client.ovpn文件,增加下面一行,使其支持用户名/密码与服务器进行身份验证
vim /etc/openvpn/client/wangxiaochun/client.ovpn
加下面一行,可以支持用户密码认证
auth-user-pass
标签:文件,证书,OpenVPN,rsa,server,etc,ECS,openvpn,企业级
From: https://blog.51cto.com/mfc001/6215433