centos7 搭建openvpn服务器

2018/11/10 21:26
阅读数 90

openvpn --daemon --cd /etc/openvpn --config client.ovpn --log-append /var/log/openvpn.log --askpass /etc/openvpn/myvpn.pass   //拨号

 OpenVPN是一个开源代码的VPN应用程序,可让您在公共互联网上安全地创建和加入专用网络。相比pptp,openvpn更稳定、安全。

  本篇博客主要介绍下面两点:

  1. Centos 7下安装与配置OpenVPN;

  2. 客户端连接OpenVPN服务器(window 、Ubuntu、 Ios、 Android)
Prerequisites

  1. 公网服务器IP或者国外VPS及root权限;

  2. 由于OpenVPN在默认的CentOS软件库中不可用,需要安装EPEL;

yum install epel-release

1.安装OpenVPN

yum install openvpn easy-rsa -y

2. 配置OpenVPN

OpenVPN在其文档目录中有示例配置文件,拷贝该示例配置文件到配置目录

 cp /usr/share/doc/openvpn-2.4.6/sample/sample-config-files/server.conf /etc/openvpn/

编辑配置文件

vim /etc/openvpn/server.conf

    #定义openvpn使用端口
    port 1194
     
    # TCP or UDP server?
    #通过tcp协议连接,也可以使用udp协议
    proto tcp
    #proto udp
     
    #定义openvpn运行模式,openvpn有两种运行模式一种是tap模式的以太网通道,一种是tun模式的路由 IP 通道。
    ;dev tap
    dev tun
     
    #openvpn使用的CA证书文件,CA证书主要用于验证客户证书的合法性,存放位置请依据实际情况自行改动
    ca /etc/openvpn/easy-rsa/pki/ca.crt
     
    #openvpn服务器端使用的证书文件,存放位置请依据实际情况自行改动
    cert /etc/openvpn/easy-rsa/pki/issued/server.crt
     
    #服务器密钥存放位置,请依据实际情况自行改动
    key /etc/openvpn/easy-rsa/pki/private/server.key
     
    #Diffie hellman文件,存放位置请依据实际情况自行改动
    dh /etc/openvpn/easy-rsa/pki/dh.pem
     
    #openvpn在使用tun路由模式时,分配给client端分配的IP地址段,虚拟局域网网段设置,请依据须要自行改动,不支持和拔号网卡位于同一网段
    server 10.8.1.0 255.255.255.0
     
    #在openvpn重新启动时,再次连接的client将依旧被分配和曾经一样的IP地址
    ifconfig-pool-persist ipp.txt
     
    # 为客户端创建对应的路由,以另其通达公司网内部服务器,但记住,公司网内部服务器也需要有可用路由返回到客户端
    push "route 172.17.0.0 255.255.240.0"
    push "route 172.16.1.0 255.255.255.0"
    push "route 172.16.2.0 255.255.255.0"
     
    #向客户端推送的DNS信息,DNS配置,依据实际情况配置
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 114.114.114.114"
     
    #活动连接保时期限
    keepalive 10 120
     
    tls-auth /etc/openvpn/ta.key 0
     
    cipher AES-256-CBC
     
    comp-lzo
     
    max-clients 100
     
    user nobody
    group nobody
     
    persist-key
    persist-tun
     
    status openvpn-status.log
    log-append  openvpn.log
    verb 3
    mute 20

