openstack M版本VPN连接问题总结

来源:互联网 发布:imo是什么软件 编辑:程序博客网 时间:2024/06/01 14:40

M版本VPN安装遇到的问题和部分解决办法总结

安装:

为了保证openstack安装之后VPN功能能正常使用,需要将packstackanswer文件选项CONFIG_NEUTRON_VPNAAS=y置位为y,然后进行安装。

 

安装完成之后VPN功能还不能正常使用,为openstack添加两个网络和两个namespace,启动vpn连接,发现ipsec连接一直处于pending create阶段,不能正确建立连接。

 

针对这个问题,发现ipsecpluto进程(ipsec的守护进程)一直未能正确启动,导致vpn连接不能正确建立,针对这个进程启动解决过程中遇到很多的问题,在这里一一列举出来,以防大家以后遇到同样的问题能有一个参考。

 

首先,Openstack VPN在底层驱动的选择上有三个底层驱动可供选择,但是目前每个驱动的调用代码都不稳定,导致每个驱动调用的时候都会遇到问题而导致连接建不起来的情况。

 

例如默认的libreswan驱动遇到的问题

1、\u2018/var/lib/neutron/ipsec/d067e798-3333-4a03-b61e-82c61173d2fb/etc/ipsec.secrets\u2019: Operation not permitted

   这个问题已经被redhat确认,目前还未解决,bug连接:

https://bugzilla.redhat.com/show_bug.cgi?id=1352710

在这个问题出现之后,可以通过disable selinux来规避

setenforce 0 

修改配置文件需要重启机器:

修改/etc/selinux/config 文件

SELINUX=enforcing改为SELINUX=disabled

2、在修改上述文件之后,你会发现你的服务器会出现卡死的情况,不管你服务器的硬件条件有多少,你都会发现有这样的一个进程certutil 100%占用CPU。导致服务器卡死,查看日志瞬间多出了500M日志,得到

查看代码libreswan_ipsec.py可得知

"""Generate config files which are needed for Libreswan.

 

        Initialise the nssdb, otherwise pluto daemon will fail to run."""

在初始化的时候会建立nssdb,但是如果使用原始的默认代码

        #try:

           # self._execute([self.binary, 'checknss', self.etc_dir])

        #except RuntimeError:

           # self._execute([self.binary, 'initnss', self.etc_dir])

namespace下并不能正确的生成db文件,这个时候的db文件依旧在/etc/ipsec.d/*db下生成,导致在ipsec连接在执行下一步的时候出现死循环的情况,并且kill certutil 进程之后,再次创建ipsec连接,会出现namespace文件夹建立不起来的问题,所以为了保证在第一次创建ipsec连接的时候nssdb能正确建立,需要对源代码做出相应的修改,注释掉源代码中创建nssdb的那段代码。

ipsec.py中添加如下:

A.BaseSwanProcess类添加参数bcertutil = "certutil"NSS_FILES = ['cert8.db', 'key3.db','secmod.db' ]

B.BaseSwanProcess类添加函数

  def _ensure_nss(self, nss_files):

                     if not os.path.isfile(nss_files):
                     #start nss database
                      self._execute([self.bcertutil,
                        -N,
                        --empty-password,
                        -d, self.ipsecd_dir,
                        ])

C.init函数中添加

 self.ipsecd_dir = os.path.join(self.etc_dir, 'ipsec.d')

D.enable函数中添加

def enable(self):

        """Enabling the process."""

        try:

            self.ensure_configs()

            for nss_file in self.NSS_FILES:

                nss_path = os.path.join(self.ipsecd_dir, nss_file)

                self._ensure_nss(nss_path)

E. OpenSwanProcess类的init函数中添加

 self.ipsecd_dir = os.path.join(self.etc_dir, 'ipsec.d')

F.OpenSwanProcess类的start函数中修改

        #start pluto IKE keying daemon

        cmd = [self.binary,

               'pluto',

               '--ctlbase', self.pid_path,

               '--ipsecdir', self.ipsecd_dir,

               '--uniqueids',

               '--nat_traversal',

               '--secretsfile', self.secrets_file,

               '--virtual_private', virtual_private]

G.添加/usr/share/neutron/rootwrap/vpnaas.filters

  libreswan: CommandFilter, certutil, root 

重启neutron-server和vpn服务,ipsec就能正确连接起来。

另外的两个驱动做ipsec连接也相应的遇到很多问题,如使用

Openswan来建立连接,会出现Pluto.ctl建立连接失败的问题,查询日志得到

 ERROR neutron.agent.linux.utils [req-0440405f-4bdb-4d98-871d-3d225d3b4cd5 - 62c88627c9104e24aea544becaace217 - - -] Exit code: 1; Stdin: ; Stdout: ; Stderr: whack: is Pluto running?  connect() for "/var/lib/neutron/ipsec/037d2d4e-2208-485b-b42d-546a407e5db2/var/run/pluto.ctl" failed (111 Connection refused)

目前这个问题还未找到相应的解决办法

另外也有一个strongswan驱动不能建立ipsec连接的问题,在官网的bug目录能找到相应的记录,目前还未解决,链接为:

https://bugs.launchpad.net/neutron/+bug/1606527

 

在解决M版本vpn连接的问题的时候花费了很长的时间,由于J版本和M版本vpn模块改动较大,M版本相当于将VPN从之前的neutron中独立出来,不再在neutron目录下存在,相应的功能模块也增加了libreswan这个驱动来保证ipsec的连接,目前网上并没有太多的资料可供借鉴,在此写下这篇总结文档,供大家参考,目前还是小白一枚,文章中还有很多不正确和欠考虑之处,还望各位大牛指正。

0 0