当前位置: 首页 > 科技观察

如何使用WireGuard设置非对称路由

时间:2023-03-14 10:37:15 科技观察

?方案二感觉配置方案比较好,方案一也使用了wireguard的配置方式,步骤更加简洁明了。所以建议没耐心看的同学直接看选项2,陌生的环境产生奇怪的需求——现在有一台机器只能直连移动,电信联通绕太阳转ntt(tnt),而且晚上抖动严重,丢包严重,请问有什么办法可以优化吗?使用移动网络机器作为中转是一种方式,但在这种情况下,所有流量都会通过这台中转机,这台机器的速度就变成了网络的速度。瓶颈,流量消耗将成倍增加。既然我们只绕了去程路线,有没有办法优化去程路线,同时保留原来的回程路线呢?在实际的互联网中,“非对称路由”是很常见的。即A到B和B到A走的是不同的路径,如果要达到这种效果,我们需要先建立一个虚拟网络,然后在这个网络中配置路由。我在这里使用wireguard作为虚拟内网工具。三台机器上的非对称路由环境准备。本次实验使用三台机器:本机A,wireguard网络ip192.168.51.5169.254.1.5。出站好但带宽较小的机器B:192.168.51.1169.254.1.1机器C192.168.51.2169.254.1.2需要达到出站绕路,返回不绕路,带宽大的效果。A访问C的路径是A->B->C->A安装wireguard后需要生成key并开启包转发:$aptinstallwireguardwireguard-tools$wggenkey|三通私钥|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-pestablishaconnectionbetween直接在下面贴出三台机器的wireguard配置。注意需要设置Table=off,即禁止wireguard直接修改路由表,这里使用的是link-local地址建立的连接。另外,三台机器需要成对连接(对应一个单独的配置文件),也就是说需要自己写6个配置文件NodeA和NodeB的配置文件:[Interface]PrivateKey=ListenPort=27000PostUp=ipaddr添加169.254.1.5/32peer169.254.1.1/32dev%iPostDown=ipaddrdel169.254.1.5/32peer169.254.1.1/32dev%iTable=off#B[Peer]PublicKey=AllowedIPs=0.0.0.0/0Endpoint=PersistentKeepalive=10节点A和节点C配置文件:[Interface]PrivateKey=ListenPort=27001PostUp=ipaddradd169.254.1.5/32peer169.254.1.2/32dev%iPostDown=ipaddrdel169.254.1.5/32peer4.19.25/32dev%iTable=off#C[Peer]PublicKey=AllowedIPs=0.0.0.0/0Endpoint=PersistentKeepalive=10节点B和节点A配置文件:[Interface]PrivateKey=ListenPort=27000PostUp=ipaddradd169.254。1.1/32peer169.254.1.5/32dev%iPostDown=ipaddrdel169.254.1.1/32peer169.254.1.5/32dev%iTable=off#A[Peer]PublicKey=AllowedIPs=0.0.0.0/0节点B和节点C配置文件:[Interface]PrivateKey=ListenPort=26002PostUp=ipaddradd169.254.1.1/32peer169.254.1.2/32dev%iPostDown=ipaddrdel169.254.1.1/32peer169.254.1.2/32dev%iTable=off#C[Peer]PublicKey=AllowedIPs=0.0.0.0/0Endpoint=节点C和节点A配置文件:[Interface]PrivateKey=ListenPort=27001PostUp=ipaddradd169.254.1.2/32peer169.254.1.5/32dev%iPostDown=ipaddrdel169.254.1.2/32peer169.254.1.5/32dev%iTable=off#A[Peerlowed]PublicKey=All0.0.0.0/0节点C和节点B配置文件:[Interface]PrivateKey=ListenPort=26002PostUp=ipaddradd169.254.1.2/32peer169.254.1.1/32dev%iPostDown=ipaddrdel169.254.1.2/32peer169.254。1.1/32dev%iTable=off#thk[Peer]PublicKey=AllowedIPs=0.0.0.0/0Endpoint=ip分配和静态路由两者建立连接后,我们还需要创建一个虚拟网卡(也可以写成intopostup),用于获取发送给自己的包裹以机器A为例,在BC上做同样的操作(记得改ip)#iplinkdeldummy$iplinkadddummytypedummy$ipaddradd192.168.50.5/32devdummy$iplinksetdummyupAt此时从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[BetweenBCConnecttothecorrespondingwireguardinterface]#oriprouteadd192.168.51.2/32via169.254.1.2此时在A上pingC,在B上抓包,可以得到如下结果:PINGConB只能看到数据流的单向,A能得到响应,然后在C上抓包看:在C上,分别查看B-C和C-A这两个接口的接口B-CC-A,而你能找到一点,其实B是作为路由转发的,这种情况下,源ip是什么无所谓,只需要目的ip,目的ip的路由方式由静态路由指定,则C会收到链路本地地址(169.254.1.5),C直接连接到A,而wireguard已经创建了到169.254.1.5的连接,所以C的响应可以直接到A而无需经过B。这实现了非对称路由。当前设置下,A主动访问C时,会经过B,C没有办法主动连接A,因为没有设置C到A的静态路由,我们可以重复前面的步骤,指定C和B上的路由。A的静态路由也可以直接让C访问A而不经过A。但是由于我在这个需求中只需要A主动访问C,所以就不再需要做这些设置了。为什么使用链路本地地址?为什么在配置文件中使用169开头的地址,而不是直接使用192开头的地址建立连接,参与后续的路由设置呢?因为(至少在我的配置中),ipaddraddxxxpeerxxx建立点对点连接的时候,会自动添加一条路由规则,这会和我们后面手动添加的路由冲突。于是只能退而求其次,用另一个地址建立点对点的连接,然后用新地址建立静态路由。Wireguard工作在网络层。大概不支持不设置ip直接通过mac连接吧?只用两台机器实现非对称路由。现有的“流量转发”服务如何实现两台机器之间建立非对称路由?这样一来,我们就不再需要第三台服务器来转发出站了,优质的线路在流量转发服务中也很常见,而且因为只转发出站,所以其实成本并不高。经过亲身测试,这个方案也很容易实现。以本地机器A和远程机器C为例,每台机器上都要设置两个wireguard接口,分别对应端口转发建立的wireguard和直连建立的wireguard。名称如下:a1本地流量转发建立的wireguard连接对应的接口169.254.2.1192.168.51.3a2本地直连建立的wireguard连接对应的接口169.254.2.2wireguard连接接口169.254.2.3192.168。51.2c2对应通过直连建立的wireguard连接接口169.254.2.4192.168.51.2。不再需要dummydevice,而是直接使用后面要用到的ip。恩,那就对了。其实并没有规定一个ip只能分配给一个接口。我们只需要确定静态路由没有错就可以了。上一节中使用三台服务器的解决方案也可以这样配置,而不是使用虚拟接口。a1配置:[Interface]PrivateKey=Address=192.168.51.3/32PostUp=iprouteadd192.168.51.2/32dev%i#PostDown=Table=off#hkg[Peer]PublicKey=AllowedIPs=0.0.0.0/0Endpoint=[fill端口转发服务地址]:14967PersistentKeepalive=10a2配置a1和a2只是端点ip和端口不同:[Interface]PrivateKey=Address=192.168.51.3/32#PostUp=#PostDown=Table=off#hkg[Peer]PublicKey=AllowedIPs=0.0.0.0/0Endpoint=[AddressofC]:14967PersistentKeepalive=10c1,c2配置,注意c1和c2只有端口不同:[Interface]PrivateKey=ListenPort=27002Address=192.168.51.2/32PostUp=iprouteadd192.168。51.3/32dev%i#c2的配置文件为这个设置,指定直接连接#PostDown=Table=off#local[Peer]PublicKey=AllowedIPs=0.0.0.0/0然后在本机配置静态路由,出站通过a1(流量转发后)iprouteadd192.168.51.2/32deva1在远程机器上,回程后直连iprouteadd192.168.51.2/32devc2,我们在本地尝试ping192.168.51.2看看效果。延迟降低到30ms,而之前绕太阳出境的ntt延迟为70ms,抖动严重。可见效果还是很明显的。综上所述,目前的方案仍然不是最优方案。用链路本地地址建立连接然后添加一个虚拟设备有点麻烦。计算机网络上还有很多东西没有弄明白,而且这个网络节点少,多(>3)路由节点的情况下,这么简单的配置能不能直接搞定还是个问题。不过这方面的资料太少了,目前的配置方式虽然比较麻烦,但也不是不能用。以上总结是针对方案一,针对方案二的配置方式,我觉得这个需求可以很好的实现,而且效果还是比较不错的,只需要在本地和远程服务器上配置即可。