这是折腾dn11网络的一部分。dn11是杭电校内同学自发组织的一个去中心化网络,用于进行组网实验。我们致力于从零然后逐步开始配置各类路由协议并最终搭建一个完整的互联网。更多相关内容欢迎访问dn11官方网站进行了解。

0x01 发生了什么?

首先由于校内网络使用dhcp来分发ip,所以每个人拥有的ip不是固定的。为了解决这个我自己实现了一套ddns,动态解析我的校内内网ip,至于为什么我要自己写一套脚本以及我的具体实现的话,以后说不准会更新一篇新的博客吧。 (挖坑.jpg)
然后某一天我刷新我的ip之后,我发现我下线了,我所有的隧道的peer都ping不到了。

0x02 网络结构大概是怎么样的?

校内是一个大内网,生活区所有的楼共享一个ip池子(10.xxx.0.0/16段),使用dhcp进行分发。
我的peer那边应该是用了一个openwrt的路由,然后由这个路由作为隧道的端点。
我因为需要给宿舍供网,需要一点稳定性,所以没有用openwrt的路由,用的是中兴的晴天BE5100墙面路由(支持全锥形nat、upnp、端口转发、修改防火墙等特性)。然后路由器下面连接一个交换机,交换机下面是我的nas和我自己的笔记本。然后我将我的隧道节点放在了我的内网nas上。

0x03 我做了什么,是如何排查的?

当时首先我认为是我自己配置问题以及ip没有及时更新啥的,所以先是直接在我自己隧道端点这边重启了所有wg隧道的网卡,然后ping了peer的隧道ip和端点ip。然后发现,两边端点是通的,但是隧道依旧不通,dn11的网络也依然是断的。
所以无计可施,只能找peer那边帮我看一下。然后发现对方wg show显示的隧道端点的端口和我原先提供的不一样。新的端口号像是一个随机分配到端口。
在进一步沟通并咨询亲爱的ds老师之后,我们得到了一个较可靠的原因:路由器的nat机制和wg自己的roaming机制。 但凡少了任意一个都不一定能有这个问题,因为隧道不一定能连上了

0x04 所以具体是什么问题?

首先路由器的nat机制会将一个外网的ip端口四元组映射到内网真实目标的ip和端口号。然后在这个过程中,路由器会随机分配一个外部端口号给对方。然后对方的wg端点在接收到我这里路由器返回的外部ip和外部端口号之后,会将原来设定的端口号修改为路由器实际给的外部端口号,而这也就是wg自己的roamimg机制。
然后在我的ip变更之后,路由器内部的nat映射表会被清空,所以上一次分配的端口号的映射也就不复存在,但是对方的wg还保留了我之前的外部端口,这样也就导致了两边的wg连接无法建立。

0x05 so。。解决方案?

首先就是需要在路由器添加端口映射,将wg流量的端口转发固定下来,并且最好和我们的内网端口号是一样的,这样可以避免修改。
当然,这样大概无法修改对方wg的连接信息,所以对端嘛,还是只能手动通知一下对方重启一下网卡了。。。。(笑)
然后对中兴路由器来说,路由器的防火墙最好也关了,或者降低等级(中兴路由器需要中低才能ping到路由器,不能单独添加icmp等协议;当然,路由器直接接公网的还是算了,我这里是内网,所以问题不大),然后开upnp(用于内网识别路由器wan ip;不一定公网ip) 。

0x06 最后的最后

如果想折腾网络,最好还是买一个开发板或者小主机,然后刷openwrt好了((。