如何配置 IPsec(strongswan)接口,以便只有分配的接口获得虚拟 IP?

如何配置 IPsec(strongswan)接口,以便只有分配的接口获得虚拟 IP?

我已经多次使用此配置,之前从未遇到过此问题。基本上,我建立了隧道连接,但在连接后,swanctl --initiate --child ch_vti0 --ike ch_vti0我在相应的接口上分配了虚拟 IP ,而且我的主接口(连接到互联网的接口)vti0上也分配了相同的 IPenp2s0

我从具有扩展调试选项的日志中得到以下内容(为简洁起见已缩短):

юли 29 09:33:45 malz charon-custom[21535]: 12[IKE] installing new virtual IP 172.13.14.3
...
юли 29 09:33:45 malz charon-custom[21535]: 12[KNL] virtual IP 172.13.14.3 installed on enp2s0
...
юли 29 09:33:45 malz charon-custom[21535]: 11[KNL] adding policy 192.168.122.0/24 === 172.13.14.3/32 in (mark 42/0xffffffff) [priority 371327, refcount 1]
...
юли 29 09:33:45 malz charon-custom[21535]: 11[KNL] using host 172.13.14.3
...
юли 29 09:33:45 malz charon-custom[21535]: 11[KNL] installing route: 192.168.122.0/24 via 10.3.218.62 src 172.13.14.3 dev enp2s0
...
юли 29 09:33:45 malz charon-custom[21535]: 11[IKE] CHILD_SA ch_vti0{1} established with SPIs cbaeec67_i c450a827_o and TS 172.13.14.3/32 === 192.168.122.0/24
...
юли 29 09:33:45 malz charon-custom[21535]: 16[KNL] 172.13.14.3 appeared on vti0

所以基本上我建立了连接,我的主接口 enp2s0 立即获取虚拟 ip,然后另一个接口 vti0 获取 ip。

旁注:我知道我可以通过删除主界面的路线来解决这个问题,但我的目标是完全停止分配。

我的 swanctl.conf (启动器):

connections {
   ch_vti0 {
      send_cert = always
      encap = yes
      vips = 0.0.0.0
      remote_addrs = 10.3.218.62
      local {
         round = 1
         id = 10.3.72.29
         auth = psk
         certs = 
       }
      remote {
         auth = psk
         id = 10.3.218.62
         certs = 
       }
      children {
        ch_vti0 { 
            updown = /usr/local/etc/swanctl/updown.sh 0
            mark_in = 42 
            mark_out = 42 
            remote_ts = 192.168.122.2/24
            local_ts = dynamic
            inactivity = 300s
            mode = tunnel
            esp_proposals =  3des-sha1-modp2048
         }
      }
      version = 1 
      proposals =  des-md5-modp768, des-md5-modp1024, des-md5-modp1536
   }  }
secrets {
        eap-xauth {
        eap_id = test1
        id = test1
        secret = password
   }
        xauth-local {
        id = test1
        secret = password
        }
        ike-sec {
        id = %any
        secret = test
        }
        ike-local {
        id = 10.3.72.29
        secret = test
        }
}

服务器设置(响应者):

connections {
   ch_vti0 {
      send_cert = always
      encap = yes
      pools = pools_users
      #aggressive = yes
      local {
         round = 1
         id = 10.3.218.62
         auth = psk
         certs = 
       }
      remote {
         auth = psk
         id = %any
         certs = 
       }
      children {
        ch_vti0 { 
            local_ts = 192.168.122.2/24
            inactivity = 120s
            mode = tunnel
            esp_proposals =  3des-sha1-modp2048
         }
      }
      version = 0
      proposals =  des-md5-modp768, des-md5-modp1024, des-md5-modp1536
   }  }
pools {
        pools_users {
                addrs = 172.13.14.2/24
        }
}
secrets {
        eap-xauth {
        eap_id = test1
        id = test1
        secret = password
   }
        xauth-local {
        id = test1
        secret = password
        }
        ike-sec {
        id = %any
        secret = test
        }
        ike-local {
        id = 10.3.218.62
        secret = test
        }
}

我还知道我可以使用 strongswan charon 参数:

# install_virtual_ip_on = vti0
# interfaces_use = vti0
# interfaces_ignore = enp2s0

但如果我这样做,该过程将无法进行,就好像它需要使用 enp2s0 接口一样。有其他人遇到过这个问题吗?欢迎提出任何建议。

另外,我正在使用 strongSwan 5.7.2、Linux 4.18.0-25-generic。

关于 updown 脚本,这实际上并不重要,因为如果我在没有脚本的情况下执行相同的配置,我会遇到相同的错误。

答案1

所以我终于找到了一种纠正此问题的方法。正如我所说,问题是在正确的接口之上使用了错误的接口,我还没有弄清楚原因,但我认为我找到的解决方法已经足够好了。在 strongswan.conf(通常在 /etc/strongswan.conf 或 /usr/local/etc/strongswan.conf 中)设置变量 install_routes = no ,默认情况下为是。从 StrongSwan 文档中,变量是:

Install routes into a separate routing table for established IPsec tunnels. If disabled a more efficient lookup for source and next-hop addresses is used since 5.5.2.

因此,通过这样做,我禁止创建表 220 并向其中添加路由。相反,它会通过检查哪个接口具有到特定 IP 的路由来自行配置正确的路由。

正如前面提到的,使用变量也可能解决您的问题。

# install_virtual_ip_on = vti0
# interfaces_use = vti0
# interfaces_ignore = enp2s0

strongswan.conf:

charon {
        install_routes = no
        load_modular = yes
        plugins {
                include strongswan.d/charon/*.conf
        }
include strongswan.d/*.conf
}

答案2

看来您只需要添加install_virtual_ip_on = vti0选项来解决您的问题。

请勿触摸interfaces_use选项interfaces_ignore

相关内容