软路由系列 爱快+openwrt最佳部署方案探讨(再见吧,旁路由)
本文最后更新于 288 天前,其中的信息可能已经有所发展或是发生改变,如有失效可到评论区留言。

前言

我正式开始玩路由器应该netgear的R7000:

image.png

不过那时候好像还是adsl 8兆的时代,上行才512k,所以开始也没怎么折腾,就用的官方固件。而且印象中那时候的封锁远远不能和现在相比,影响还不算大,所以也没有花时间折腾的想法。

过了几年之后,封锁越来越严,已经影响到平时工作了(外企技术工程师需要访问国外网站的时候太多了),不得不考虑科学问题了,所以就把R7000刷了梅林系统并使用软件中心安装了shadowsocks就凑活着继续用了(讲道理,R7000性能拿到现在依然能打,只是wifi弱了点)。

多拨引发的血案-开始折腾

不知道哪一天,忽然看到了多重拨号的文章,卧槽,居然还能这么玩,一看梅林也支持双线单拨,马上就试了一下,运气不错,发现家里电信宽带真可以。。但是梅林的双线双拨功能太简单,要么只能主备,要么只能两条一起负载均衡使用,可玩性太差(毕竟我也是专业卖链路负载均衡设备的,有点高要求也很合理吧~~),所以就考虑其他支持多重拨号的方案,然后就看到了lede和爱快。

lede(就是openwrt的一个分支)其实也行,不过,一来我不太习惯lede的配置逻辑,比如input链,output链,forward链这些iptables的概念(和配置大量cisoc、华为三层交换机、路由器,还有各种型号的防火墙之后养成的习惯相比),总不能立刻反应过来,需要大脑翻译一下,这对于我这种配置排错靠本能的人来说很别扭;二来,尝试过爱快之后,发现爱快除了在多拨上的完美支持之外,其他各种功能也和多拨功能紧密结合在一起(参看我另一篇文章:爱快软路由系列 最强多拨软路由:爱快),并且也很符合国人配置的习惯,所以最终选择了爱快作为主路由,R7000做二级路由,所以第一次变更网络结构变成了下面这样:

image.png

这种结构我直接把所有设备的默认网关指向R7000的lan口地址,而R7000的wan口采用静态IP模式,直接将默认路由指向了爱快的lan口地址,并且这里可以把R7000的NAT功能关掉:

image.png

这是因为都串在网络中了,只是当个三层交换机用而已,根本不需要NAT,而且,关闭NAT还有一个好处,就是爱快做端口映射的时候可以直接指向内网192.168.1.x网段主机的真实内网地址(当然爱快上要写192.168.1.x网段的回程路由并指向梅林的wan口地址),否则还需要R7000上进行二次映射。从内到外2次NAT,从外到内2次映射,多此一举又没任何好处,所以直接关掉NAT就好了。


可能这里大家可能会有疑问:为什么R7000不用旁路由模式?其实从专业角度来讲,并没有旁路由这个概念,正确的说法应该是支持单IP混杂模式收包、转发同时进行NAT。

一般来讲,正常主机设备的网卡在正常模式的时候只会接收目标地址是网卡本身IP的包,其他的包会直接丢弃,而要想接收目标IP不是自己的包,就需要将网卡设置为混杂模式(我记得以前win上装wireshark的时候还会提示)。

那么要想实现旁路由的功能,起码这个设备要支持2个功能:

1、网卡要支持混杂模式或者能够设置为混杂模式
这点所有路由器的lan口都是默认打开的,而linux之类的设备可以使用命令打开,例如:

ip link set eth0 promisc on

2、支持单IP转发并能同时进行NAT
这点家用级的宽带路由器就不行了,因为一般都是只能从lan口收包然后从wan口发出去并同时以wan口的地址进行NAT(好点的系统还有个是否进行nat的开关,一般的连nat都是写死的,关不了)。

而这点对linux就根本不是个事了,要知道iptables的forward链就是用来干这个事情的,如果linux上有2块ip是不同网段的网卡且开启了forward,直接就变身成一台三层交换机(当然,交换性能另说),而如果只有一个网卡的话,开启转发再开IP伪装(就是nat),直接就变成了现在的所谓单臂旁路由。


第一次优化

这种结构几年,其实到也没什么问题,只不过我经常折腾R7000:梅林刷新固件、shadowsocks升级,不正常了就重启一下R7000,重启的时候就会导致网络中断,非常不爽,加上我也还是想主路由和所有客户端在一个网段,方便网络唤醒之类的操作,所以想了想,打算换一种网络结构,加上当时R7000已经属于老型号了,梅林固件和科学插件支持都不太好,所以就狠心换成了华硕AC66uB1:

image.png

然后第二次变更网络结构后变成这样:

image.png

这种结构的好处就是主路由所有用户的默认网关指向爱快的lan口地址即可,至于那些需要科学的用户,只需要在爱快上配置端口分流或者域名分流:
image.png

image.png

把对应的用户源IP地址或者特定域名的访问指向爱快wan3口上即可,同时,AC66uB1就算死机故障或者科学出问题也不会影响所有客户端的正常的网络访问(同样,爱快上也可以关闭wan3口的NAT,不过附带的需要在AC66uB1上添加到内网的回程路由)。

但是,这种结构也有缺点,就是有一重拨号是放在AC66uB1上,没有3重拨号都在爱快上时那样方便运维和流量的负载,并且如果要从wan3口进行端口映射,必须在AC66uB1上配置,不太方便。不过总的来说,还是利大于弊的。

第二次优化

又过几年,我越来越觉得上图这种接法很别扭,强迫症很难受,又想继续优化,于是,路由器顺便升级到现在的AC86u:

image.png

然后经过第三次网络结构调整之后,变成下面这样:

image.png

这种结构的好处是拨号全部统一回到了爱快上,3条链路的上行都可以方便的利用起来,同时客户端依旧只需要将默认网关指向爱快,依旧由爱快基于源IP或者目标域名将需要科学的客户端流量从wan3口发送到AC86u的lan口(需要启用NAT,爱快默认所有wan口发出的数据都是启用了NAT的),而AC86u的wan口接回内网(也必须开启NAT)。这种部署方式也依旧保留了AC86u死机或者科学中断也不会影响所有客户端的正常上网的优点,这就是双硬件路由时的最佳拓扑结构了。

另:由于wan1口单线3拨,还省出了一个wan2口可以连IPTV,所以就随便把IPTV功能从梅林上移到了爱快,这下强迫症舒服了,关键把梅林上的功能进一步单一化,可替代性也更强了。关于爱快上配置IPTV,参见文章:爱快软路由系列 实现电信IPTV全媒体播放

最终优化

但是,这个结构我依旧觉得有点不爽:第一,华硕路由器那么贵的价格,很大一部分是在路由器的wifi上,但是我wifi是用的netgear的mesh,所以华硕路由器的wifi我是完全浪费的;第二,现在正常上网的大流量又不经过AC86u,路由器最主要的作用是科学,所以对性能要求其实也不算大,这种情况下其实随便跑个虚拟化设备已经完全可以了,为了科学一年365天多开一个硬件从电费上考虑怎么想怎么不划算;第三,万一坏了难不成我还要再去买?以前用是有历史原因,还情有可原,再买就太low了啊,所以我才开始折腾openwrt(参看我前2篇文章:OpenWrt软路由系列 PVE部署OpenWrt(23.05.2)详细教程OpenWrt软路由系列 必装软件3剑客:openclash+sftpserver+tailscale安装教程)。

然后就有了最终方案:

image.png

其实就是用PVE上的一个虚拟机来跑openwrt,替代AC86u,当然,openwrt上需要先进行相关配置,有如下几个要点:
1、openwrt硬件需要双网卡(默认只有一个,需要添加一个):
image.png

2、openwrt上正确配置接口
image.png

image.png

3、正确配置防火墙区域

这里的lan区域和wan区域和通常情况下的有点不太一样,因为通常情况下流量只从lan口进,wan口出并进行nat,而我这种结构下lan和wan都有流量进入,区别只是lan口是专门给爱快用的,wan口是给内网用户使用的(不是用来配置默认网关,而是给内网用户用来访问openclash自带的socks5和http代理)。

对于iptables来讲,它只看网卡区域对应的input链、output链和forward链的配置,而我这种结构下防火墙区域设置如下:

image.png

用户端设置默认网关的两种方式

1、用户默认网关指向openwrt的lan口IP(不推荐)

对于内网用户而言,如果直接把默认网关指向openwrt的wan口IP,所有的非本网段的流量都会直接到达openwrt(包括需要科学的流量),openwrt直接就根据已有的策略来处理需要科学的流量,不需要科学处理的流量被openwrt直接nat后发送到爱快的lan口进行正常上网流量的处理,这就是通常所谓的单臂旁路由模式。这种部署方式主打一个简单粗暴,好处没多少,坏处倒是一大堆:一旦openwrt死机,则所有网关指过来的客户端都无法上网;openwrt部分性能都用在转发和nat不需要科学的流量上,而需要科学的流量反而耗费的性能很少;如果主路由爱快上做了端口映射到客户端,而客户端的默认网关又指向了openwrt,可能会导致openwrt给客户端发送ICMP重定向等等。

