AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1094250
Accepted
Lasse Michael Mølgaard
Lasse Michael Mølgaard
Asked: 2022-02-21 06:10:24 +0800 CST2022-02-21 06:10:24 +0800 CST 2022-02-21 06:10:24 +0800 CST

无法在 Strongswan 中使用拆分隧道

  • 772

我正在尝试为 VPN 拆分隧道设置 Strongswan。

我想要的只是子网10.88.0.0/16,10.0.200.0/24可以通过 VPN 隧道访问。其他一切都default gateway通过网络处理。

所有客户端都分配了一个属于该10.0.201.0/24子网的 IP 地址。

在我的配置文件中,我有以下内容:

# Default login method
eap-defaults {
  remote {
   auth = eap-radius
   id = %any
   eap_id = %any
  }
}

connections
{
  conn-unix : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 10.0.200.0/24, 10.88.0.0/16
      }

      esp_proposals = aes128gcm128-x25519
    }

    pools = IkeVPN-ipv4
    proposals = aes128-sha256-x25519
  }

  conn-windows : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 10.0.200.0/24, 10.88.0.0/16
      }

      esp_proposals = aes256-sha256-prfsha256-modp1024
    }

    proposals = aes256-sha256-prfsha256-modp1024
    pools = IkeVPN-ipv4
  }
}

pools
{
  IkeVPN-ipv4 {
    addrs = 10.0.201.0/24
    dns = 10.0.88.2
  }
}

当我通过 VPN 登录时,可以 ping 属于10.88.0.0/16and的主机10.0.200.0/24,所以我知道我可以使用 VPN 隧道。

然而:

如果我在仍然连接到 VPN 的同时尝试访问 Internet 上的任何其他资源,那么我什至无法 ping 属于该资源的 IP 地址。

在我的 Windows 计算机上的路由表中,我可以找到以下条目:

连接到 VPN 服务器的 Windows 客户端的部分路由表

我知道,当您有两条路由到给定子网(如0.0.0.0/0路由表中)时,任何具有最低度量的规则都会获胜,并使用该规则转发流量。

但是我不希望 VPN 服务器通过 VPN 安装默认路由,而只是告诉子网10.88.0.0/16并且10.0.200.0/24必须通过 VPN 路由。

我想要的是我看到一个更接近于此的路由表,而不必在每个 VPN 客户端上手动编辑路由表:

所需的路由表

那么我该怎么做呢?

strongswan split-tunneling split-tunnel
  • 1 1 个回答
  • 434 Views

1 个回答

  • Voted
  1. Best Answer
    Lasse Michael Mølgaard
    2022-02-24T03:04:20+08:002022-02-24T03:04:20+08:00

    原来我的拆分隧道问题被放在了一个完全不同的区域,因为我家里有 2 个路由器,所以我的家庭网络类似于:ISP <-> R1 <-> R2 <-> Me。

    ...并且 R1 被配置为 10.0.0.0/24 范围内的 IP 地址。

    当您在 Windows VPN 客户端中禁用默认路由时,它将添加一个基于类的路由,因此在我的情况下,它将添加一个通过 VPN 发送 10.0.0.0/8 的所有内容的路由,这当然会与设置冲突在路由器 R1 上。

    这就是为什么要完全删除路由 10.0.0.0/8 并为子网10.88.0.0/16和10.0.200.0/16VPN 推送路由。

    事实证明这是可行的。

    当您在 VPN 客户端中disable class based routing禁用时,启用会删除基于类的路由。default routing

    在 Strongswan 中,您必须将来自客户端的 dhcp 请求转发到已实施 RFC3442 的 DHCP 服务器。

    因此,在我上面的配置中,我必须替换所有出现的pools = IkeVPN-ipv4withpools = dhcp并且strongswan.conf我必须将以下内容添加到 charon plugins 小节:

    charon {
      plugins {
        ...
        dhcp {
          server = ip.address.of.dhcp.server
        }
      }
    }
    

    然后我可以删除pools配置底部的整个部分。

    还有一些可用的选项可以在这里阅读。

    来自 @ecdsa 提示的 Strongswan 的指南提供了一些信息,但该指南是特定于 Windows 的,因此它不会告诉您如何处理 Linux、MacOS 或 Android 设备。然而,RFC3442 将处理一般情况。

    简而言之,RFC3442 说的是您必须发送以下两个 dhcp 选项:

    • 选项 121(与 Linux、Android 和 Windows Vista 或更早版本相关)
    • 选项 249(与 Windows 7 或更新版本和 MacOS 相关)

    基本上,您必须使用以下语法将每个路由编码为 int 数组:

    x,y1,y2,y3,y4,z1,z2,z3,z4

    在哪里:

    • x:CIDR 网络掩码
    • y1 - y4:是您要路由的网络,但是当序列 y1,y2,y3,y4 的尾部全为零时,它们会被省略。
    • z1 - z4:是子网的下一跳网关。

    如果有多个路由要通过 DHCP 发送,那么您将不得不在第一个路由器的尾部添加与上述类似的另一个序列。

    根据 Strongswan 文档,我可以将标准网关替换为0.0.0.0.

    这意味着我的路线10.0.200.0/24被编码为24,10,0,200,0,0,0,0并被10.88.0.0/16编码为16,10,88,0,0,0,0.

    将两者结合起来给了我24,10,0,200,0,0,0,0,16,10,88,0,0,0,0,这使我得到以下配置ISC DHCP server:

    option rfc-routes code 121 = array of integer 8;
    option ms-routes code 249 = array of integer 8;
    
    default-lease-time 21600;
    max-lease-time 86000;
    
    subnet 10.0.201.0 netmask 255.255.255.0 {
        range 10.0.201.1 10.0.201.254;
    
        option domain-name "example.com";
        option domain-name-servers ip.address.of.dns.server;
    
        option rfc-routes 24,10,0,200,0,0,0,0,16,10,88,0,0,0,0;
        option ms-routes 24,10,0,200,0,0,0,0,16,10,88,0,0,0,0;
    }
    

    我希望这可以帮助任何对拆分隧道感到困惑的人。

    • 0

相关问题

  • 为我的 VPN 用户屏蔽网站

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve