一、部署环境及软件版本
三台服务使用vmware虚拟机模拟,网络使用全部使用桥接,window客户端可以不用虚拟机(我的电脑有问题所以使用虚拟机),以上IP根据实际情况修改
二、配置证书
1.安装证书安装包及依赖
yum -y install easy-rsa mkdir /opt/easy-rsa cd /opt/easy-rsa rpm -ql easy-rsa #查看已安装的RPM包中名为 easy-rsa 的文件列表 cp -a /usr/share/easy-rsa/3.0.8/* . #官方建议整个easy-rsa目录复制到另一个位置,而不是在原目录下进行操作,以便将来的升级不会消除已做的更改 cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example ./vars > vars cat vars if [ -z "$EASYRSA_CALLER" ]; then echo "You appear to be sourcing an Easy-RSA 'vars' file." >&2 echo "This is no longer necessary and is disallowed. See the section called" >&2 echo "'How to use this file' near the top comments for more details." >&2 return 1 fi set_var EASYRSA_DN "cn_only" set_var EASYRSA_REQ_COUNTRY "CN" set_var EASYRSA_REQ_PROVINCE "Beijing" set_var EASYRSA_REQ_CITY "Shanghai" set_var EASYRSA_REQ_ORG "koten" set_var EASYRSA_REQ_EMAIL "888888@qq.comm" set_var EASYRSA_NS_SUPPORT "yes" set_var EASYRSA_CERT_EXPIRE=36500 set_var EASYRSA_CA_EXPIRE 36500
2.创建证书
./easyrsa init-pki #1、初始化,在当前目录创建PKI目录,用于存储整数 ./easyrsa build-ca #2、创建根证书,会提示设置密码,用于ca对之后生成的server和client证书签名时使用,其他提示内容直接回车即可 Enter New CA Key Passphrase: #注意密码不能太短,我这边设置的是123456 Re-Enter New CA Key Passphrase: openssl x509 -text -in pki/ca.crt -noout #查看证书详情 过期时间 ./easyrsa gen-req server nopass #3、创建server端证书和私钥文件,nopass表示不加密私钥文件,提示内容直接回车即可 ./easyrsa sign server server #4、给server端证书签名,提示内容需要输入yes和创建ca根证书时候的密码 ./easyrsa gen-dh #5、创建Diffie-Hellman文件,密钥交换时的Diffie-Hellman算法 ./easyrsa gen-req client1 nopass #6、创建client端的证书和私钥文件,nopass表示不加密私钥文件,提示内容直接回车即可 ./easyrsa sign client client1 #7、给client端证书前面,提示内容输入yes和创建ca根证书时候的密码 tree #检查是否有ca根证书、客户端服务端证书、客户端服务端私钥 . ├── easyrsa #管理命令 ├── openssl-easyrsa.cnf ├── pki │ ├── ca.crt #ca根证书,服务端与客户端都需要用 │ ├── certs_by_serial │ │ ├── 633C217979C7B5F1D0A9ECA971006F96.pem │ │ └── 857F9B2E3F6C3D35934672212343B42D.pem │ ├── dh.pem #认证算法 服务端 │ ├── index.txt │ ├── index.txt.attr │ ├── index.txt.attr.old │ ├── index.txt.old │ ├── issued │ │ ├── client.crt #客户端证书 │ │ └── server.crt #服务端证书 │ ├── openssl-easyrsa.cnf │ ├── private │ │ ├── ca.key │ │ ├── client.key #客户端私钥 │ │ └── server.key #服务端私钥 ......
三、安装及配置openVPN
yum -y install openvpn /etc/openvpn/server.conf #/usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf 模板配置文件 port 1194 #端口,生产建议修改 proto udp #协议 dev tun #采用路由隧道模式 ca /opt/easy-rsa/pki/ca.crt #ca证书的位置 cert /opt/easy-rsa/pki/issued/server.crt #服务端公钥的位置 key /opt/easy-rsa/pki/private/server.key #服务端私钥的位置 dh /opt/easy-rsa/pki/dh.pem #证书校验算法 server 10.8.0.0 255.255.255.0 #给客户端分配的地址池 push "route 172.16.1.0 255.255.255.0" #允许客户端访问的内网网段,注意这里要和实际环境符合 ifconfig-pool-persist ipp.txt #地址池记录文件位置,未来让openvpn客户端固定ip地址使用的 keepalive 10 120 #存活时间,10秒ping一次,120秒如果未收到响应则视为短线 max-clients 100 #最多允许100个客户端连接 status openvpn-status.log #日志位置,记录openvpn状态 log /var/log/openvpn.log #openvpn日志记录位置 verb 3 #openvpn版本 client-to-client #允许客户端与客户端之间通信 persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取 persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的,否则网络会先linkdown然后再linkup duplicate-cn #客户端密钥(证书和私钥)是否可以重复,即允许多个客户端使用同一账号登录(默认否) comp-lzo #启动lzo数据压缩格式
四、启动openVPN
systemctl start openvpn@server systemctl enable openvpn@server Created symlink from /etc/systemd/system/multi-user.target.wants/openvpn@server.service to /usr/lib/systemd/system/openvpn@.service. ip a s tun0 #查看网段 4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::b1:7ea6:1178:8a1a/64 scope link flags 800 valid_lft forever preferred_lft forever ss -lntup|grep 1194 #检查端口 udp UNCONN 0 0 *:1194 *:* users:(("openvpn",pid=47104,fd=6)) ps -ef|grep openvpn #检查pid root 47104 1 0 10:59 ? 00:00:00 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf root 47202 40565 0 11:01 pts/0 00:00:00 grep --color=auto openvpn vim /etc/systemd/system/openvpn.service #openvpn@server.service名称有点不太符合常规可以选择新建一个名为openvpn的服务 [Unit] Description=OpenVPN Server After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server.conf
四、openVPN客户端配置(window)
1.下载openVPN
访问:https://openvpn.net/community-downloads/,选中对应的版本下载(可能需要FQ)
2.安装及配置客户端
1)安装,安装一路点击下一步即可,略
2)下载客户端证书
将ca根证书、client.key、client.crt放入config目录
sz pki/ca.crt
sz pki/private/client.key
sz pki/issued/client.crt
3)创建客户端配置文件
client #模式,客户端 dev tun proto udp remote 192.168.101.67 1194 #注意此处的IP和端口 resolv-retry infinite nobind #不绑定本地特定端口 ca ca.crt cert client.crt key client.key verb 3 persist-key comp-lzo
五、连接测试
1.双击左桌面openVPN快捷键,在右下角出现图标后右键点击连接
如果配置没问题则正常连接,如果无法连接查看连接输出日志
查看网络适配器信息,可以看到新安装的TAP网卡连接成功,并且获得了一个OpenVPN服务器分配的IP地址10.8.0.6
查看系统路由表
2.访问openVPN内网服务器和测试内网服务器
服务端
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #确保openvpn开启了ip转发
sysctl -p
net.ipv4.ip_forward = 1
客户端测试
测试内网服务添加路由
route add -net 10.8.0.0 netmask 255.255.255.0 gw 172.16.1.101 #根据实际网段和IP地址配置
客户端测试,可以看到回包了
访问内网服务也正常
除了在客户端添加路由外也可以通过服务端做NAT映射解决网络通信,这样就不需要在客户端添加路由了
#iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 172.16.1.0/24 -j SNAT --to-source 172.16.1.101 对指定的网段进行NAT映射 iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 172.16.1.101 iptables -L -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 10.8.0.0/24 anywhere to:172.16.1.101
六、openvpn添加密码认证
1.修改服务端配置支持密码认证
cat /etc/openvpn/server.conf #添加配置文件
......
script-security 3 #允许使用自定义脚本
auth-user-pass-verify /etc/openvpn/check.sh via-env #指定认证脚本
username-as-common-name #用户密码登陆方式验证
2.编写校验脚本
cat /etc/openvpn/check.sh #!/bin/bash PASSFILE="/etc/openvpn/openvpnfile" #密码文件 用户名 密码明文 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/check.sh
3.创建用户和密码
cat /etc/openvpn/openvpnfile
test test123 #以空格分隔
4.重启服务
systemctl restart openvpn@server
5.客户端配置文件中添加配置最下面加上auth-user-pass
6.客户端端口重新连接
重新分配了地址
测试连接
抄自于: