我的问题与这问题,但差别不大:
我有一个 Ubuntu vps,主界面上有单个 IPv4。我想在这台机器上有两个单独的 IPv6 隧道,它们来自两个不同的提供商,具有不同的端点地址。当我单独尝试其中一个时。一切都正常。但是当我添加第二条隧道时,第一条隧道仍然有效,但第二条隧道无法从外部 ping 通。但是它可以 ping 通自己和网关。
我将这些行添加到我的/etc/network/interfaces
:
auto he-ipv6
iface he-ipv6 inet6 v4tunnel
address 2001:xxx:xxx:xxxx::2
netmask 64
endpoint xx.xx.xx.xx
local yy.yy.yyy.yy
ttl 255
gateway 2001:xxx:xxx:xxxx::1
auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
address 2a09:xxx:xxx:xxxx::2
netmask 64
endpoint zz.zz.zz.zz
local yy.yy.yyy.yy
ttl 255
gateway 2a09:xxx:xxx:xxxx::1
有人知道问题出在哪里或者我该如何进一步解决这个问题?
答案1
几点说明
对于网络配置工具来说ifupdown
,v4tunnel
实际上是第 3 层坐隧道可以根据使用等效于ip tunnel add FOO mode sit ...
或的工具来创建ip link add name FOO type sit ...
。
第 3 层接口没有第 2 层地址(没有以太网 MAC 地址),因此不必解析底层第 2 层的地址:第 3 层接口不会发生 ARP(IPv4)和 NDP(IPv6)。出于同样的原因,没有网关需要解析:网关属性不需要网关,但语法仍然允许在创建路由表条目时猜测要使用的接口而无需指定接口,这通常是这样做的,包括tunnel broker 自身的配置示例。最后,OP 的设置中不需要使用 /64 网络掩码和网关。但这个答案仍然会坚持这些设置,因此读者可以更轻松地将其适应第 2 层接口隧道,然后所有这些设置都将成为强制性的。同样,通常只sbtb-ipv6
需要有关非默认接口(此处)的设置,但无论如何,我为这两个接口提供了设置。剩下的唯一区别是哪个接口在主路由表中获取默认路由。
多宿主和策略路由
这是一个使用多个地址的多宿主系统每个路由器都有自己的路径到达(IPv6)互联网。上游路由器肯定会实现严格反向路径转发(SRPF)用于反欺骗:每个源地址必须通过其专用路径传输。使用简单路由时,只使用一个默认路由(显示的第一个)。可以添加具有较长度量的第二条默认路由,但直到具有较短度量的路由消失之前,它永远不会被选择。
为了克服这个问题,可以使用策略路由。这允许系统选择其他路由表(填充了不同的路由)和路由规则,这些路由规则将使用附加选择器选择这些路由表,而不仅仅是使用目的地来查找路由。这里有用的是源地址(在少数情况下,当此接口被强制使用时,还有传出接口)SO_BINDTODEVICE
)。
因此,目标是根据主路由表中的条目创建多个具有部分路由视图的备用路由表:每个路由表将认为只有一条通往 Internet 的路径,并且将有自己的默认路由。然后,基于源地址的路由规则将为传出数据包选择合适的路由表。在 OP 的情况下,传入数据包不需要任何特殊处理,因为本地路由表已经处理了这种情况。
执行
首先,interfaces
应该通过添加不同的度量否则sbtb-ipv6
设置可能会失败,因为不能有两个具有相同度量的默认路由。
然后手动操作,下面是如何让它工作。添加两个路由表,HE 的值为 2000,SBTB 的值为 2001,然后只将相关路由复制到每个路由表。这里度量值无关紧要,因为不存在可能的冲突。
ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6 table 2000
ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000
ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6 table 2001
ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001
并根据具有路由规则的源地址选择适当的路由(明确地说,声明一个固定的优先级,并声明它是本地发起的数据包iif lo
):
ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001
对于绑定到接口(例如ping -I sbtb-ipv6 ...
)而不是“简单”地绑定到接口地址(ping -I 2a09:xxx:xxx:xxxx::2
)的情况,也可以使用它来获得正确的结果(对于第 2 层情况非常有用,其中主路由表中不存在第二个默认路由,而在 OP 的第 3 层接口的情况下并不真正需要):
ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001
添加地址时,相反方向(传入流量,又称入口)已经在local
路由表中得到正确处理,因此对于入口不需要执行任何特殊操作。
最终配置
应首先手动尝试上述操作,并使用备份远程控制台访问(尽管 IPv4 不受影响,但 IPv4 访问应该足够)。然后可以将其集成到配置文件中interfaces
,在不支持该功能的地方使用up
/down
命令ifupdown
(即:所有策略路由)。请务必删除以前的手动测试,否则接口设置中的几个命令将与错误发生冲突,例如,RTNETLINK answers: File exists
并且接口配置将失败。
更新:这还包括向 SBTB 隧道的远端发出三个 ping,因为从评论来看,此隧道必须先看到来自服务器的流量,然后才能接受到服务器的流量。如果 SBTB(隧道)对等地址不足以触发接受到服务器的流量,请将其替换为某个“众所周知的”IPv6 地址。可以在 HE 接口上添加相同的内容,但这似乎没有必要。
auto he-ipv6
iface he-ipv6 inet6 v4tunnel
address 2001:xxx:xxx:xxxx::2
netmask 64
endpoint xx.xx.xx.xx
local yy.yy.yyy.yy
ttl 255
gateway 2001:xxx:xxx:xxxx::1
metric 1000
up ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6 table 2000
up ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000
up ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
up ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
down ip -6 rule del pref 20001
down ip -6 rule del pref 20000
auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
address 2a09:xxx:xxx:xxxx::2
netmask 64
endpoint zz.zz.zz.zz
local yy.yy.yyy.yy
ttl 255
gateway 2a09:xxx:xxx:xxxx::1
metric 1001
up ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6 table 2001
up ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001
up ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001
up ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001
up ping -q -c3 -I sbtb-ipv6 2a09:xxx:xxx:xxxx::1
down ip -6 rule del pref 20011
down ip -6 rule del pref 20010
如何使用?
现在可以启动一个或两个接口,它将始终正常工作,he-ipv6
当两个接口都启动时,将优先使用。要在两个接口都启动时使用该sbtb-ipv6
接口,应该绑定到其地址或绑定到接口本身。以下是显示内核预期使用的路由的示例:
# ip route get to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 src 2001:xxx:xxx:xxxx::2 metric 1000 pref medium
# ip route get from 2001:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2001:xxx:xxx:xxxx::2 via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium
# ip route get oif he-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium
# ip route get from 2a09:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2a09:xxx:xxx:xxxx::2 via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium
# ip route get oif sbtb-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium
各种命令、守护程序或工具需要各种选项来绑定到其他源地址或设备。例如:ping -I
、、、/等。traceroute -i
curl --interface
ssh -b
ssh -B
可以通过比较以下命令之一的结果来检查:
curl -6 https://ifconfig.co
curl -6 --interface 2001:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface he-ipv6 https://ifconfig.co
与下列结果之一相比:
curl -6 --interface 2a09:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface sbtb-ipv6 https://ifconfig.co