太长不看;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
连接的树莓派,我正在此处执行此设置。RT
br0
192.168.5.22
RT
有一个选项可以启用PPPoE passthrough
,让我的 Raspberry Pi还请求 PPP 连接,因此,
1 - 我可以获得公共 IPppp0
以直接访问互联网2 - 我也可以通过网关
访问互联网192.168.5.1
RT
工作 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`)
ppp0
RPi
接口是主路由表上的默认网关:
# 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.co
从RPi
返回 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
:
ppp0
1.通过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
传出:ppp0
PPP
2. 通过 的RT
路由器广告br0
使用以下更改[Network]
:
# /etc/systemd/network/11-br0.network
[Network]
DHCP=ipv6
DNS=1.1.1.1
IPv6AcceptRA=yes
IPv6PrivacyExtensions=true
这样,来自 LAN 以及RPi
两者的所有流量都将使用RT
的ISP-WANv6
前缀。
问题
如果我启用这两种方法中的任何一种,我就无法启用另一种。
如果我使用 ISP-WAN,并尝试从 获取 IPv6 ppp0
,wide-dhcpv6-client.service
则会抛出client6_init: bind: Address already in use
。
我尝试br0
通过一条规则为 LAN 设置单独的路由表,该规则路由来自RT
ULA 的所有流量,并使用新表:
# 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
)但与不同源前缀匹配的多个路由。