OpenVPN 搭建部署--实现外网访问内网

环境准备:

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内网服务器
上一篇:使用curl+openssl实现单项身份验证


下一篇:Python 使用pip或easy_install或手动安装库/模块/软件包