服务器端配置文件演示样例:(server.conf)

    #openvpn服务端网卡的IP,也能够不写
    #local 192.168.3.1     
     
    #定义openvpn使用端口
    port 443    
     
    #通过tcp协议连接,也可以使用udp协议              
    proto tcp
    #proto udp     
     
    #定义openvpn运行模式,openvpn有两种运行模式一种是tap模式的以太网通道,一种是tun模式的路由 IP 通道。
    # 路由 IP 容易控制,所以推荐使用它;但如果如 IPX 等必须
    # 使用第二层才能通过的通讯,则可以用 tap 方式,tap 也
    # 就是以太网桥接              
    dev tun                      
     
    #openvpn使用的CA证书文件,CA证书主要用于验证客户证书的合法性,存放位置请依据实际情况自行改动
    ca ca.crt  
     
    #openvpn服务器端使用的证书文件,存放位置请依据实际情况自行改动                
    cert server.crt  
             
    #服务器密钥存放位置,请依据实际情况自行改动
    key server.key           
     
    #Diffie hellman文件,存放位置请依据实际情况自行改动
    dh dh1024.pem      
     
    #openvpn在使用tun路由模式时,分配给client端分配的IP地址段
    # 配置 VPN 使用的网段,OpenVPN 会自动提供基于该网段的 DHCP
    # 服务,但不能和任何一方的局域网段重复,保证唯一
    # server 端 ip 默认会设为.1 的地址。
    server 10.8.0.0 255.255.255.0     
     
    #在openvpn重新启动时,再次连接的client将依旧被分配和曾经一样的IP地址
    ifconfig-pool-persist ipp.txt
     
    #向客户端推送的路由信息,假如客户端的IP地址为10.8.0.2,要访问172.17.48.0网段的话,使用这条命令就可以了。
    # 为客户端创建对应的路由,以另其通达公司网内部服务器,但记住,公司网内部服务器也需要有可用路由返回到客户端,公司内网有几个网段就推送几个
    push "route 172.17.48.0 255.255.240.0"
    push "route 172.16.1.0 255.255.255.0"
    push "route 172.16.2.0 255.255.255.0"  
                 
    #这条命令可以重定向客户端的网关,在进行FQ时会使用,开启此选项客户端出口ip会成为openvpn服务器IP
    #此项不要开启,会改变客户端出口IP,导致客户端无法正常访问网络
    #push "redirect-gateway def1 bypass-dhcp"    
     
    #向客户端推送的DNS信息,DNS配置,依据实际情况配置
    push "dhcp-option DNS 8.8.8.8"   
     
    #向客户端推送的DNS信息,DNS配置,依据实际情况配置   
    push "dhcp-option DNS 114.114.114.114"      
     
    #活动连接保时期限,设置服务端检测的间隔和超时时间 每 10 秒 ping 一次,如果 120 秒没有回应则认为对方已经 down
    keepalive 10 120    
     
    #使客户端能相互訪问                         
    client-to-client  
     
    #这条经常使用于測试用途,凝视该条可实现限制一个证书在同一时刻仅仅能有一个client接入           
    duplicate-cn      
     
    #选择一种加密算法与client保持一致         
    cipher AES-256-CBC
     
    ;cipher BF-CBC        # Blowfish (default)      //选择一种加密算法与client保持一致
    ;cipher AES-128-CBC  # AES
    ;cipher DES-EDE3-CBC  # Triple-DES
     
    #启用允许数据压缩,客户端配置文件也需要有这项。
    comp-lzo                          
     
    #最大客户端并发连接数量
    ;max-clients 100            
     
    #定义执行openvpn的用户用于用户认证能够不採用用户认证
    ;user nobody                   
    ;group nobody
     
    #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
    persist-key  
     
    #通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的。否则网络连接,会先linkdown然后再linkup。
    persist-tap   
     
    #定期把openvpn的一些状态信息写到文件里,以便自己敲代码计费或者进行其它操作
    status openvpn-status.log
     
    log /etc/openvpn/openvpn.log
     
    log-append /etc/openvpn/openvpnappend.log
     
    #设置日志记录冗长级别#设置日志要记录的级别。
    #0 只记录错误信息。
    #4 能记录普通的信息。
    #5 和 6 在连接出现问题时能帮助调试
    #9 是极端的,所有信息都会显示,甚至连包头等信息都显示(像 tcpdump)
    verb 3  
     
    #反复日志记录限额            
    mute 20      
     
    #此选项开启只能使用udp协议。Options error: --explicit-exit-notify can only be used with --proto udp
    explicit-exit-notify 1                            

