在 Linux 上通过单个接口设置多个 IPv6 路由

在 Linux 上通过单个接口设置多个 IPv6 路由

太长不看;LAN 设备能够获得 2 个独立的互联网连接(1 个来自 ISP 路由器的 NAT,1 个来自手动 PPP 连接)。能够将 ISP-WAN 和 PPP-WAN IPv4 分成 2 个路由,ip rules但不能使用 IPv6。


抱歉,帖子太长了。我的需求是拥有 2 个独立的路由表,以便通过 2 个独立的路由连接到互联网。

我将分享如何使用 IPv4 来管理这个问题 - 但是对于 IPv6 来说我无法弄清楚具体步骤。

我有一个相当独特的设置,我可以通过两种方式从我的 ISP 获取全局 IPv6 地址。
我的 ISP 提供了一个 FTTH 调制解调器+路由器 ( RT),它使用 PPPoE 连接到互联网。

我的 LAN 已打开192.168.5.0/24,ISP 的RT默认网关为192.168.5.1

我有一个使用IP单一接口RPi连接的树莓派,我正在此处执行此设置。RTbr0192.168.5.22

RT有一个选项可以启用PPPoE passthrough,让我的 Raspberry Pi请求 PPP 连接,因此,

1 - 我可以获得公共 IPppp0以直接访问互联网2 - 我也可以通过网关
访问互联网192.168.5.1RT


工作 IPv4 设置

<WAN1> <WAN2>
    |    |
    |    `-RT - <PPP Public IP 1>
    |      `-br_lan - 192.168.5.1/24
    |        `-Laptop
    |          `-eth0 - 192.168.5.100/24 (default gateway: 192.168.5.1)
    |        `-RPi 
    |          `-eth0 - 192.168.5.22/24 (default gateway: 192.168.5.1 in table 111)
    `------------`-ppp0 - <PPP PUBLIC IP 2> (default gateway in table `main`)

ppp0RPi接口是主路由表上的默认网关:

# ip route show
default dev ppp0 scope link
192.168.5.0/24 dev br0 proto dhcp scope link src 192.168.5.22 metric 204
<redacted hop ip> dev ppp0 proto kernel scope link src <redacted PPP-WAN ip>

新的单独路由表包含到 ISP-WAN 的路由以及RT网关

# ip route show table 111
default via 192.168.5.1 dev br0 proto static
192.168.5.0/24 dev br0 proto static

为所有来自 LAN 的传入连接设置了一条规则,以使用 ISP-WAN 网关

# ip rule show
0:      from all lookup local
0:      from 192.168.5.0/24 lookup 111

curl -4 ifconfig.coRPi返回 PPP-WAN 公网 IP✅LAN 上用作RPi网关的任何设备都会获得 ISP-WAN 公网 IP✅

所有来自 Pi 的流量都将使用ppp0,如果需要,我可以添加新规则以将 ISP-WAN 用于任何 VPN 接口:)
相应的 systemd-networkd 配置:

# cat 11-br0.network
[Match]
Name=br0

[Network]
#DHCP=ipv6
DHCP=no
Address=192.168.5.22/24
Address=fdXX:22/64
DNS=1.1.1.1
#IPv6AcceptRA=yes
#IPv6PrivacyExtensions=true
IPv6AcceptRA=no

# Seperate LAN and PPP traffic in different tables
[Route]
Destination=0.0.0.0/0
Gateway=192.168.5.1
Table=111

[Route]
Destination=192.168.5.0/24
Table=111

[RoutingPolicyRule]
From=192.168.5.0/24
Table=111

[Link]
MACAddress=HH:MM:XX:YY:ZZ

IPv6 部分

有两种方法可以获取 IPv6 访问权限RPi
ppp01.通过DHCPv6 请求wide-dhcpv6-client.service询问描述此方法的 Ubuntu 链接 /etc/wide-dhcpv6/dhcp6c.conf

# Default dhpc6c configuration: it assumes the address is autoconfigured using
# router advertisements.

profile default
{
  information-only;

  request domain-name-servers;
  request domain-name;

  script "/etc/wide-dhcpv6/dhcp6c-script";
};

interface ppp0 {
    # Request Prefix Delegation on ppp0, and give the received prefix id 0
    send ia-pd 0;
};

id-assoc pd 0 {
    prefix-interface br0 {
        # Assign subnet 1 to br0
        sla-len 0;
        sla-id 1;
        ifid-random;
    };
};

生成的 IP 地址和路由表:

4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.22/24 brd 192.168.5.255 scope global br0
       valid_lft forever preferred_lft forever
#Global Public
    inet6 2401::XX/64 scope global
       valid_lft forever preferred_lft forever
#ULA
    inet6 fdXX::Y/64 scope global
       valid_lft forever preferred_lft forever
#Link local
    inet6 fe80::Y/64 scope link
       valid_lft forever preferred_lft forever

