Linux 中基于策略的 IPsec 路由

Rij*_*ael 5 ipsec

在 Linux 中,当谈到基于路由的 IPsec 隧道时,它非常简单。安装主要的 ipsec 实现之一。建立安全关联,在每个端点上添加 VTI 接口,向 VTI 添加标记,更改一些 sysctl 选项,然后您可以在两个端点之间路由流量。

在进行基于策略的路由时如何路由流量?到目前为止,我遇到的所有教程都只提到如何设置 ipsec 连接,但没有一个真正解释如何在两个端点之间路由流量或此过程需要哪些额外步骤。我要创建一条隧道吗?我必须标记它吗?添加路线?如果是这样,那么这与基于路由的设置有什么不同?

有人可以解释一下吗?

bcs*_*s78 3

“一般来说,IPsec 处理基于策略。定期路由查找完成后,操作系统内核会查阅其安全策略数据库以查找匹配的策略,如果发现与 IPsec SA 关联的策略,则会处理数据包。

根据操作系统的不同,还可以配置基于路由的 VPN。这里 IPsec 处理不(仅)依赖于协商策略,而是可以通过将数据包路由到特定接口来控制。”

来源:RouteBasedVPN

因此,基于策略的路由与操作系统的路由表无关,但它使用单独的“数据库”,因此ip route此处不适用。您可以使用 IPSec 配置来设置这些策略。IPSec 可以自行完成隧道传输。

ip route这是我的和的输出swanctl --list-sas(我使用swanctl来配置和控制Strongswan):

在此输入图像描述

正如您所看到的,我的托管服务器 sv1 (37.17.xx) 和我的家庭路由器 (87.97.xx) 之间有一个 IPSec 连接。服务器的路由表只有默认设置,但您可以看到名为 、 的 IPSec 策略,home-invitel并将home-securewifi每个home-lan流量从服务器分别路由到家庭 LAN 子网192.168.100.0/24和。第四个策略称为 sv1-local,用于在我的家庭端点和服务器上的本地子网之间路由流量。192.168.87.0/28192.168.88.0/2410.1.1.0/24

这是我在服务器上使用的 swanctl 配置:

connections {
        home {
                local_addrs = 37.17.x.x
                remote_addrs = vpn.example.org
                version = 2
                proposals = aes256-sha256-ecp384
                keyingtries = 0
                dpd_delay = 60s
                local1 {
                        auth = psk
                }
                remote1 {
                        auth = psk
                }
                children {
                        sv1-local {
                                local_ts = 10.1.1.0/24
                                esp_proposals = aes256gcm16-ecp384
                                dpd_action = restart
                                close_action = start
                                start_action = start
                        }
                        home-securewifi {
                                remote_ts = 192.168.87.0/28
                                esp_proposals = aes256gcm16-ecp384
                                dpd_action = restart
                                close_action = start
                                start_action = start
                        }
                        home-lan {
                                remote_ts = 192.168.88.0/24
                                esp_proposals = aes256gcm16-ecp384
                                dpd_action = restart
                                close_action = start
                                start_action = start
                        }
                        home-invitel {
                                remote_ts = 192.168.100.0/24
                                esp_proposals = aes256gcm16-ecp384
                                dpd_action = restart
                                close_action = start
                                start_action = start
                        }
                }
        }
}

secrets {
        ike-local {
                id = 37.17.x.x
                secret = "preshared-secret-key-goes-here"
        }
        ike-remote {
                id = vpn.example.org
                secret = "preshared-secret-key-goes-here"
        }
}
Run Code Online (Sandbox Code Playgroud)

例如,当我从 sv1 ping 到 192.168.88.5 时:

  • 操作系统检查路由表,但没有发现 192.168.88.5 特定规则
  • 然后操作系统检查 IPSec 策略数据库中是否有匹配的策略
  • home-lan 策略匹配,因此操作系统将数据包分发给 IPSec
  • IPSec 封装(加密)数据包并通过本地 LAN 隧道发送
  • 我的家庭路由器收到封装(加密)的数据包,在自己的 IPSec 策略数据库中找到匹配的策略,解封装(解密)数据包并将现在未加密的数据包发送到 192.168.88.5