2、用户默认网关指向爱快的lan口IP(强烈推荐)

内网用户默认网关指向爱快的lan口地址,则爱快就可以根据分流策略把需要科学的用户请求通过wan3口发到openwrt的lan口,然后openwrt再根据已有的策略来处理科学流量,虽然多了爱快这一步分流操作,但是却带来了客户端不用改网关、科学设备故障也不影响正常上网、方便新linux系统一步科学等天大的好处(想想一个新装的linux系统apt下不动软件;要去修改配置文件改ip却没有vim,vi用着想吐;想ssh访问却下不动openssh server等等尴尬的事情,有了爱快介入后只需要在分流设置里将这个新系统ip往openwrt一丢就解决了),是个正常人都知道选后面一种了。

而我要从AC86u上割接到openwrt的时候的时候,任何配置都不用动,只需要把原来爱快wan3口直连AC86u lan口的网线拔下来接到局域网交换机上即可(前提是openwrt lan口的ip地址和AC86u的lan口地址是一样的)。

另:其实这里也不是非要使用爱快做主路由才能做,任何支持多wan口以及策略路由的:比如基于源IP地址选路、支持基于域名选路的都可以,只不过我暂时还没有看到在分流选路这快能和爱快比的,爱快这块太强了。

总结

其实,最终的部署方案最重要的是思路,也不一定非要硬件或者非要虚拟机(比如可以用硬件独立部署的爱快里使用虚拟机装openwrt;又比如esxi同时装爱快和openwrt;也可以像我一样爱快是硬件,openwrt是虚拟机部署等等),最关键是爱快和openwrt之间的连接逻辑(可以是物理连接,也可以是通过vswitch虚拟连接),大家可以根据自己的实际环境灵活选择适合自己的方案。

博客内容均系原创,转载请注明出处!更多博客文章,可以移步至网站地图了解。博客的RSS地址为:https://blog.tangwudi.com/feed,欢迎订阅;如有需要,可以加入Telegram群一起讨论问题。

