本文转自遨游者的博客,原文:https://aoyouer.com/posts/wireguard-asymmetric-routing/,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang

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

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

三台机器上的非对称路由

环境准备

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

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

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

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

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

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

$ apt install wireguard wireguard-tools
$ wg genkey  | tee privatekey | wg pubkey > 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 = ip addr add 169.254.1.5/32 peer 169.254.1.1/32 dev %i
PostDown = ip addr del 169.254.1.5/32 peer 169.254.1.1/32 dev %i
Table = off
# B
[Peer]
PublicKey =
AllowedIPs = 0.0.0.0/0
Endpoint =
PersistentKeepalive = 10

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

[Interface]
PrivateKey =
ListenPort = 27001
PostUp = ip addr add 169.254.1.5/32 peer 169.254.1.2/32 dev %i
PostDown = ip addr del 169.254.1.5/32 peer 169.254.1.2/32 dev %i
Table = off
# C
[Peer]
PublicKey =
AllowedIPs = 0.0.0.0/0
Endpoint =
PersistentKeepalive = 10

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

[Interface]
PrivateKey =
ListenPort = 27000
PostUp = ip addr add 169.254.1.1/32 peer 169.254.1.5/32 dev %i
PostDown = ip addr del 169.254.1.1/32 peer 169.254.1.5/32 dev %i
Table = off
#A
[Peer]
PublicKey =
AllowedIPs = 0.0.0.0/0

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

[Interface]
PrivateKey =
ListenPort = 26002
PostUp = ip addr add 169.254.1.1/32 peer 169.254.1.2/32 dev %i
PostDown = ip addr del 169.254.1.1/32 peer 169.254.1.2/32 dev %i
Table = off
# C
[Peer]
PublicKey =
AllowedIPs = 0.0.0.0/0
Endpoint =

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

[Interface]
PrivateKey =
ListenPort = 27001
PostUp = ip addr add 169.254.1.2/32 peer 169.254.1.5/32 dev %i
PostDown = ip addr del 169.254.1.2/32 peer 169.254.1.5/32 dev %i
Table = off
#A
[Peer]
PublicKey =
AllowedIPs = 0.0.0.0/0

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

[Interface]
PrivateKey =
ListenPort = 26002
PostUp = ip addr add 169.254.1.2/32 peer 169.254.1.1/32 dev %i
PostDown = ip addr del 169.254.1.2/32 peer 169.254.1.1/32 dev %i
Table = off
# thk
[Peer]
PublicKey =
AllowedIPs = 0.0.0.0/0
Endpoint =

ip 分配与静态路由

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

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

# ip link del dummy
$ ip link add dummy type dummy
$ ip addr add 192.168.50.5/32 dev dummy
$ ip link set dummy up

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

$ ip route add 192.168.51.2/32 dev [AB之间连接对应的wireguard接口名]
# 或者 ip route add 192.168.51.2/32 via 169.254.1.1

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

$ ip route add 192.168.51.2/32 dev [BC之间连接对应的wireguard接口]
# 或者 ip route add 192.168.51.2/32 via 169.254.1.2

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

PING C

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

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

B-C

C-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。

命名如下 :

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

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

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

  4. 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 = ip route add 192.168.51.2/32 dev %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 = ip route add 192.168.51.3/32 dev %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 看看效果

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

总结

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

上面那段总结是针对方案 1 的,而针对方案 2 的配置方式,我觉得可以很好的实现这个需求,并且效果还挺不错,并且只需要在本地与远程两台服务器上进行配置即可。

你可能还喜欢

点击下方图片即可阅读

彻底理解 WireGuard 的路由策略

2022-08-31

CentOS7 好日子到头了,如何优雅的抛弃 CentOS7?

2022-08-30

rsync+inotify 数据实时同步介绍与 K8s 实战应用

2022-08-26

Kubernetes 网络排错骨灰级指南!

2022-08-25

云原生是一种信仰 