客户端文件演示样例:(client.ovpn)

    client
    dev tun
    proto tcp
    resolv-retry infinite
    nobind
    remote 115.159.56.240 1194
    remote-cert-tls server
    #ns-cert-type server
    #需与服务端保持一致
    comp-lzo
    #需与服务端保持一致  
    verb 3
    #需与服务端保持一致
    cipher AES-256-CBC
    #需与服务端保持一致
    keepalive 10 120
    #需与服务端保持一致
    persist-key
    #需与服务端保持一致
    persist-tun
     
    tls-auth ta.key 1
    ca ca.crt
    cert testname.crt
    key testname.key
    log-append testname.log
    status testname-status.log

3、配置证书文件

mkdir -p  /etc/openvpn/easy-rsa/keys

    cp -rf /usr/share/easy-rsa/3.0.3/* /etc/openvpn/easy-rsa/
    cp /usr/share/doc/easy-rsa-3.0.3/vars.example /etc/openvpn/easy-rsa/
     
    cp vars.example vars

vi   /etc/openvpn/easy-rsa/vars

修改以下配置的内容,自定义设置各项值就可以。

    set_var EASYRSA    "$PWD"
    set_var EASYRSA_PKI        "$EASYRSA/pki"
    set_var EASYRSA_DN    "cn_only"
     
    set_var EASYRSA_REQ_COUNTRY    "CN"
    set_var EASYRSA_REQ_PROVINCE    "SH"
    set_var EASYRSA_REQ_CITY    "Shanghai"
    set_var EASYRSA_REQ_ORG    "DMSD Certificate"
    set_var EASYRSA_REQ_EMAIL    "767958941@qq.com"
    set_var EASYRSA_REQ_OU        "Dynamic Times"
     
    set_var EASYRSA_KEY_SIZE    2048
    set_var EASYRSA_ALGO        rsa
    set_var EASYRSA_CA_EXPIRE    3650
    set_var EASYRSA_CERT_EXPIRE    3650
    set_var EASYRSA_NS_SUPPORT    "no"
    set_var EASYRSA_NS_COMMENT    "Easy-RSA Generated Certificate"
    set_var EASYRSA_EXT_DIR    "$EASYRSA/x509-types"
    set_var EASYRSA_SSL_CONF    "$EASYRSA/openssl-1.0.cnf"
    set_var EASYRSA_DIGEST        "sha256"

服务端vars文件配置详解:(vars)

    #定义key的生成目录
    set_var EASYRSA_PKI    "$EASYRSA/pki"
     
    #定义生成私钥的大小,一般为1024或2048,默认为2048位。这个就是我们在执行build-dh命令生成dh2048文件的依据。
    set_var EASYRSA_KEY_SIZE 2048
     
    set_var EASYRSA_ALGO rsa
     
    #ca证书有效期,默认为3650天,即十年            
    set_var EASYRSA_CA_EXPIRE 3650
     
    #定义秘钥的有效期,默认为3650天,即十年             
    set_var EASYRSA_CERT_EXPIRE    3650   
     
    #定义所在的国家       
    set_var EASYRSA_REQ_COUNTRY "CN"  
     
    #定义所在的省         
    set_var EASYRSA_REQ_PROVINCE "BJ"      
     
    #定义所在的城市    
    set_var EASYRSA_REQ_CITY "BeiJing"
     
    #定义所在的组织        
    set_var EASYRSA_REQ_ORG "xxxx"  
     
    #定义邮箱           
    set_var EASYRSA_REQ_EMAIL "xxxx@xx.com"  
     
    #定义所在单位  
    set_var EASYRSA_REQ_OU "xxxx"       

4.证书创建

  4.1创建根证书ca.rt

    cd /etc/openvpn/easy-rsa/
     
    ## 初始化,会在当前目录创建PKI目录,用于存储一些中间变量及最终生成的证书
    ./easyrsa init-pki
     
    # 创建根证书
    ./easyrsa build-ca
     
    创建根证书,首先会提示设置密码,用于ca对之后生成的server和client证书签名时使用,然后会提示设置Country Name,State or Province Name,Locality Name,Organization Name,Organizational Unit Name,Common Name,Email Address,可以键入回车使用默认的,也可以手动更改
     
    设置ca密码(输入两次):ca.com

会生成根证书:ca.crt,路径如下:

/etc/openvpn/easy-rsa/pki/ca.crt

 

 4.2 创建ta.key

    [root@VM_0_4_centos easy-rsa]# ./easyrsa gen-dh
     
    Note: using Easy-RSA configuration from: ./vars
    Generating DH parameters, 2048 bit long safe prime, generator 2
    This is going to take a long time
    ...............................................................................................................................................+...........+...................................+.........................................+...................................................................+..................................................................................+..............................................................................................................+.....................................................................................................................................................+..................................................................................................................................+..................................................................................................................................................................................................................+...........................+.........................................................................+..........................................................................................................................................................................+.........+..........................+..................................................................................................................................................................................................+............................................................................................................................+...............................................+................................+..........................................................................................+.......................+............................................................................................................................+...........+..................................................+......................................+.........................................................................................................................................+...........................................................................................................+.........................................................................................+.........+............................................+..........................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................+..............+.................................................................................................................+..........................................................................................................................................................+....................................................+...........................+...........+........................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................+.............................................+.................+......................+..........................+.........................................................................................................................................................................................................................................................................+.................................................................................................................................++*++*
     
    DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem
     
    [root@VM_0_4_centos easy-rsa]# openvpn --genkey --secret ta.key
    [root@VM_0_4_centos easy-rsa]# cp -r ta.key /etc/openvpn/

 

4.3 创建服务端证书

创建服务端证书,生成请求,使用gen-req来生成req,创建server端证书和private key,可以使用nopass表示不加密private key,然后会提示设置Country Name,State or Province Name,Locality Name,Organization Name,Organizational Unit Name,Common Name,Email Address,可以键入回车使用默认的,也可以手动更改

    ./easyrsa  gen-req server
     
    设置server密码(输入两次):openserver.com

会生成服务端证书:server.req和server.key,路径如下:

/etc/openvpn/easy-rsa/pki/private/server.key

/etc/openvpn/easy-rsa/pki/reqs/server.req

 

4.4 签发服务端证书

签发证书,签约服务端证书,给server端证书做签名,首先是对一些信息的确认,可以输入yes,然后输入build-ca时设置的那个密码

    [root@VM_0_4_centos easy-rsa]# ./easyrsa sign-req server server
     

生成服务端签名证书:server.crt,路径如下:

/etc/openvpn/easy-rsa/pki/issued/server.crt

至此服务端证书全部生成完毕,分别为:server.req、server.key和server.crt。

/etc/openvpn/easy-rsa/pki/private/server.key

/etc/openvpn/easy-rsa/pki/reqs/server.req

/etc/openvpn/easy-rsa/pki/issued/server.crt

4.5 生成客户端用户证书

    # 例如:生成客户端用户:testname 的证书
    [root@VM_0_4_centos easy-rsa]# ./easyrsa build-client-full testname

生成客户端证书,并设置密码(客户端连接时用)

生成客户端用户签名证书:

/etc/openvpn/easy-rsa/pki/issued/testname.crt

/etc/openvpn/easy-rsa/pki/private/tesstname.key

/etc/openvpn/easy-rsa/pki/reqs/testname.req

5.启动openvpn服务

    systemctl start openvpn@server
    启动时输入服务端证书密码:openserver.com

systemctl stop openvpn@server  // 停用
systemctl start openvpn@server  //启用

6.添加路由策略

添加一条SNAT规则,让源地址是10.8.1.0/24网段的地址进来转换成vpn服务器的内网地址(例如:172.16.0.100,此IP内网未使用),这样vpn客户端访问公司内网服务器的时候伪装成vpn服务器去访问.

    iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -j SNAT --to-source 172.16.0.100
    firewall-cmd --reload

目的:伪装成内网IP,正常访问内网的各台机器。

 

7.客户端配置

客户端下载openvpn版本2.4.5

上官网下载Windows客户端:https://openvpn.net/index.php/open-source/downloads.html

客户端需要的证书:

testname.crt、testname.key、ca.crt、ta.key

客户端配置config.ovpn说明:(ip换为openvpn服务器外网ip)

    client
    dev tun
    proto tcp
    resolv-retry infinite
    nobind
    remote 115.159.56.240 1194
    remote-cert-tls server
    #ns-cert-type server
    #需与服务端保持一致
    comp-lzo
    #需与服务端保持一致  
    verb 3
    #需与服务端保持一致
    cipher AES-256-CBC
    #需与服务端保持一致
    keepalive 10 120
    #需与服务端保持一致
    persist-key
    #需与服务端保持一致
    persist-tun
     
    tls-auth ta.key 1
    ca ca.crt
    cert testname.crt
    key testname.key
    log-append testname.log
    status testname-status.log

安装OpenVPN 2.4.5 x86_64后,清空config文件夹,将testname.crt、testname.key、ca.crt、ta.key、testname.ovpn放入config目录中,
配置完成后启动,如果有设置密码的话输入密码即可。

然后连接openvpn,点击运行 选 Connect  ,如果出现绿色图标说明vpn连接成功了.

连接成功后会启一个网络连接,可以看到分配的ip地址是10.8.1.6 / 30

客户端会添加路由,可以看下路由表,下面这些是服务端配置推送给客户端的路由,其实就是告诉客户端去这些网段都通过vpn服务器,类似于静态路由

route PRINT -4

测试,ping下公司内网中的主机,看下是否能够访问,如果可以说明ok了,我公司内网某台机器IP: 172.17.0.4

ping 172.17.0.4

OK,说明能如在公司内网一样访问各台机器了。

如内网的web服务,也可通过内网地址连接数据库、redis等各种服务

数据包的走向是:客户端访问公司内网主机 ----- 通过路由转发 ---- vpn服务器(tun0) ---- SNAT -----  公司内网主机

 

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE            防火墙上做转发

 

 

在Centos6上允许ip转发只需要在 /etc/sysctl.conf里加入

net.ipv4.ip_forward = 1 

即可(reboot或用sysctl -p立即生效)

可在Centos7里这样是远远不够的。

这也导致了我在Centos7上,无论配pptp还是openvpn,都只能是正常连上服务,却不能正常上网。

确定了服务配置的没有问题后,基本锁定是转发的问题了,在网上查解决方案,恶心的百度能看到只是一些乱七八糟、没有什么水平的博客

google搜索第一页能找到我要的答案。如下:

in my installation of Centos 7:

cat /etc/sysctl.conf

System default settings live in /usr/lib/sysctl.d/00-system.conf. To override those settings, enter new settings here, or in an /etc/sysctl.d/.conf file For more information, see sysctl.conf(5) and sysctl.d(5).
so, you should add into the file

/usr/lib/sysctl.d/50-default.conf

也就是说,只需要再在 /usr/lib/sysctl.d/50-default.conf 文件里加入

net.ipv4.ip_forward = 1 

就可以了。

 


 
---------------------
作者:杨仕金
来源:CSDN
原文:https://blog.csdn.net/weixin_42231507/article/details/81387448
版权声明:本文为博主原创文章,转载请附上博文链接!

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部