评论

  1. zacharyren
    Windows Chrome 130.0.0.0
    2 月前
    2024-11-07 0:25:39

    您好,我按照您的方案做了部署,正常上网什么的也没问题,但是我还想用openwrt上安装tailscale,安装好了之后发现节点无法连接内网中的其他设备

    • 博主
      zacharyren
      Macintosh Chrome 130.0.0.0
      2 月前
      2024-11-07 4:58:44

      我就是在openwrt上安装了tailscale,用起来没问题啊。”节点无法连接内网中其他设备”,我没看懂是是什么意思,这个”无法连接”是指openwrt无法主动ping通局域网里其他设备,还是指局域网里其他设备无法ping通openwrt?安装tailscale的节点可以在终端使用命令”tailscale”命令设置一些功能,比如是否允许局域网连接,你可以看看。

      • zacharyren
        tangwudi
        Windows Chrome 130.0.0.0
        已编辑
        2 月前
        2024-11-07 9:56:08

        我的设备都接入了tailscale网络,网段是100.64.1.0/24,按理说openwrt加入tailscale之后,–accept-routes=true –advertise-routes 192.168.100.0/24有这两个参数之后通过openwrt上网的设备也能加入tailscale网络的。但是我其他的设备只能访问100.64.1.10(openwrt),无法访问192.168.100.0/24网段,ikuai的lan网段是192.168.1.1/24,openwrt的lan口是192.168.100.0/24,pve是192.168.100.10,ikuai甚至无法ping通100.64.1.1(headscale和derp服务器),pve和其他设备能ping通100.64.1.1,但是100.64.1.1无法ping通192.168.100.1,192.168.100.10

        • 博主
          zacharyren
          Macintosh Chrome 130.0.0.0
          已编辑
          2 月前
          2024-11-07 10:20:44

          你这没拓扑图,光说IP地址段实在是不好联想,不过我猜你的意思是其他部署了tailscale的设备无法访问到openwrt的lan口所在的192.168.100.0/24网段吧?这种靠tailscale来进行网段的路由我倒是没有实际做过,因为有需要互访的设备都安装了tailscale,没这个需求。不过,我觉得一个关键应该是在其他部署了tailscale的设备上是否能看到到通往192.168.100.0/24网段的路由,并且网关应该指向100.64.1.10(openwrt)。按道理来说,如果你设置正常,advertise-routes也正确设置,其他部署tailscale的设备上应该是能看到的,这是能和192.168.100.10/24网段通信的基础。另外:–accept-routes=true在其他tailscale设备上设置没?

          • zacharyren
            tangwudi
            Windows Chrome 130.0.0.0
            2 月前
            2024-11-07 10:28:37

            我之前部署的时候只要在openwrt上添加–accept-routes就行了,其他tailscale设备也需要开启这个参数吗?我回去试试

          • 博主
            zacharyren
            Macintosh Chrome 130.0.0.0
            2 月前
            2024-11-07 10:31:56

            “–accept-routes”,这个开关我觉得应该是控制是否接受其他tailscale节点通告的路由吧。

          • zacharyren
            tangwudi
            Windows Chrome 131.0.0.0
            1 月前
            2024-11-26 15:59:16

            大佬您好,我又碰到问题了。。。我现在的ipv6很奇怪,局域网内都是正常的,互联网上能ping通,但是无法通过ipv6访问端口服务,这样看来应该是防火墙问题,但是我把openwrt的防火墙都关了,ikuai的也开了。光猫上也没看到防火墙的设置,但还是没有用

          • 博主
            zacharyren
            Macintosh Chrome 131.0.0.0
            1 月前
            2024-11-26 21:42:49

            遇到这种问题,就需要在爱快上进行抓包来确认外网ping过来的包到底有没有到达爱快的wan口了,如果到达了里面却收不到,就可以确认是IPv6防火墙的问题。

  2. 镜面王子
    Android Chrome 120.0.0.0
    7 月前
    2024-5-31 9:44:57

    我想问一下eth0 与eth1在新版openwrt中已经没有了,只有br-lan,还有以太网适配口wan,交换机接口eth0,需要怎么设置呢,是最后的那个方案,我估计你的openwrt内核版本是在5.5以下的吧?

    • 博主
      镜面王子
      iPhone Chrome 125.0.6422.51
      7 月前
      2024-5-31 10:00:32

      直接在虚拟机里添加网卡,然后在 openwrt 里设置就行了啊,默认本来就只有一个 eth0,多的肯定都是自己添加的。。至于交换机,啥都不用配,一个广播域里本来就可以跑多个网段,只是一般来说不建议这么搞,生产环境广播包会相互影响,但是自己控制的网络就不怕。

  3. tb
    Macintosh Chrome 123.0.0.0
    8 月前
    2024-5-27 18:13:06

    多谢博主啊,给了一个好思路解决单臂路由配置统一的问题。
    然后有一个小建议:可以把openwrt安装到爱快的虚拟机里面,再配合爱快端口分流的下一跳策略可以实现看起来更自然的协作了。
    2个好处:

    1. openwrt装爱快里面,爱快设备跟nas物理隔离,将来nas出问题或者自己重装折腾不影响科学;
    2. 爱快的跨三层应用配合openwrt的SNMPD服务,可以实现更详细的终端流量统计。
    • 博主
      tb
      Macintosh Chrome 125.0.0.0
      已编辑
      8 月前
      2024-5-27 19:48:00

      我之前爱快也装了虚拟机的,不过后来专门买了一台inter cpu的mini主机来安装pve之后,所有的虚拟机、docker都迁移过去了,这样便于运维管理。

      我爱快现在只让它专心的做出口设备(是单独买的一个工控机,不是在nas里),一来因为以前跑虚拟机的时候爱快的cpu风扇吵得我心烦,二来因为我爱快是3拨,每条链路都有自己作用,论重要性比可openwrt大太多了,真装一起我反而担心openwrt影响我的爱快~~。况且,openwrt其实只是我的备用设备,我现在主要用的还是AC86u,我弄个openwrt是因为有段时间科学不稳定,我无法确定是ac86u的问题还是科学本身的问题,所以装个openwrt来做备用测试手段。

      • tb
        tangwudi
        Macintosh Chrome 123.0.0.0
        8 月前
        2024-5-28 10:28:47

        正好问一下哈,加了端口分流策略,如果openwrt挂了,会影响分流的设备正常使用吗

        • 博主
          tb
          Macintosh Chrome 125.0.0.0
          已编辑
          8 月前
          2024-5-28 11:08:21

          取决于”线路绑定”那个选项你是否勾选,不过,我感觉这个选项的判断逻辑很可能比较粗糙,可能是靠上级网关是否可达或者线路接口是up还是down(毕竟没有具体的选项,我只能靠常规逻辑来判断),根据不同的判断逻辑还有你的openwrt怎么个挂法(比如挂得完完全全,ping接口地址都ping不通,还是挂得半死不活,比如ping接口能ping通,但是实际上已经不行了),最后的实际效果未必能如你的愿,所以这也是我把爱快和openwrt分离的原因之一,不管openwrt死活,爱快主路由不能受任何影响,毕竟在我的”家庭数据中心”方案中,爱快能稳定的正常工作是重中之重。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
       

本站已禁用鼠标右键和各种快捷键,代码块内容可以直接在右上角点击复制按钮进行复制

zh_CN