0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何优化去程的路由而保留原有的回程路由

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-09-22 09:55 次阅读

方案二个人感觉是一个更好的配置方案,并且其中的 wireguard 配置方式也在方案一中使用,步骤更简洁明确一些。所以推荐没有耐心看完的同学直接看方案二。

奇怪的环境产生奇怪的需求——现在有一台机器去程只有移动能够直连,电信和联通都会绕日走 ntt(tnt),一到了晚上就会产生剧烈的抖动以及严重丢包,那么是是否有办法去优化一下呢?使用一台移动网络的机器作为中转是一个方法,但是这样的话,所有的流量都会经过这台中转的机器,这台机器的速度成为了这个网络中的瓶颈,而且流量也会加倍消耗。既然我们只是去程绕路,那么是否有办法只优化去程的路由而保留原有的回程路由呢?在实际的互联网中“非对称路由”非常常见,即A 到 B 和 B 到 A 走了不同的路径,而我们要想实现这个效果则需要先建立一个虚拟的网络,然后再在这个网络中配置路由,我这里使用了 wireguard 作为建立虚拟内网的工具。

三台机器上的非对称路由

环境准备

在这个实验中使用了三台机器 :

本地机器 A wireguard 网内 ip 为 192.168.51.5 169.254.1.5

去程不错但是带宽较小的机器 B 192.168.51.1 169.254.1.1

去程绕路但是回程不绕且带宽较大的机器 C 192.168.51.2 169.254.1.2

需要实现的效果是 A 访问 C 路径为 A->B->C->A

在安装好 wireguard 后需要生成密钥且开启包转发 :

$aptinstallwireguardwireguard-tools
$wggenkey|teeprivatekey|wgpubkey>publickey

$echo"net.ipv4.ip_forward=1">>/etc/sysctl.conf
$echo"net.ipv6.conf.default.forwarding=1">>/etc/sysctl.conf
$echo"net.ipv6.conf.all.forwarding=1">>/etc/sysctl.conf
$sysctl-p

两两之间建立连接

下面直接贴一下三台机器的 wireguard 配置,注意一点 需要设置 Table=off,即禁止 wireguard 直接修改路由表 , 且这里使用的是链路本地地址建立的连接。另外,三台机器彼此之间要两两连接 (对应单独的一个配置文件), 也就是说需要自己写 6 个配置文件

节点 A 与节点 B 配置文件 :

[Interface]
PrivateKey=
ListenPort=27000
PostUp=ipaddradd169.254.1.5/32peer169.254.1.1/32dev%i
PostDown=ipaddrdel169.254.1.5/32peer169.254.1.1/32dev%i
Table=off
#B
[Peer]
PublicKey=
AllowedIPs=0.0.0.0/0
Endpoint=
PersistentKeepalive=10

节点 A 与节点 C 配置文件 :

[Interface]
PrivateKey=
ListenPort=27001
PostUp=ipaddradd169.254.1.5/32peer169.254.1.2/32dev%i
PostDown=ipaddrdel169.254.1.5/32peer169.254.1.2/32dev%i
Table=off
#C
[Peer]
PublicKey=
AllowedIPs=0.0.0.0/0
Endpoint=
PersistentKeepalive=10

节点 B 与节点 A 配置文件 :

[Interface]
PrivateKey=
ListenPort=27000
PostUp=ipaddradd169.254.1.1/32peer169.254.1.5/32dev%i
PostDown=ipaddrdel169.254.1.1/32peer169.254.1.5/32dev%i
Table=off
#A
[Peer]
PublicKey=
AllowedIPs=0.0.0.0/0

节点 B 与节点 C 配置文件 :

[Interface]
PrivateKey=
ListenPort=26002
PostUp=ipaddradd169.254.1.1/32peer169.254.1.2/32dev%i
PostDown=ipaddrdel169.254.1.1/32peer169.254.1.2/32dev%i
Table=off
#C
[Peer]
PublicKey=
AllowedIPs=0.0.0.0/0
Endpoint=

节点 C 与节点 A 配置文件 :

