OVS IPsec 指南

本文档提供了在Open vSwitch下运行IPsec隧道的步骤指南。更详细的关于OVS IPsec隧道及其配置模式的信息可在OVS官方工程的文件:/howto/ipsec中找到。

要求 Requirements

OVS IPsec隧道要求Linux内核(>= v3.10.0)和 非内核基础的OVS模块。合适的IKE守护进程为 LibreSwan (>= v3.23) 和 StrongSwan (>= v5.3.5).

安装 OVS 和 IPsec 软件包

OVS IPsec有.deb 和 .rpm两种格式的软件包。你应根据你的Linux发行版使用正确的软件包。本文的示例使用 Ubuntu 16.04 和 Fedora 27。

Ubuntu

  1. 根据OVS官方项目的文件/intro/install/debian 安装debian软件包.

:

如果你已经安装了OVS,只需要在以下的步骤中安装openvswitch-pki_*.deb 和 openvswitch-ipsec_*.deb软件包。如果你的内核版本低于v4.13.0,需要更新内核到v4.13.0或更高版本。
  1. 安装相关软件包:

    $ apt-get install dkms strongswan
    $ dpkg -i libopenvswitch_*.deb openvswitch-common_*.deb \
          openvswitch-switch_*.deb openvswitch-datapath-dkms_*.deb \
          python-openvswitch_*.deb openvswitch-pki_*.deb \
          openvswitch-ipsec_*.deb
    

    安装成功之后,你应可以在你的系统上看到ovs-monitor-ipsec守护进程。

Fedora

  1. 安装OVS官方项目的文档/intro/install/fedora 编译 RPM软件包.

  2. 安装相关软件包:

    $ dnf install python2-openvswitch libreswan \
                  "kernel-devel-uname-r == $(uname -r)"
    $ rpm -i openvswitch-*.rpm openvswitch-kmod-*.rpm \
             openvswitch-openvswitch-ipsec-*.rpm
    
  3. 安装防火墙规则已运行ESP和IKE流量:

    $ iptables -A IN_FedoraServer_allow -p esp -j ACCEPT
    $ iptables -A IN_FedoraServer_allow -p udp --dport 500 -j ACCEPT
    
  4. 运行 openvswitch-ipsec 服务:

    $ systemctl start openvswitch-ipsec.service
    

    :

    SELinux策略可能组织openvswitch-ipsec.service访问特定的资源。你可配置SELinux移除这些限制。

配置 IPsec 隧道