5: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc pfifo_fast state UNKNOWN group default qlen 3
    link/ppp
    inet <Public IPv4> peer <IPv4>/32 scope global ppp0
       valid_lft forever preferred_lft forever
    inet6 fe80::<ppp0 link local> peer fe80::123:46ff:fe07:0508/128 scope link
       valid_lft forever preferred_lft forever

# Route
::1 dev lo proto kernel metric 256 pref medium
<PPP IPv6 Prefix>::/64 dev br0 proto kernel metric 256 pref medium
fdXX:22::/64 dev br0 proto kernel metric 256 pref medium
fe80::123:46ff:fe07:0508 dev ppp0 proto kernel metric 256 pref medium
fe80::<ppp0 link local> dev ppp0 proto kernel metric 256 pref medium
fe80::/64 dev br0 proto kernel metric 256 pref medium
default via fe80::123:46ff:fe07:0508 dev ppp0 proto ra metric 1024 expires 1616sec hoplimit 64 pref medium

这样,来自或通过(如 VPN 客户端)的任何内容都将通过以下方式使用提供的 WAN 前缀RPi传出:ppp0PPP

2. 通过 的RT路由器广告br0使用以下更改[Network]

# /etc/systemd/network/11-br0.network
[Network]
DHCP=ipv6
DNS=1.1.1.1
IPv6AcceptRA=yes
IPv6PrivacyExtensions=true

这样,来自 LAN 以及RPi两者的所有流量都将使用RTISP-WANv6前缀。

问题

如果我启用这两种方法中的任何一种,我就无法启用另一种。
如果我使用 ISP-WAN,并尝试从 获取 IPv6 ppp0wide-dhcpv6-client.service则会抛出client6_init: bind: Address already in use

我尝试br0通过一条规则为 LAN 设置单独的路由表,该规则路由来自RTULA 的所有流量,并使用新表:

# Setting a static ULA + using DHCP to get Prefix from `RT`
[Network]
DHCP=ipv6
Address=fdZZ::1/64
IPv6AcceptRA=yes
IPv6PrivacyExtensions=true

# Route all outgoing traffic through the gateway provided by RT's RA
[Route]
Destination=::/0
Gateway=_ipv6ra
Table=111

# All traffic to LAN devices that use RT's ULA 
[Route]
Destination=fdXX::/64
Table=111

# All LAN devices (which use RT's ULA) will use the above routes configured in table 111
[RoutingPolicyRule]
From=fdXX::/64
Table=111

除了链接本地地址,fe80::我不知道还有哪个地址在使用。尝试从 br0 中删除链接本地地址,但没有成功。

ISP-WANv6 的全局前缀和ppp0都不同,ULA 前缀RT也不同于我手动配置的静态 ULA。

在 IPv4 中,我可以轻松创建具有不同默认网关的单独路由,但无法在 IPv6 中找到等效路由。

我需要能够拥有 2 条通往 IPv6 互联网的路径,尽管使用单独的表
和一条根据原始来源指示采取哪条路由的规则。
任何帮助都将不胜感激!

披露:我也在 serverfault 上发布了此信息 - 但不确定那是否是正确的地方,因此在这里重新发布

答案1

wide-dhcpv6-client.service 将抛出 client6_init: bind: Address already in use。

这很可能意味着您有两个 DHCPv6 客户端在同一接口上运行(即 WIDE 客户端和 systemd-networkd 可能都尝试在 ppp0 上进行通信,或类似的东西)。

虽然 DHCPv4 客户端使用“原始”套接字来发送/接收 DHCP 数据包,因此可以自行进行数据包过滤,但在 DHCPv6 中,情况已不再如此。所有 DHCPv6 客户端都使用普通的 UDP 套接字,并且必须能够将套接字绑定到 UDP 端口 546 上的链路本地地址(即,实际上[fe80::X]:546可能“已在使用中”)。

尝试从命令行运行 WIDE 客户端,并启用详细模式或调试模式,以查看它是否尝试使用除您配置的接口之外的其他接口。

在 IPv4 中,我可以轻松创建具有不同默认网关的单独路由,但无法在 IPv6 中找到等效路由。

它是确切地IPv6 中也一样。

嗯,Linux 确实有一个更轻松在 IPv6 中执行此操作的方法 – 实际上,您可以拥有与源和目标匹配的路由 – 但忽略这一点,它对于 IPv4 和 IPv6 都具有相同的“策略路由”功能。

请记住,这两种协议具有单独的策略规则列表,即ip -4 rule仅影响 IPv4 并且ip -6 rule仅影响 IPv6。(Systemd-networkd[RoutingPolicyRule]根据 From= 或 To= 地址确定使用哪个规则集。)

如果规则存在于中ip -6 rule,请确保它们确实正确(例如,由于某种原因您的规则使用fdXX::/64但您的地址是fdZZ::1/64)并且顺序正确(策略规则从上到下匹配,而不是最长前缀,因此您可能需要指定自定义Priority=)。


策略路由的替代方案:Linux 的 IPv6 堆栈允许您简单地[Route] Source=在主路由表中使用,这样您就可以拥有与相同目的地匹配(例如::/0)但与不同源前缀匹配的多个路由。

相关内容