使用 WireGuard 组建非对称路由以降低延迟相关推荐

  1. linux内核路由反向检查,Linux非对称路由

    首先解释一下什么是对称路由和不对称路由. 对称路由:symmetric route,指从A到B所走的路由和从B到A所走的路由是相同的 不对称路由:asymmetric route,指从A到B所走的路由 ...

  2. DNF【地下城】修改IP降低延迟方法防封号方法

    对于大部分搬砖党而言,搬砖是一件持之以恒的事情.你只需要几个成型号,当然是轻松无比,需要的只是时间而已.但是在你的账户都还没有成型前呢?一点点技巧可以给你剩下很多时间! 第一,血色防线 血色防线 搬砖 ...

  3. HLS直播降低延迟的方法

    HLS推流,我们一般常用的搞法是通过ffmpeg接收直播流,进行转码切片后,将生成的ts放在磁盘上通过nginx代理进行对外推流服务,基于这种情况HLS直播降低延迟主要集中在以下几个点 1.将磁盘进行 ...

  4. Switch搭配“廉价采集卡”时,稍稍降低延迟的设置方法

    由于软硬件配置等差异因素,不同设备上的延迟可能存在差异,以下仅供参考. Switch通过廉价采集卡接笔记本电脑时,降低延迟的设置方法. 1. 测试软硬件环境 电脑:笔记本电脑 测试显卡:Intel三代 ...

  5. tcgames使用有延迟_教你用tcgames电脑玩刺激战场匹配手机的正确姿势:如何降低延迟卡顿...

    电脑玩刺激战场如何不被检测模拟器匹配手机玩家?用tcgames模拟器玩刺激战场怎么解决延迟卡顿问题?玩吃鸡应该大部分都用过模拟器和tcgames吧,一个是在电脑上下载游戏键鼠玩,一个是把手机投屏在电脑 ...

  6. 战地无服务器看不到延迟,《战地1》降低延迟技巧 如何进入低延迟服务器

    当前位置:电玩巴士游戏专题 战地1 <战地1>降低延迟技巧 如何进入低延迟服务器 作者:李南辛嗷嗷叫 来源:战地1吧 发布时间:2016年10月21日 <战地1>最大的魅力就在 ...

  7. 教你用tcgames电脑玩刺激战场匹配手机的正确姿势:如何降低延迟卡顿

    电脑玩刺激战场如何不被检测模拟器匹配手机玩家?用tcgames模拟器玩刺激战场怎么解决延迟卡顿问题?玩吃鸡应该大部分都用过模拟器和tcgames吧,一个是在电脑上下载游戏键鼠玩,一个是把手机投屏在电脑 ...

  8. 降低延迟,视频直播APP要这样开发

    近几年的视频直播APP市场可以说是格外的火热,可是在这个火热的背后,有一个一直困扰开发者的难题,那就是视频直播软件的延迟现象,如何降低延迟呢?在开发时候要怎么做呢? 1.编码上的优化 在开发视频直播A ...

  9. 揭秘阿里云 RTS SDK 如何实现直播降低延迟和卡顿

    简介:这个夏天,没什么能够比一场酣畅淋漓的奥运比赛来的过瘾.但是,在视频平台直播观看比赛也有痛点:"卡顿" 和 "延时".受限于不同地域.复杂的网络情况.传输速 ...

最新文章

  1. 关于vmware workstation10常见问题
  2. [召集] .NET Framework基本类库中的设计模式
  3. html定义一个集合,HTML标签属性集合
  4. Gitlab自动触发Jenkins构建项目
  5. 全网最新Redis结合Kaptcha实现验证码功能篇二(前后端分离)
  6. android 元素点击位置,appium自动化操作之元素定位点击事件全家桶(find_element_by、find_elements_by)...
  7. 提高你css技能的css开发技巧
  8. 下载css-loader 安装及使用
  9. 基于matplotlib对iris数据集进行数据分析
  10. 打蚊子表情包_打死蚊子表情包 - 打死蚊子微信表情包 - 打死蚊子QQ表情包 - 发表情 fabiaoqing.com...
  11. python爬取起点中文网_Python3爬取起点中文网阅读量信息,解决文字反爬~~~附源代码...
  12. 一起找BUG,谷歌推出全新漏洞悬赏平台
  13. 《巴菲特法则》书中的精髓:用好巴菲特企业前景投资法则,股票投资稳赚不赔。
  14. logback之三:输出日志到文件(滚动)
  15. 亮紫色晶体meso四(4-氨基苯基)卟啉TAPP/TAPPPt/TAPPCo/TAPPCd/TAPPZn/TAPPPd/TAPPCu/TAPPNi/TAPPFe/TAPPMn金属配合物-齐岳供应
  16. python snownlp情感分析和词云分析
  17. Visual Studio 6.0 安装失败 解决办法
  18. 一张图告诉你,MES系统是什么
  19. Embedded software development engineer self-introduction
  20. 远程访问大华摄像头拍摄的视频

热门文章

  1. 【翻译】通过CMD3.1来实现自定义基于海王星主题的Ext JS 4.1应用程序
  2. 用js实现ATM机存取款功能
  3. 高通sdm660 uart dts配置
  4. 遍历map的几种方式
  5. 将二叉树转化成最大堆或最小堆
  6. 苹果软件更新在哪里_涨知识!手机经常弹出“更新系统”提示,到底要不要更新?...
  7. 2018 前端性能检查表
  8. 解决企业微信启动报错:0x0000142无法打开
  9. AMD1700x+MSI(X370)VMware 报错
  10. 国产高精度比较器MS762/M、MS761 对标SGM8742YMS8