×

openVPN + VPP = openVPP

hqy hqy 发表于2023-01-09 10:20:44 浏览283 评论0

抢沙发发表评论

https://cdn.modb.pro/db/538461

我们设想这么一种场景,某公司总部设备VPP72使用专线接入互联网,具有公网IP地址;该公司分支设备VPP73使用普通网络,不具有公网IP地址,同时向总部设备建立穿越NAT设备的IPsec VPN隧道;同时有居家办公的员工使用openVPN接入公司网络,需要和分支的设备进行互通。

考虑到主要组件是openVPN和VPP,那我们姑且就将这种方案叫做openVPP方案吧!

openVPP的组网示意图和互访流量示意图如下:

这里面涉及的接口配置、IPsec配置、openVPN配置和NAT配置,我们前面都已经做过详细介绍,现在只要进行整合,即可实现网络互通。各部分配置如下:

VPP接口配置

我们计划使用VPP72的公网接口ETH1来接入openVPN用户,需要配置VPP和内核的互通给VPP增加一个接口(非DPDK方式),首先给eth1配置IP地址。

    vppctl set int state eth1 up
    vppctl set int ip address eth1 12.1.1.2/24

    在内核创建一个veth接口,一端命名为ethvpp,另一端命名为ethhost。

      ip link add name ethvpp type veth peer name ethhost

      然后使能veth两端的接口ethhost@ethvpp和ethvpp@ethhost。

        ip link set dev ethvpp up
        ip link set dev ethhost up

        接口UP起来之后,我们给内核中的ethhost接口分配一个IP地址。

          ip addr add 172.16.1.1/24 dev ethhost

          在VPP内也创建一个接口,来连接到ethvpp的主机接口。

            vppctl create host-interface name ethvpp

            然后手工使能接口host-ethvpp,并配置IP地址。

              vppctl set interface state host-ethvpp up
              vppctl set int ip address host-ethvpp 172.16.1.2/24

              然后从内核中测试一下172.16.1.2的连通性。

              openVPN配置

              首先在VPP72上同时安装openVPN和Easy-RSA巧用openVPN实现访问云资源池业务,把/usr/share/easy-rsa/3.0.8/这个目录复制到/etc/openvpn/,同时复制一个机构配置文件到easyrsa所在的路径下。

                yum install -y openvpn easy-rsa
                cp -r usr/share/easy-rsa/3.0.8/ etc/openvpn/easyrsa3/
                cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easyrsa3/vars

                修改vars文件中的机构信息字段,也可以直接添加。

                  set_var EASYRSA_REQ_COUNTRY     "CN"
                  set_var EASYRSA_REQ_PROVINCE    "Beijing"
                  set_var EASYRSA_REQ_CITY        "Haidian"
                  set_var EASYRSA_REQ_ORG         "TIETOU TECH"
                  set_var EASYRSA_REQ_EMAIL       "tietou@h3cadmin.cn"
                  set_var EASYRSA_REQ_OU          "Tietou openVPN"

                  切换到/etc/openvpn/easyrsa3/目录下,初始化PKI(Public Key Infrastructure,公钥基础设施)信息。使用Easy-RSA配置生成SSL证书

                    ./easyrsa init-pki

                    创建根证书,用于CA(Certificate Authority,证书颁发机构)对之后生成的server和client证书签名时使用。使用nopass参数,不对CA密钥进行加密,这样在签署证书时就可以跳过密码验证。

                      ./easyrsa build-ca nopass

                      创建服务器端证书,同样指定nopass参数,不对私钥进行加密。

                        ./easyrsa gen-req tiejunge nopass

                        给服务器端证书tiejunge进行签名。

                          ./easyrsa sign-req server tiejunge

                          然后创建Diffie-Hellman文件,也就是秘钥交换时的DH算法,确保密钥可以穿越不安全网络。生成时间比较长,请耐心等待生成结束。

                            ./easyrsa gen-dh

                            接下来创建客户端的证书,同样指定nopass参数表示不对私钥进行加密。

                              ./easyrsa gen-req tietouge nopass

                              给客户端证书tietouge进行签名。

                                ./easyrsa sign-req client tietouge

                                梳理一下生成的证书信息,把服务器端的必要文件(ca.crt、dh.pem、tiejunge.crt、tiejunge.key)复制到/etc/openvpn/server/目录下。

                                  cp /etc/openvpn/easyrsa3/pki/ca.crt /etc/openvpn/server/
                                  cp /etc/openvpn/easyrsa3/pki/dh.pem /etc/openvpn/server/
                                  cp /etc/openvpn/easyrsa3/pki/issued/tiejunge.crt /etc/openvpn/server/
                                  cp /etc/openvpn/easyrsa3/pki/private/tiejunge.key /etc/openvpn/server/

                                  把客户端的必要文件(ca.crt、tietouge.crt、tietouge.key)下载到本地。

                                  在/etc/openvpn/server/目录下新建一个openVPN的配置文件server.conf,配置文件内容如下:

                                    local 0.0.0.0
                                    proto tcp
                                    port 44331
                                    dev tun
                                    ca /etc/openvpn/server/ca.crt
                                    cert /etc/openvpn/server/tiejunge.crt
                                    key /etc/openvpn/server/tiejunge.key
                                    dh /etc/openvpn/server/dh.pem
                                    topology subnet
                                    server 10.153.214.0 255.255.255.0
                                    push "route 22.1.1.0 255.255.255.0"
                                    duplicate-cn
                                    keepalive 20 120
                                    persist-key
                                    persist-tun

                                    使能Linux的内核转发,并开启主机的NAT功能。

                                      echo 1 > /proc/sys/net/ipv4/ip_forward
                                      iptables -t nat -A POSTROUTING -o ethhost -j MASQUERADE

                                      创建openvpn服务的启动文件。

                                        vi /etc/systemd/system/openvpn.service
                                        [Unit]
                                        Description=OpenVPN Server
                                        After=network.target
                                        After=syslog.target
                                        [Install]
                                        WantedBy=multi-user.target
                                        [Service]
                                        ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server/server.conf

                                        然后重新加载系统服务,启动openvpn服务并使能开机启动。

                                          systemctl daemon-reload
                                          systemctl start openvpn
                                          systemctl enable openvpn
                                          systemctl status openvpn

                                          查看openVPN的端口监听状态:

                                            ss -atnp |grep 44331
                                            ss -atnp |grep openvpn

                                            openVPN网关服务器运行状态正常。

                                            NAT配置

                                            我们要使用内核中的ethhost来作为openVPN的网关,接下来要在VPP中配置映射VPP配置指南:NAT“三板斧”,将访问12.1.1.2的10086的流量映射到172.16.1.1。

                                              vppctl set interface nat44 out eth1 output-feature
                                              vppctl nat44 add interface address eth1
                                              vppctl nat44 add identity mapping 12.1.1.2
                                              vppctl nat44 add static mapping tcp local 172.16.1.1 44331 external 12.1.1.2 44331
                                              vppctl nat44 add static mapping tcp local 172.16.1.1 44331 external eth1 44331

                                              连接客户端

                                              我们已经介绍过了Windows系统openVPN连接操作指南、Linux-CentOS系统openVPN的Linux客户端竟然比Windows客户端性能高5倍不止macOS系统和Android系统openVPN客户端配置之macOS、Android操作指南的openVPN客户端安装,今天使用Linux-CentOS系统进行测试。

                                              同样在客户端部署openVPN,使用其客户端角色进行配置,将前面生成的3个证书导入到/etc/openvpn/client/目录下。然后在同目录下,新建一个客户端配置文件tietouge.ovpn,内容如下所示:

                                                client
                                                dev tun
                                                proto tcp
                                                remote 12.1.1.2 44331
                                                ca /etc/openvpn/client/ca.crt
                                                cert /etc/openvpn/client/tietouge.crt
                                                key /etc/openvpn/client/tietouge.key
                                                nobind
                                                resolv-retry infinite
                                                persist-key
                                                persist-tun
                                                verb 4

                                                再使用命令触发连接就可以了。

                                                  openvpn /etc/openvpn/client/tietouge.ovpn &

                                                  IPsec VPN配置

                                                  配置参考VPP配置指南:穿越NAT的IPsec VPN配置及性能测试

                                                  VPP72
                                                    vppctl ikev2 profile add openvpp
                                                    vppctl ikev2 profile set openvpp auth shared-key-mic string openvpp
                                                    vppctl ikev2 profile set openvpp id local ip4-addr 12.1.1.2
                                                    vppctl ikev2 profile set openvpp id remote fqdn vpp73
                                                    vppctl ikev2 profile set openvpp traffic-selector local ip-range 0.0.0.0 - 255.255.255.255 port-range 0 - 65535 protocol 0
                                                    vppctl ikev2 profile set openvpp traffic-selector remote ip-range 0.0.0.0 - 255.255.255.255 port-range 0 - 65535 protocol 0
                                                    vppctl set interface state ipip0 up
                                                    vppctl set interface ip address ipip0 120.1.1.1/24
                                                    vppctl ip route add 22.1.1.0/24 via 120.1.1.2 ipip0

                                                    VPP73
                                                      vppctl set int state eth1 up
                                                      vppctl set int ip address eth1 13.1.1.3/24
                                                      vppctl set int state eth2 up
                                                      vppctl set int ip address eth2 22.1.1.1/24
                                                      vppctl ip route add 12.1.1.0/24 via 13.1.1.1
                                                      vppctl ikev2 profile add openvpp
                                                      vppctl ikev2 profile set openvpp auth shared-key-mic string openvpp
                                                      vppctl ikev2 profile set openvpp id local fqdn vpp73
                                                      vppctl ikev2 profile set openvpp id remote ip4-addr 12.1.1.2
                                                      vppctl ikev2 profile set openvpp traffic-selector local ip-range 0.0.0.0 - 255.255.255.255 port-range 0 - 65535 protocol 0
                                                      vppctl ikev2 profile set openvpp traffic-selector remote ip-range 0.0.0.0 - 255.255.255.255 port-range 0 - 65535 protocol 0
                                                      vppctl ikev2 profile set openvpp responder eth1 12.1.1.2
                                                      vppctl ikev2 profile set openvpp ike-crypto-alg aes-cbc 256 ike-integ-alg sha1-96 ike-dh modp-2048
                                                      vppctl ikev2 profile set openvpp esp-crypto-alg aes-cbc 256 esp-integ-alg sha1-96 esp-dh ecp-256
                                                      vppctl ikev2 profile set openvpp sa-lifetime 3600 10 5 0
                                                      vppctl ikev2 initiate sa-init openvpp
                                                      vppctl set interface state ipip0 up
                                                      vppctl set interface ip address ipip0 120.1.1.2/24
                                                      vppctl ip route add 172.16.1.0/24 via 120.1.1.1 ipip0

                                                      ISP
                                                        #
                                                        interface GigabitEthernet2/0
                                                        ip address 11.1.1.1 255.255.255.0
                                                        #
                                                        interface GigabitEthernet3/0
                                                        ip address 12.1.1.1 255.255.255.0
                                                        nat outbound
                                                        #
                                                        interface GigabitEthernet4/0
                                                        ip address 13.1.1.1 255.255.255.0
                                                        验证配置

                                                        配置完成之后我们就可以测试从PCA到PCB的访问了。

                                                        可以看到,访问成功。但是中间有2跳没有显示,这里10.153.214.1的下一跳应该是VPP72的ethvpp接口,再下一跳是VPP73的120.1.1.2接口,最后是PCB主机。其实10.153.214.1和172.16.1.2应该算是1跳,毕竟是在一台设备上。

                                                        最后简单测试一下“openVPP”的性能如何。

                                                        最终测得带宽为600 Mbps,最高值为805 Mbps,结合之前openVPN测得的576 Mbps、IPsec VPN测得的1.69 Gbps的性能,瓶颈应该是在openVPN了。


                                                        打赏

                                                        本文链接:https://www.kinber.cn/post/3469.html 转载需授权!

                                                        分享到:


                                                        推荐本站淘宝优惠价购买喜欢的宝贝:

                                                        image.png

                                                         您阅读本篇文章共花了: 

                                                        群贤毕至

                                                        访客