[Interface]
PrivateKey=
ListenPort=27001
PostUp=ipaddradd169.254.1.2/32peer169.254.1.5/32dev%i
PostDown=ipaddrdel169.254.1.2/32peer169.254.1.5/32dev%i
Table=off
#A
[Peer]
PublicKey=
AllowedIPs=0.0.0.0/0

节点 C 与节点 B 配置文件 :

[Interface]
PrivateKey=
ListenPort=26002
PostUp=ipaddradd169.254.1.2/32peer169.254.1.1/32dev%i
PostDown=ipaddrdel169.254.1.2/32peer169.254.1.1/32dev%i
Table=off
#thk
[Peer]
PublicKey=
AllowedIPs=0.0.0.0/0
Endpoint=

ip 分配与静态路由

在建立了两两之间的连接之后,我们还需要在每台机器上创建一个 dummy 网卡 (也可以写到 postup 里面),用来获取到发给自己的包。

以机器 A 为例,BC 上也要进行同样的操作 (记得改 ip)

#iplinkdeldummy
$iplinkadddummytypedummy
$ipaddradd192.168.50.5/32devdummy
$iplinksetdummyup

此时 192.168.50.5(A) 到 192.168.50.2(C) 是还没有路由的,不过我们希望去程经过节点 B,那么我们在 A 上设置静态路由 :

$iprouteadd192.168.51.2/32dev[AB之间连接对应的wireguard接口名]
#或者iprouteadd192.168.51.2/32via169.254.1.1

然后还需要在节点 B 上设置到 C 的静态路由 :

$iprouteadd192.168.51.2/32dev[BC之间连接对应的wireguard接口]
#或者iprouteadd192.168.51.2/32via169.254.1.2

此时,在 A 上 pingC,在 B 上抓包,我们便能得到如下结果 :

08b53b46-39bb-11ed-9e49-dac502259ad0.pngPING C

在 B 上只能看见单向的数据流,而 A 是可以得到回应的,再在 C 上抓包看看 :

C 上分别查看两个接口 B-C 与 C-A 的接口

08c0e98c-39bb-11ed-9e49-dac502259ad0.pngB-C 08d0f408-39bb-11ed-9e49-dac502259ad0.pngC-A

可以发现一点,实际上 B 作为路由进行转发时,源 ip 是什么是无所谓的,只需要有目的 ip 即可,而目的 ip 的路由方式通过静态路由指定了,那么在 C 上则会收到来自于 A 的链路本地地址 (169.254.1.5) 的包,而 C 与 A 直接连接,且 wireguard 创建了到 169.254.1.5 的连接,所以 C 的响应是可以不经过 B 直接走到 A 的。这样就实现了一个非对称的路由。现在的设置下,A 主动访问 C 时会经过 B,C 还没办法主动的连接 A,因为还没有设置 C 到 A 的静态路由,我们可以重复一遍前面的步骤,在 C 上与 B 上指定到 A 的静态路由,也可以直接让 C 访问 A 而不经过 A。不过由于该需求中我只需要 A 能够主动访问到 C 即可,所以不再进行这些设置。

为什么使用了链路本地地址

为什么在配置文件中使用了 169 开头的地址,而不是直接用 192 开头的地址建立连接并参与后续的路由设置呢?因为(至少是在我这种配置方式下),ip addr add xxx peer xxx 建立点对点连接时,会自动添加一条路由规则,会和我们后续添加的手动路由冲突。所以我只能退一步,使用另一个地址来建立点对点连接,然后用新的地址来设置静态路由。wireguard 工作在网络层,大概不支持不设置 ip 直接通过 mac 来连接 ?

只用两台机器实现非对称路由

上一节实现了三台机器组建的网络的非对称路由,那么能否更进一步,借助现有的“流量转发”服务,实现两台机器建立非对称路由呢?这样我们便不再需要第三台服务器转发去程,且优质线路在流量转发服务中也常见一些,且由于只有去程走了转发,实际上是花不了多少钱的。