假设你要在两台主机之间建立IPsec隧道。假定“host_1”的外部IP地址为 1.1.1.1,“host_2”的外部IP地址为2.2.2.2。确保host_1host_2可使用外网IP ping通彼此。

  1. 设置一些变量方便操作,在两个主机上,设置“ip_1” 和 “ip_2” 变量, 如下:

    $ ip_1=1.1.1.1
    $ ip_2=2.2.2.2

  2. 在两台主机上创建 OVS 网桥.

    In host_1::

    $ ovs-vsctl add-br br-ipsec
    $ ip addr add 192.0.0.1/24 dev br-ipsec
    $ ip link set br-ipsec up
    

    In host_2::

    $ ovs-vsctl add-br br-ipsec
    $ ip addr add 192.0.0.2/24 dev br-ipsec
    $ ip link set br-ipsec up
    
  3. 建立 IPsec 隧道.

    你可选择三种认证模式中的一种建立你的IPsec隧道。

    a) 使用共享秘钥: Pre-Shared Key:

    In host_1::

       $ ovs-vsctl add-port br-ipsec tun -- \
                   set interface tun type=gre \
                                 options:remote_ip=$ip_2 \
                                 options:psk=swordfish
    

    In host_2::

       $ ovs-vsctl add-port br-ipsec tun -- \
                   set interface tun type=gre \
                                 options:remote_ip=$ip_1 \
                                 options:psk=swordfish
    

    :

    基于Pre-shared key (PSK)认证容易建立,但是与其它认证方法相比不够安全。你在生产环境中要小心使用。

    b) 使用self-signed 证书:

    在“host_1“ 和 ”host_2” 上生产self-signed证书。随后,拷贝 “host_1” 的证书到 “host_2”,以及拷贝 “host_2” 的证书到 “host_1”。

    In host_1::

       $ ovs-pki req -u host_1
       $ ovs-pki self-sign host_1
       $ scp host_1-cert.pem $ip_2:/etc/keys/host_1-cert.pem
    

    In host_2::

       $ ovs-pki req -u host_2
       $ ovs-pki self-sign host_2
       $ scp host_2-cert.pem $ip_1:/etc/keys/host_2-cert.pem
    

    :

    如果你使用StrongSwan作为IKE守护进程,请移动主机证书到目录/etc/ipsec.d/certs/,移动私钥到目录/etc/ipsec.d/private/,以便StrongSwan有权限访问这些文件。

    使用self-signed证书配置IPsec隧道.

    In host_1::

       $ ovs-vsctl set Open_vSwitch . \
                  other_config:certificate=/etc/keys/host_1-cert.pem \
                  other_config:private_key=/etc/keys/host_1-privkey.pem
       $ ovs-vsctl add-port br-ipsec tun -- \
                   set interface tun type=gre \
                          options:remote_ip=$ip_2 \
                          options:remote_cert=/etc/keys/host_2-cert.pem
    

    In host_2::

       $ ovs-vsctl set Open_vSwitch . \
                  other_config:certificate=/etc/keys/host_2-cert.pem \
                  other_config:private_key=/etc/keys/host_2-privkey.pem
       $ ovs-vsctl add-port br-ipsec tun -- \
                   set interface tun type=gre \
                          options:remote_ip=$ip_1 \
                          options:remote_cert=/etc/keys/host_1-cert.pem
    

    :

    私钥的保密非常重要。不要拷贝它到容易泄露的地方(证书不需要保密)。

    c) 使用 CA-signed 证书:

    首先你需要建立一个public key infrastructure (PKI)。假设你选择 “host_1” 作为PKI.

    In host_1::

       $ ovs-pki init
    

    生成证书请求,拷贝“host_2”的证书请求到“host_1”.

    In host_1::

       $ ovs-pki req -u host_1
    

    In host_2::

       $ ovs-pki req -u host_2
       $ scp host_2-req.pem $ip_1:/etc/keys/host_2-req.pem
    

    使用CA key签名证书请求。拷贝“host_2”签名后的证书和CA证书到“host_2”.

    In host_1::

       $ ovs-pki sign host_1 switch
       $ ovs-pki sign host_2 switch
       $ scp host_2-cert.pem $ip_2:/etc/keys/host_2-cert.pem
       $ scp /var/lib/openvswitch/pki/switchca/cacert.pem \
                 $ip_2:/etc/keys/cacert.pem
    

    :

    如果你使用StrongSwan作为IKE守护进程,请移动主机证书到目录/etc/ipsec.d/certs/, 移动CA 证书到目录/etc/ipsec.d/cacerts/, 移动私钥到目录 /etc/ipsec.d/private/,以便 StrongSwan 有权限访问这些文件。

    使用CA-signed证书配置IPsec隧道.

    In host_1::

       $ ovs-vsctl set Open_vSwitch . \
               other_config:certificate=/etc/keys/host_1-cert.pem \
               other_config:private_key=/etc/keys/host_1-privkey.pem \
               other_config:ca_cert=/etc/keys/cacert.pem
       $ ovs-vsctl add-port br-ipsec tun -- \
                set interface tun type=gre \
                              options:remote_ip=$ip_2 \
                              options:remote_name=host_2
    

    In host_2::

       $ ovs-vsctl set Open_vSwitch . \
               other_config:certificate=/etc/keys/host_2-cert.pem \
               other_config:private_key=/etc/keys/host_2-privkey.pem \
               other_config:ca_cert=/etc/keys/cacert.pem
       $ ovs-vsctl add-port br-ipsec tun -- \
                set interface tun type=gre \
                              options:remote_ip=$ip_1 \
                              options:remote_name=host_1
    

    :

    “remote_name” 是签名证书的common name (CN)。它必须匹配于在命令“ovs-pki sign command”的参数中指定的名称。保证只有具有期望CN的证书可被认证;否则,任何被CA签名的证书都可接受。

  4. 测试 IPsec 隧道.

    现在你应有了一个运行在两个主机之间的IPsec GRE隧道。在“host_1”上进行验证:

    $ ping 192.0.0.2 &
    $ tcpdump -ni any net $ip_2
    

    你应看到由“host_1”发往“host_2”的ESP报文。

排错 Troubleshooting

守护进程“ovs-monitor-ipsec”管理和监控 IPsec 隧道状态. 使用以下的“ovs-appctl”命令查看 “ovs-monitor-ipsec” 内部呈现的隧道配置:

$ ovs-appctl -t ovs-monitor-ipsec tunnels/show

如果有配置错误,“ovs-appctl”应显示原因,例如:

   Interface name: gre0 v5 (CONFIGURED) <--- Should be set to CONFIGURED.
                                             Otherwise, error message will
                                             be provided
   Tunnel Type:    gre
   Remote IP:      2.2.2.2
   SKB mark:       None
   Local cert:     None
   Local name:     None
   Local key:      None
   Remote cert:    None
   Remote name:    None
   CA cert:        None
   PSK:            swordfish
   Ofport:         1          <--- Whether ovs-vswitchd has assigned Ofport number to this Tunnel Port
   CFM state:      Up         <--- Whether CFM declared this tunnel healthy
   Kernel policies installed:
   ...                          <--- IPsec policies for this OVS tunnel in Linux Kernel installed by strongSwan
   Kernel security associations installed:
   ...                          <--- IPsec security associations for this OVS tunnel in Linux Kernel installed by strongswan
   IPsec connections that are active:
   ...                          <--- IPsec "connections" for this OVS tunnel

如果你没有看到任何活动的连接connection,试着运行以下的命令刷新“ovs-monitor-ipsec”守护进程:

$ ovs-appctl -t ovs-monitor-ipsec refresh

你也可查看“ovs-monitor-ipsec”和IKE守护进程的日志以定位问题。“ovs-monitor-ipsec”守护进程的日志位于文件:/var/log/openvswitch/ovs-monitor-ipsec.log.

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页