环境准备:
openvpn client 10.0.0.1 外网服务器
openvpn server 外网IP 10.0.0.201
内网IP 172.16.1.201
jumpserver 172.16.1.41 内网服务器
OpenVPN服务端搭建(10.0.0.201)
10.0.0.201安装easy-rsa工具,用来生成证书
[root@ovpn ~]# yum -y install easy-rsa
新建目录,复制easy-rsa安装后相关文件到新目录,准备制作ca证书
mkdir /opt/easy-rsa
cp -a /usr/share/easy-rsa/3.0.8/* .
cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example ./vars
修改easy-rsa配置文件,设置制作证书时需要填入的相关信息
[root@ovpn easy-rsa]# > vars
[root@ovpn easy-rsa]# 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 "oldboy"
set_var EASYRSA_REQ_EMAIL "oldboy@qq.comm"
set_var EASYRSA_NS_SUPPORT "yes"
easyrsa初始化后,自动在当前目录创建PKI目录,主要用于存储证书
[root@ovpn easy-rsa]# ./easyrsa init-pki
创建根证书,会提示设置密码,密码用于之后生成的openvpn server和openvpn client证书签名时使用,创建过程中还有其他提示,默认即可
[root@ovpn easy-rsa]# ./easyrsa build-ca
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/opt/easy-rsa/pki/ca.crt
创建openvpn server端证书和私钥文件,nopass表示不加密私钥文件,其他可默认
[root@ovpn easy-rsa]# ./easyrsa gen-req server nopass
Keypair and certificate request completed. Your files are:
req: /opt/easy-rsa/pki/reqs/server.req
key: /opt/easy-rsa/pki/private/server.key
给openvpn server端证书签名,提示Confirm request details:时,输入yes,然后提示 Enter pass phrase for /opt/easy-rsa/pki/private/ca.key:时,输入创建ca根证书时所设置的密码
生成server端证书及私钥文件
[root@ovpn easy-rsa]# ./easyrsa sign server server
Certificate created at: /opt/easy-rsa/pki/issued/server.crt
key: /opt/easy-rsa/pki/private/server.key
创建Diffie-Hellman文件,秘钥交换算法
[root@ovpn easy-rsa]# ./easyrsa gen-dh
DH parameters of size 2048 created at /opt/easy-rsa/pki/dh.pem
创建openvpn client端证书和私钥文件,nopass表示不加密私钥文件,其他可默认
[root@ovpn easy-rsa]# ./easyrsa gen-req client nopass
Keypair and certificate request completed. Your files are:
req: /opt/easy-rsa/pki/reqs/client.req
key: /opt/easy-rsa/pki/private/client.key
给openvpn client端证书签名,提示Confirm request details:时,输入yes,然后提示 Enter pass phrase for /opt/easy-rsa/pki/private/ca.key:时,输入创建ca根证书时所设置的密码
生成client端证书及私钥文件
[root@ovpn easy-rsa]# ./easyrsa sign client client
Certificate created at: /opt/easy-rsa/pki/issued/client.crt
key: /opt/easy-rsa/pki/private/client.key
至此,server,client证书与私钥文件生成完毕,生成的目录结构如下:
[root@m01 /opt/easy-rsa]# tree
.
├── easyrsa #管理命令
├── pki
│ ├── ca.crt #ca证书 服务端与客户端创建证书和私钥需要使用
│ ├── dh.pem #认证算法 秘钥交换算法
│ ├── issued
│ │ ├── client.crt #客户端证书
│ │ └── server.crt #服务端证书
│ ├── private
│ │ ├── ca.key
│ │ ├── client.key #客户端私钥
│ │ └── server.key #服务端私钥
10.0.0.201安装Openvpn软件包
[root@ovpn easy-rsa]# yum -y install openvpn
openvpn server端添加配置文件
[root@ovpn easy-rsa]# cat /etc/openvpn/server.conf
port 1194 #绑定的端口
proto udp #指定传输协议
dev tun #采用路由隧道模式(指定虚拟网卡设备名)
ca ca.crt #ca证书文件位置/etc/openvpn /etc/opnevpn/server
cert server.crt #服务端公钥名称/etc/openvpn
key server.key #服务端私钥名称/etc/openvpn
dh dh.pem #交换证书 校验算法/etc/openvpn
server 10.8.0.0 255.255.255.0 #给客户端分配地址池,注意:不能和VPN服务器内网网段有相同
push "route 172.16.1.0 255.255.255.0" #给客户端设置允许客户端访问内网172.16.1.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,不重新读取keys,保留第一次使用的keys。
persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
duplicate-cn #客户端密钥(证书和私钥)是否可以重复
复制server证书及密钥至openvpn
cp /opt/easy-rsa/pki/ca.crt /etc/openvpn/
cp /opt/easy-rsa/pki/issued/server.crt /etc/openvpn/
cp /opt/easy-rsa/pki/private/server.key /etc/openvpn/
cp /opt/easy-rsa/pki/dh.pem /etc/openvpn/
启动openvpn server服务
[root@ovpn ~]# systemctl start openvpn@server
[root@ovpn ~]# systemctl enable openvpn@server
检查是否启动
[root@ovpn ~]# ss -antul|grep 1194
udp UNCONN 0 0 *:1194 *:*
[root@ovpn ~]#
查看创建的虚拟网卡
[root@ovpn ~]# ip a |grep tun0
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
开启内核数据包转发功能
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p #生效
10.0.0.1安装windows openvpn客户端,并配置
将刚生成的client证书及密钥等相关文件复制至windows openvpn客户端安装目录D:\Program Files\OpenVPN\config下面
ca.crt
client.crt
client.key
新建客户端配置文件 D:\Program Files\OpenVPN\config\client.ovpn
client #指定当前VPN是客户端
dev tun #使用tun隧道传输协议
proto udp #使用udp协议传输数据
remote 10.0.0.201 1194 #openvpn服务器IP地址端口号
resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下非常有用
nobind #不绑定本地特定的端口号
ca ca.crt #指定CA证书的文件路径
cert client.crt #指定当前客户端的证书文件路径
key client.key #指定当前客户端的私钥文件路径
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
至此openvpn服务端与客户端配置完毕,运行windows客户端exe文件,直连服务端即可。
openvpn客户端与服务端已建立连接,已建立专用网络隧道,通过客户端去访问openvpn服务器所在的内网其他服务器172.16.1.41
当外网访问172.16.1.41内网服务器时,请求数据包通过openvpn server能够进来,但是没有响应数据回应,是因为内网服务器找不到外网服务器IP,需要给内网服务器指明一条路去寻找。
二种方法:
1、内网服务器设置添加一条路由,凡是访问10.8.0.0节点找网关服务器172.16.1.201(openvpn server的内网IP)
[root@backup ~]# route add -net 10.8.0.0/24 gw 172.16.1.201
2、将内网服务器的eth1网关设置为172.16.1.201
测试
从10.0.0.1windows命令行ping 172.16.1.41内网服务器