个人测试下来,这个方案也很容易实现。以本地机器 A 与远程机器 C 为例,每台机器上都要设置两个 wireguard 接口,分别对应通过端口转发建立的 wireguard 以及直接连接建立的 wireguard。

命名如下 :

a1 本地对应的通过流量转发建立的 wireguard 连接的接口 169.254.2.1 192.168.51.3

a2 本地对应的通过直接连接建立的 wireguard 连接的接口 169.254.2.2 192.168.51.3

c1 远程对应的通过流量转发建立的 wireguard 连接接口 169.254.2.3 192.168.51.2

c2 远程对应的通过直接连接建立的 wireguard 连接接口 169.254.2.4 192.168.51.2

配置文件如下,注意这里没有用ip addr add peer的命令,而完全采用静态路由来实现,也不再需要 dummy 设备,而是直接使用了后面需要用的 ip。对,没写错,其实并没有规定一个 ip 只能分配给一个接口,只需要我们后面静态路由别写错就好,上一节采用三台服务器的方案也可以这样的配置形式,而不是用 dummy 接口。

a1 配置

[Interface]
PrivateKey=
Address=192.168.51.3/32
PostUp=iprouteadd192.168.51.2/32dev%i
#PostDown=
Table=off
#hkg
[Peer]
PublicKey=
AllowedIPs=0.0.0.0/0
Endpoint=[填写端口转发服务的地址]:14967
PersistentKeepalive=10

a2 配置a1 和 a2 只有 endpoint ip、端口不一样

[Interface]
PrivateKey=
Address=192.168.51.3/32
#PostUp=
#PostDown=
Table=off
#hkg
[Peer]
PublicKey=
AllowedIPs=0.0.0.0/0
Endpoint=[C的地址]:14967
PersistentKeepalive=10

c1、c2 配置,注意c1 和 c2 只有端口不一样

[Interface]
PrivateKey=
ListenPort=27002
Address=192.168.51.2/32
PostUp=iprouteadd192.168.51.3/32dev%i#c2配置文件进行该设置,指定直连
#PostDown=
Table=off
#local
[Peer]
PublicKey=
AllowedIPs=0.0.0.0/0

然后配置静态路由

本地机器上,去程通过 a1(经过流量转发) ip route add 192.168.51.2/32 dev a1

远程机器上,回程直连 ip route add 192.168.51.2/32 dev c2

之后我们尝试在本地ping 192.168.51.2看看效果

08e14f9c-39bb-11ed-9e49-dac502259ad0.png

延迟降低到了 30ms,而之前去程绕日 ntt 延迟有 70ms,并且抖动剧烈,可以看出效果还是很明显的。

总结

目前的方案感觉依旧不是最优解,用链路本地地址建立连接再添加 dummy 设备多少有些繁琐,计算机网络上还有很多我没搞清楚的,且这个网络节点较少,在较多 (>3) 路由节点的情况下,是否能直接这样简单的配置还是一个问题。不过关于这方面的资料实在是太少了,而当前的配置方法虽然比较麻烦,但是也不是不能用,还望大家多多指教,有更好的连接方式请留下评论给我一点提示。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 路由
    +关注

    关注

    0

    文章

    278

    浏览量

    41854
  • 移动网络
    +关注

    关注

    2

    文章

    444

    浏览量

    32880
  • 机器
    +关注

    关注

    0

    文章

    782

    浏览量

    40739

