CentOS 7 搭建OpenVPN服务器

2023年 5月 4日 39.4k 0

鉴于春节假期,大家方便在家进行值守,所以临时整理了一份openvpn文档,分享给大家。文章主要介绍在CentOS 7 服务器上安装与配置OpenVPN服务器,以及如何编写客户端连接到新建立的OpenVPN服务器上所需的配置文件。

OpenVPN 设置账号密码登录

新闻联播老司机

  • 20年2月4日
  • 喜欢:0
  • 浏览:30.8k
  • OpenVPN的工作原理

    在Linux2.4版本以上,操作系统支持一个名为tun的设备,tun设备的驱动程序中包含两个部分,一部分是字符设备驱动,一部分是网卡驱动。网卡的驱动把从TCP/IP协议栈收到的数据包结构skb放于tun设备的读取队列,用户进程通过调用字符设备接口read获得完整的IP数据包,字符驱动read函数的功能是从设备的读取队列读取数据,将核心态的skb传递给用户;反过来字符驱动write函数给用户提供了把用户态的数据写入核心态的接口,write函数把用户数据写入核心空间并穿入TCP/IP协议栈。该设备既能以字符设备的方式被读写,作为系统的虚拟网卡,也具有和物理网卡相同的特点:能够配置IP地址和路由。对虚拟网卡的使用是OpenVPN实现其SSL VPN功能的关键。
    OpenVPN服务器一般需要配置一个虚拟IP地址池和一个自用的静态虚拟IP地址(静态地址和地址池必须在同一个子网中),然后为每一个成功建立SSL连接的客户端动态分配一个虚拟IP地址池中未分配的地址。这样,物理网络中的客户端和OpenVPN服务器就连接成一个虚拟网络上的星型结构局域网,OpenVPN服务器成为每个客户端在虚拟网络上的网关。OpenVPN服务器同时提供对客户端虚拟网卡的路由管理。当客户端对OpenVPN服务器后端的应用服务器的任何访问时,数据包都会经过路由流经虚拟网卡,OpenVPN程序在虚拟网卡上截获数据IP报文,然后使用SSL协议将这些IP报文封装起来,再经过物理网卡发送出去。OpenVPN的服务器和客户端在虚拟网卡之上建立起一个虚拟的局域网络,这个虚拟的局域网对系统的用户来说是透明的。
    OpenVPN的服务器和客户端支持tcp和udp两种连接方式,只需在服务端和客户端预先定义好使用的连接方式(tcp或udp)和端口号,客户端和服务端在这个连接的基础上进行SSL握手。连接过程包括SSL的握手以及虚拟网络上的管理信息,OpenVPN将虚拟网上的网段、地址、路由发送给客户端。连接成功后,客户端和服务端建立起SSL安全连接,客户端和服务端的数据都流入虚拟网卡做SSL的处理,再在tcp或udp的连接上从物理网卡发送出去

    环境说明

    192.168.0.10外网     10.4.82.10 内网
    
    系统环境
    [root@vpn ~]# cat /etc/redhat-release 
    CentOS Linux release 7.7.1908 (Core)
    [root@vpn ~]# uname -r
    3.10.0-1062.9.1.el7.x86_64
    
    网卡为双网卡
    [root@vpn ~]# ifconfig 
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.0.11  netmask 255.255.255.0  broadcast 192.168.0.255
            inet6 fe80::6b5a:9ab8:1bb:5f8d  prefixlen 64  scopeid 0x20
            ether 00:0c:29:32:b2:36  txqueuelen 1000  (Ethernet)
            RX packets 15104  bytes 16993218 (16.2 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8661  bytes 889872 (869.0 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 10.4.82.11  netmask 255.255.255.0  broadcast 10.4.82.255
            inet6 fe80::20c:29ff:fe32:b240  prefixlen 64  scopeid 0x20
            ether 00:0c:29:32:b2:40  txqueuelen 1000  (Ethernet)
            RX packets 202  bytes 18735 (18.2 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8  bytes 656 (656.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    首先我们先使用easy-rsa制作openVPN证书
    下载并解压easy-rsa软件包

    mkdir /data/tools -p 
    wget -P /data/tools http://down.i4t.com/easy-rsa.zip
    unzip -d /usr/local /data/tools/easy-rsa.zip
    

    在开始制作CA证书之前,我们还需要编辑vars文件,修改如下相关选项

    cd /usr/local/easy-rsa-old-master/easy-rsa/2.0/
    
    vim vars
    export KEY_COUNTRY="cn"
    export KEY_PROVINCE="BJ"
    export KEY_CITY="BJ"
    export KEY_ORG="abcdocker"
    export KEY_EMAIL="cyh@i4t.com"
    export KEY_CN=abc
    export KEY_NAME=abc
    export KEY_OU=abc
    
    #行数大约67行开始,主要是修改默认的注册信息,比如注册公司、公司名称、部门、国家城市等
    

    注意:以上内容,我们也可以使用系统默认的,也就是说不进行修改也是可以使用的
    然后使用使环境变量生效

    #初始化环境边看
    source vars
    ./clean-all
    
    #注意:执行clean-all命令会在当前目录下创建一个名词为keys的目录
    

    接下来开始正式制作CA证书,命令如下

    ./build-ca
    
    # 生成根证书ca.crt和根密钥ca.key
    #因为在vars中填写了证书的基本信息,所以这里一路回车即可
    

    这时我们可以查看keys目录,已经帮我们生成ca.crt和ca.key两个文件,其中ca.crt就是我们的证书文件

    [root@abc01 2.0]# ls keys
    ca.crt  ca.key  index.txt  serial
    

    制作Server端证书

    为服务端生成证书和密钥

    #一直回车,2个Y
    
    [root@abc01 2.0]# ./build-key-server server
    ....
    An optional company name []:
    Using configuration from /usr/local/easy-rsa-old-master/easy-rsa/2.0/openssl-1.0.0.cnf
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    countryName           :PRINTABLE:'cn'
    stateOrProvinceName   :PRINTABLE:'BJ'
    localityName          :PRINTABLE:'BJ'
    organizationName      :PRINTABLE:'abcdocker'
    organizationalUnitName:PRINTABLE:'abc'
    commonName            :PRINTABLE:'abc'
    name                  :PRINTABLE:'abc'
    emailAddress          :IA5STRING:'cyh@i4t.com'
    Certificate is to be certified until Jan 31 14:01:35 2030 GMT (3650 days)
    Sign the certificate? [y/n]:y
    
    
    1 out of 1 certificate requests certified, commit? [y/n]y
    Write out database with 1 new entries
    Data Base Updated
    
    #这里的server就是我们server端的证书 
    

    查看新生成的证书

    [root@abc01 2.0]# ls keys
    01.pem   abc.key  index.txt       serial
    server.crt  ca.crt   index.txt.attr  serial.old
    server.csr  ca.key   index.txt.old
    

    这里我们已经生成了server.crt、server.key、server.csr三个文件,其中server.crt和server.key两个文件是我们需要使用的

    制作Client端证书

    这里我们创建2个用户,分别为client1和client2

    #每一个登陆的VPN客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接,下面建立2份
    #为客户端生成证书和密钥(一路按回车,直到提示需要输入y/n时,输入y再按回车,一共两次)
    ./build-key client1
    ./build-key client2
    

    每一个登陆的VPN客户端需要有一个证书,每个证书在同一时刻只可以一个客户端连接(可以修改配置文件)
    现在为服务器生成加密交换时的Diffie-Hellman文件

    ./build-dh
    # 创建迪菲·赫尔曼密钥,会生成dh2048.pem文件(生成过程比较慢,在此期间不要去中断它)
    

    证书生成完毕

    [root@abc01 2.0]# ll keys
    total 84
    -rw-r--r-- 1 root root 7997 Feb  3 09:01 01.pem
    -rw-r--r-- 1 root root 7880 Feb  3 09:09 02.pem
    -rw-r--r-- 1 root root 7997 Feb  3 09:01 abc.crt
    -rw-r--r-- 1 root root 1765 Feb  3 09:01 abc.csr
    -rw------- 1 root root 3272 Feb  3 09:01 abc.key
    -rw-r--r-- 1 root root 2293 Feb  3 09:01 ca.crt
    -rw------- 1 root root 3272 Feb  3 09:01 ca.key
    -rw-r--r-- 1 root root  424 Feb  3 09:06 dh2048.pem
    -rw-r--r-- 1 root root  211 Feb  3 09:09 index.txt
    -rw-r--r-- 1 root root   21 Feb  3 09:09 index.txt.attr
    -rw-r--r-- 1 root root   21 Feb  3 09:01 index.txt.attr.old
    -rw-r--r-- 1 root root  105 Feb  3 09:01 index.txt.old
    -rw-r--r-- 1 root root    3 Feb  3 09:09 serial
    -rw-r--r-- 1 root root    3 Feb  3 09:01 serial.old
    -rw-r--r-- 1 root root 7880 Feb  3 09:09 test.crt
    -rw-r--r-- 1 root root 1765 Feb  3 09:09 test.csr
    -rw------- 1 root root 3272 Feb  3 09:09 test.key
    

    其中包含了一个test用户和abc用户的证书
    其中只有.crt和.key文件是我们需要使用的

    安装OpenVPN

    安装vpn的方法有2种,一种是使用yum安装,另外一种是编译安装。这两个我们选择一个就可以
    编译安装

    #安装依赖包
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum makecache
    yum install -y lzo lzo-devel openssl openssl-devel pam pam-devel net-tools git lz4-devel
    
    
    #下载openVPN软件包
    wget -P /data/tools http://down.i4t.com/openvpn-2.4.7.tar.gz
    cd /data/tools
    
    #安装openVPN
    tar zxf openvpn-2.4.7.tar.gz
    cd openvpn-2.4.7
    ./configure --prefix=/usr/local/openvpn-2.4.7
    make
    make install
    
    # 创建软连接
    ln -s /usr/local/openvpn-2.4.7 /usr/local/openvpn
    

    yum安装
    OpenVPN需要安装EPEL

    curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum clean all && yum makecache
    

    yum 安装openVPN

    yum install -y openvpn
    

    配置OpenVPN服务端

    我们需要创建openVPN文件目录和证书目录

    # openVPN配置文件目录,yum安装默认存在
    mkdir /etc/openvpn
    
    #openvpn证书目录
    mkdir /etc/openvpn/keys
    

    生成tls-auth key并将其拷贝到证书目录中(防DDos攻击、UDP淹没等恶意攻击)

    #编译安装执行此句
    /usr/local/openvpn/sbin/openvpn --genkey --secret ta.key
    
    # yum安装执行此句
    openvpn --genkey --secret ta.key
    
    #将本地的ta.key移动到openVPN证书目录
    mv ./ta.key /etc/openvpn/keys/
    

    将我们上面生成的CA证书和服务端证书拷贝到证书目录中

    $ cp /usr/local/easy-rsa-old-master/easy-rsa/2.0/keys/{server.crt,server.key,ca.crt,dh2048.pem} /etc/openvpn/keys/
    
    [root@k8s-01 ~]# ll /etc/openvpn/keys/
    total 24
    -rw-r--r-- 1 root root 2342 Feb  3 12:48 ca.crt
    -rw-r--r-- 1 root root  424 Feb  3 12:48 dh2048.pem
    -rw-r--r-- 1 root root 8089 Feb  3 12:48 server.crt
    -rw------- 1 root root 3272 Feb  3 12:48 server.key
    -rw------- 1 root root  636 Feb  3 12:47 ta.key
    
    
    #abc和test为我们client端用户的证书
    

    拷贝OpenVPN配置文件

    # 编译安装
    cp /data/tools/openvpn-2.4.7/sample/sample-config-files/server.conf /etc/openvpn/
    
    # yum安装
    cp /usr/share/doc/openvpn-2.4.7/sample/sample-config-files/server.conf /etc/openvpn/
    

    接下来我们来配置服务端的配置文件

    $ cat /etc/openvpn/server.conf 
    port 1194       #openVPN端口
    proto tcp       #tcp连接
    dev tun         #生成tun0虚拟网卡
    
    ca keys/ca.crt      #相关证书配置路径(可以修改为全路径/etc/openvpn/keys)
    cert keys/server.crt
    key keys/server.key  # This file should be kept secret
    dh keys/dh2048.pem
    
    server 10.4.82.0 255.255.255.0   #默认虚拟局域网网段,不要和实际的局域网冲突就可以
    ifconfig-pool-persist ipp.txt     
    
    push "route 10.4.82.0 255.255.255.0"    #可以通过iptables进行路由的转发
    client-to-client                 #如果客户端都是用一个证书和密钥连接VPN,需要打开这个选项
    duplicate-cn
    keepalive 10 120
    tls-auth keys/ta.key 0 # This file is secret
    comp-lzo
    
    persist-key
    persist-tun
    
    status openvpn-status.log   #状态日志路径
    log-append  openvpn.log     #运行日志
    verb 3                      #调试信息级别
    
    
    
    #如果需要接入ldap,需要在server.conf下添加如下2行
    plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf cn=%u"
    client-cert-not-required
    
    #如何环境和我相同,可以直接cp我的配置文件
    

    开启内核路由转发功能

    echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
    sysctl -p
    

    如果有iptables可以开启iptables策略

    iptables -P FORWARD ACCEPT
    iptables -I INPUT -p tcp --dport 1194 -m comment --comment "openvpn" -j ACCEPT
    iptables -t nat -A POSTROUTING -s 10.4.82.0/24 -j MASQUERADE
    

    启动openvpn服务

    $ cd /etc/openvpn/
    $ /usr/local/openvpn/sbin/openvpn --daemon --config /etc/openvpn/server.conf
    

    检查服务

    $ netstat -lntup|grep 1194
    tcp        0      0 0.0.0.0:1194            0.0.0.0:*               LISTEN      48091/openvpn       
    

    设置开机启动

    echo "/usr/local/openvpn/sbin/openvpn --daemon --config /etc/openvpn/server.conf > /dev/null 2>&1 &" >> /etc/rc.local
    

    客户端连接测试

    无论我们是在Windows还是Linux OS上Client端的配置,都需要将Client证书、CA证书以及Client配置文件下载下来
    现在我们需要先配置一下client.conf

    cp /data/tools/openvpn-2.4.7/sample/sample-config-files/client.conf /root/
    
    #修改如下,并将client.conf修改为client.ovpn
    $ cat /root/client.conf
    client
    dev tun
    proto tcp
    remote 192.168.0.10 1194    #openvpn服务器的外网IP和端口(可以写多个做到高可用)
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    cert client1.crt         #用户的证书
    key client1.key
    
    tls-auth ta.key 1
    cipher AES-256-CBC
    comp-lzo
    verb 3
    
    
    #比较重点的就是修改remote 地址,这里的地址为server
    cert key,我们这里使用用户的证书,所以证书也应当修改为client1.crt和client1.key
    tls-auth 因为使用加密协议,所以ta.key也需要下载下来
    

    修改后缀并导出

    [root@vpn ~]# mv client.conf client.ovpn
    [root@vpn ~]# sz client.ovpn 
    
    #同时还需要导出几个证书
    mv client.conf client.ovpn
    sz /root/client.ovpn
    sz /etc/openvpn/keys/ca.crt 
    sz /etc/openvpn/keys/ta.key 
    sz /usr/local/easy-rsa-old-master/easy-rsa/2.0/keys/client1.crt 
    sz /usr/local/easy-rsa-old-master/easy-rsa/2.0/keys/client1.key 
    

    添加用户
    以后我们如果想添加用户只需要到cd /usr/local/easy-rsa-old-master/easy-rsa/2.0目录下执行./build-key 用户名,在将keys目录下生成的用户名.crt和key导出,修改一下client.ovpn的用户key名称即可
    Windows
    客户端需要证书如下
    image_1e064adis8tfhpj1mh91pk132s55.png-99.3kB
    Windows客户端下载
    http://down.i4t.com/openvpn-install-2.4.7-I606-Win10.exe
    http://down.i4t.com/openvpn-install-2.4.7-I606-Win7.exe
    打开浏览器即可下载
    安装步骤,直接C盘就可以了,文件很小~
    image_1e05q54uh1802svu1fcm1o6ajb21g.png-39.2kB
    疯狂下一步即可
    image_1e05q5oaj1h341n1g1sl6ail1ca71t.png-43.1kB
    安装完成后
    image_1e05q7f9enl11dj45relri1hbd2a.png-6.9kB
    接下来我们需要替换一下证书
    点击桌面的logo,右击属性
    image_1e05q8lnd1ibj5prl6515rn1v712n.png-40.3kB
    点击打开文件位置
    image_1e05q9a2urlg1meurun52ihg134.png-36.3kB
    点击上方OpenVPN从新选择目录
    image_1e05qaes7i3j1csha599jikq3h.png-109.9kB
    选择config目录
    image_1e05qb5c818ea1tpcqb912scmp83u.png-107.9kB
    将config目录下文件全部删除
    image_1e05qccgijf76vd1oq413aj1s4t4b.png-84.5kB
    然后将我们导出的5个证书复制过去
    image_1e064adis8tfhpj1mh91pk132s55.png-99.3kB
    其中client1.*为client1用户的证书
    现在我们进行启动openvpn客户端,进行连接
    双击桌面OpenVPN
    右击图标,选择连接
    image_1e065eise5bh89a1gfh12oqn7k5v.png-4.9kB
    image_1e065dpuhsur1bktmu31ruj7im5i.png-10.6kB
    image_1e065fh3892b8g714nu19jv1crf6c.png-18.1kB
    这里可以看到已经连接成功
    image_1e0678fe812fq1hts19pa1jbcg6i9.png-68.1kB
    Mac
    复制链接到浏览器,下载软件包
    http://down.i4t.com/Tunnelblick_3.8.1_build_5400.dmg
    我们直接点开client.ovpn就可以自动链接
    image_1e067jo5h114mtnr1pij46jb0813.png-136.6kB
    image_1e067jsvo820r9p13atig2vtv1g.png-18.9kB
    成功后会有下面的流量图
    image_1e067jjr0qfrub6ans10ddm4nm.png-23.4kB
    配置文件打开方式
    image_1e067n5tt1d6bu071blus8m4fl1t.png-274.4kB
    这时候网络已经通了
    image_1e067r39fqav1bc88uqueot5d2a.png-69.3kB

    相关文章:

    1. Kubenetes 1.13.5 集群二进制安装
    2. Kubernetes 1.14 二进制集群安装
    3. Kuerbernetes 1.11 集群二进制安装
    4. 自动化运维工具之–Cobbler

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论