原文标题:如何使用 WireGuard 组建非对称路由

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    低端路由器和高端路由的区别

    类似的疑问--“为什么一样的功能,这款路由器这么贵,另外一款又这么便宜”、“为什么JCG的路由器这么贵?TP-LINK的这么便宜?”、“这两款路由器的主要参数都一样,为什么性能却相差
    发表于 06-26 14:11

    请问替换协调器在不重启这些路由节点的情况能让协调器C2控制所有的路由节点吗

    协调器发送给路由节点的控制指令一直是Router Request请求他的短地址,而这些路由节点没有一个转发,或者发路由回复。断点调试的
    发表于 08-19 07:11

    为什么lwip dhcp功能有的路由器能成功有的路由器不成功?

    lwip dhcp功能有的路由器能成功有的路由器不成功,网上说是lwip dhcp的option不全,将电脑的dhcp的option添加进去就可以了,修改lwip的源码,但不知道怎么做
    发表于 09-29 22:10

    路由控制和路由选择

    我们可以使用路由策略来控制路由的引入、分发、选择过程;可以使用策略路由来改变数据包的默认的转发行为和转发路径。通过路由策略和策略路由,我们可
    发表于 06-24 16:23 2次下载

    静态路由协议概述

    课程说明 . 1课介绍. 1课目标. 1相关资料. 1第一节 路由协议概述 11.1 概述. . 21.2 路由协议简介 21.3 静态路由
    发表于 06-24 17:40 10次下载

    基于移动IP的路由优化研究

    移动IP 是一种简单且可扩展的全球IP 移动性的解决方案,但是“三角路由”一直是移动IP 中需要解决的一个关键问题。文章首先针对现有“三角路由”问题的优化方案进行了研
    发表于 01-22 12:44 15次下载

    基于DynamipsGUI的网络路由优化实验设计

    策略路由是网络优化的常用方法。利用DynamipsGUI搭建网络环境,配置路由策略,模拟了报文大小分别为60、500和1800三种数据报文从路由器转发时,
    发表于 07-26 11:25 16次下载
    基于DynamipsGUI的网络<b class='flag-5'>路由</b><b class='flag-5'>优化</b>实验设计

    避免路由断裂的优化AODV路由协议

    移动自组织网络( Mobile Ad Hoc NETwork.MANET)是一种自组织、对等式、多跳无线移动网络,网络中的节点具有主机和路由器的功能。该网络应用在没有基础设施的环境下,通过节点自己
    发表于 01-29 10:31 0次下载
    避免<b class='flag-5'>路由</b>断裂的<b class='flag-5'>优化</b>AODV<b class='flag-5'>路由</b>协议

    无线路由器的设置优化指南

    无线路由器现在是家庭必备产品,我们在使用过程中也可能遇到众多的小问题,比如网速忽然变慢等,其实很多情况下并不是路由器配置的问题,很大的可能是其他家电设备或其他路由器信号干扰导致的,那么我们要怎么
    的头像 发表于 03-21 15:34 3374次阅读

    路由和硬路由的区别

    路由的费用较软路由大,一个300元的软路由的功能就可以与万元级别的硬路由相媲美,对于预算较少的用户来说,使用软路由比硬
    发表于 03-26 09:23 1.5w次阅读

    路由如何进入bios

    路由是指利用台式机或服务器配合软件形成路由解决方案,主要靠软件的设置,达成路由器的功能;路由则是以特
    发表于 03-26 10:00 7900次阅读

    如何优化您的无线路由

    星创易联教你如何优化您的无线路由
    发表于 11-08 14:53 1235次阅读

    如何优化您的无线路由

    优化您的无线路由器应该知道什么 重新定位您的路由器、更新其固件和添加新天线通常会增强信号。将某些类型的流量分类到双频路由器的不同频段和信道上将减少
    发表于 11-25 15:48 1166次阅读
    如何<b class='flag-5'>优化</b>您的无线<b class='flag-5'>路由</b>器

    什么是路由表?IP路由表包含了哪些要素?

    路由表:简单点说路由表就是路由器用于指导数据包如何转发的表项,记录了往目的IP的下一跳哪里(如下图)。
    的头像 发表于 12-04 09:36 1.4w次阅读
    什么是<b class='flag-5'>路由</b>表?IP<b class='flag-5'>路由</b>表包含了哪些要素?

    恒讯科技分析:常用的vps路由测试的工具和方法

    VPS(虚拟私人服务器)路由测试是评估服务器网络性能的重要环节,以下是一些常用的工具和方法: 1、BestTrace:这是一款路由追踪客户端软件,可以测试VPS的
    的头像 发表于 08-08 22:54 370次阅读