现在用运营商的光猫真是得谨慎 它现在把很多事都放在客户端的插件了 包括反诈 反代理 重定向 tls窥探 等等等等
随着一系列恶意网络技术的应用和整体环境变化,公共互联网服务的可信程度逐步下降,各运营商出于降低省际流量结算费用和一些其它目的开始普遍地使用各种劫持技术,造成终端用户的网络访问出现非预期结果。这些行为导致用户无法正常访问特定网络内容,或者在安全性、隐私性、实时性和连接质量上被降级。
本文旨在介绍通过使用OpenWRT路由器操作系统,部分缓解上述问题。
注意:请勿在评论中公开讨论不符合当前相关法规的内容
当你在浏览器的地址栏中输入KC的域名(http://www.kechuang.org)并按下回车键后,浏览器就会识别到你试图访问一个域名,并且开始试图将其转化为IP地址。对于一个域名,浏览器会首先查找系统的DNS缓存和hosts文件,在发现没有对应记录后,则尝试向DNS服务器查询该域名的DNS记录,这个DNS服务器在默认情况下由ISP通过PPPOE协议下发(通常是省级运营商的DNS),也可以由用户在系统中或软件(浏览器)中指定。我们也可以在系统的Powershell/CMD/Terminal中使用nslookup命令手动查询DNS:
通过向DNS服务器查询域名www.kechuang.org的DNS记录,浏览器获得了目标服务器地址为182.150.31.225。由于现代浏览器默认启用HSTS (HTTP Strict Transport Security),所以会尝试直接以HTTPS协议访问目标服务器的443端口。对于目前最常见的家庭网络,这一访问请求会经过你家中的路由器发往ONU(光猫)发送到ISP的网络中,经城域网进入骨干网,在由骨干网前往目标服务器所在的位置。通过使用路由追踪工具可以观察这一过程:
如果对方服务器和自己使用的ISP不是同一家,还需与经过IX(互联网交换中心)进入对付的骨干网,更复杂一些的情况是访问境外IP,需要经过C(国内核心层)-I(国际出口层)-X/S(国际交换层)-F(国际接入层):
HTTPS协议本质上是通过TLS加密传输的HTTP,TLS负责连接的双向安全性(内容仅双方可解密且不被篡改),具体的网页内容则由于HTTP协议传输,KC的服务器会通过HTTP协议返回状态码和首页对应的HTML内容:
由于HTML中包含了其它的图片、JS脚本、CSS脚本的链接,浏览器又会多次执行DNS查询-通过HTTPS请求内容的过程,加载首页中包含的全部资源。
对于非网页内容的各种应用,早期开发者通常以自建TCP/UDP链接的形式访问,但是随着RESTful API、WebSocket、GRPC等技术的流行,其访问方式和浏览器逐步趋于相同,一些App直接以内嵌浏览器/WebView的方式将服务端存储的内容向用户展示。
上述过程仅为整个网络链路中,没有任何一个环节发生非预期行为时的传输过程,然而实际上这一过程中每一个环节都有可能发生非预期行为改变访问结果。这里我们假设用户使用了可靠的浏览器和操作系统,没有发生设备端的劫持行为。
对于以FTTH方式接入的家庭网络,用户侧通常至少有2个设备:路由器和ONU(光猫),在最传统的模式下,路由器同时身兼网关、交换机和AP的功能为用户提供网络接入服务,ONU则负责将电信号转换为光信号。不过随着半导体技术的发展,现代的ONU往往具备一颗具备一定性能且功能丰富的CPU,可以同时起到ONU和路由器的功能,这时候ONU就转化为了ONT。另外相当一部分用户未将ONU正确配置使其工作在“桥接”模式而是工作在“路由”模式下使其成为ONT,又在其后接入了一个路由器,导致网络中实际上存在二级路由。要排查这一种情况,可以通过执行tracert命令观察返回结果中的内网跳数,图中仅第1跳经过内网(指向路由器),不存在二级路由:
一些高级用户也会使用“猫棒”(PON Stick)替代光猫,使其和自己的路由器集成为一个设备:
在很久以前,光猫、路由器的处理器往往性能孱弱(通常只有一颗主频低于1GHZ的MIPS处理器辅以专用的网络处理模块),不足以实现其它功能(否则会因为性能瓶颈严重降低传输速度)。然而现今其处理器往往已经升级到多个ARM Cortex-A9/A53甚至A73核心,已经有一系列证据显示部分制造商在其软件内预置了具备特殊功能的模块,包括:
存储并向特定服务器发送用户的连接记录
记录用户通过DNS请求的域名并发送给特定服务器
记录用户在HTTPS请求中通过SNI暴露的域名并发送给特定服务器
其它由服务端下发的功能
虽然在用户侧之外的网络中,ISP可以实施类似的行为,但是将这些功能分布式部署到用户侧无疑增强了其分析能力并分摊了计算开销。并且此类行为显然属于在用户不知情的情况下向用户侧的网络设备植入了后门。对于路由器,用户可以通过购买可信品牌的设备或是部署可信的操作系统避免此类问题;对于光猫,情况则更加复杂,由于光猫普遍开通了TR069协议,ISP通常可以直接实施远程管理,使用自购设备替代运营商的光猫则需要具备一定的专业知识和动手能力,部分地区的部分ISP还要求对ONU进行反向认证才能注册。
在过去,随着运营商网间结算的取消和多个互联网交换中心的建立,夸运营商网络访问质量逐步改善,并且运营商的非预期行为也明显减少。然而随着24年初运营商开始实施省间结算以及各家运营商的出口日益拥挤,情况则出现了明显的恶化和倒退。运营商侧的非预期行为主要包括:
将用户的访问请求劫持到指定的服务器上,比如某运营商将用户对特定视频资源的访问请求劫持到本地的镜像服务器上
拦截用户对特定目标的访问请求
在特定时段/全时段对用户进行限速,但是放行对测速网站的连接避免用户形成有效投诉
利用某些公共网站的漏洞,劫持对特定js文件的访问实现弹广告、塞关注
由于在用户侧之外的网络部分并不由用户掌控,ISP可以在路由过程中强制改变数据传递路径。比如当用户在访问视频网站时候,运营商根据连接特征识别了用户的请求,随后将其劫持到自己的镜像服务器或者省内的CDN服务器上。
ISP在对用户下发的DNS服务器上,篡改部分域名的DNS记录,使得用户得到错误的解析结果。部分地区的部分ISP使用DNS污染配合BGP劫持以降低省际结算成本,也有一些ISP使用此方式劫持对特定js脚本的访问实现弹广告、塞关注等行为。
针对部分用户会在路由器/操作系统/应用软件中指定上游DNS服务器而忽略下发的服务器的行为,ISP可以直接实施劫持。由于DNS请求默认使用UDP协议经53端口(长度超标时则切换到TCP协议)明文传输,ISP可以识别DNS请求并修改结果。最简单粗暴的方式是DNS抢答,即在检测到用户的DNS请求后立即返回自己指定的结果,或者更进一步拦截真实服务器的返回结果并进行篡改。
由于在TLS1.3协议中,默认以明文传输SNI信息,中间人虽然无法获得HTTPS传输过程中的请求头(包括路径)和结果,但是可以得到明文的目标服务器域名,并且进行针对性的行为。比如某地ISP悄悄对用户的上传带宽实施了限制,但是在用户在使用不同的测速网站测试时却一切正常,经检测发现当ISP发现SNI中包含"speedtest"时就会取消限速。
浏览这段内容需要 1 学术分内容已隐藏传统上路由器往往使用制造商自行编译的OS(操作系统),其中一部分制造商使用VxWorks之类的RTOS,另一部分则使用专有的基于Linux或Unix的OS。闭源且非公开的OS限制用户对路由器的安全审查能力和功能定制能力。而使用开源的路由器操作系统可以提升路由器在软件层面上的安全性并实现额外的功能用于降低非预期网络行为的影响,传统上这些功能通常在终端的操作系统上通过特定软件实现,但是将其转移到路由器上可以覆盖全部连接到该路由器的设备并且避免受制于终端设备的应用限制。
Linksys在2004年因为其WRT54G系列无线路由器使用了Linux内核,而根据GNU协议公开了其系统源代码,随后开源社区在其基础上发展出了一款开源且由社区维护的路由器操作系统OpenWRT。目前OpenWRT已经稳定发展了20年,并且拥有众多开发者和终端用户。在2017年,OpenWRT的开发者社区曾经分裂并发展出了一个分支版本LEDE(Linux Embedded Development Environment),但是在2018年初双方达成和解并且完成了合并。
OpenWRT在设计上偏向家庭网络和建议商用网络,具备完善的网页图形界面(LUCI),不需要使用者熟记各种命令和复杂的网络知识,同时对无线网络功能支持良好。目前市场上一部分商品无线家用路由器已经开始使用经过定制的OpenWRT作为OS。
作为一款开源的路由器操作系统,OpenWRT支持一系列市场流行品牌的家用无线路由器,然而商品路由器支持OpenWRT需要满足一系列条件,包括:
提供开源驱动,这主要受制于路由器的CPU制造商,常见制造商对开源的友好程度MTK>高通>>博通>Realtek
自带的系统或者bootloader允许刷入第三方固件
已经有开发者测试过主要功能并且修复了bug
路由器的RAM和ROM满足OpenWRT的最小要求
OpenWRT网站的https://openwrt.org/toh/start提供了经过验证的设备信息。
另外在替换家用路由器的操作系统时需要特别谨慎,通常此类路由器不具备冗余功能,一旦出现错误将会导致其功能无法使用并且无法恢复,可能需要使用串口调试器甚至FLASH编程器才能恢复。建议选择带有恢复功能的bootloader的路由器。
“软路由”指“软件实现的路由器”,在一台拥有网卡的PC上直接安装OpenWRT作为操作系统,即可成为一台“软路由”。目前主流的软路由使用常规的X86-64硬件,高级用户甚至可以使用Vmware ESXI、PVE等虚拟化方案将软路由、NAS、家庭服务器等功能集中实现于一台PC/服务器上。
如果对体积和重量敏感的话,这种带有双网口的mini PC都可以作为软路由
和传统的“硬路由”相比,软路由的优势有:
硬件性能强大,可以实现更多复杂功能
扩张能力强,用户可以安装10G/40G/100G甚至400G网卡
备份、调整方便
当然“软路由”也有一些劣势,包括:
CPU缺乏专用的网络处理模块,完全依赖软件处理导致CPU负担较大
无线功能较弱,通常只能通过PC的无线网卡的AP模式实现,覆盖能力和支持的客户端数量不如“硬路由”
价格通常高于一般的家用无线路由器
功耗更高
某款基于RK3588S的软路由,外挂了2颗RTL8125BG和RTL8211F
软路由也不一定使用基于X86-64的硬件,那些使用不具备专用网络处理模块的ARM CPU(比如Rockchip的产品)的方案也被视为软路由,甚至你可以将一块树莓派4/5改造为软路由。但是因为此类方案因为CPU既没有专用的网络处理模块,也不具备X86-64方案的性能,整体转发性能较差。
由于OpenWRT并非偏向高性能/高级安全特性设计的系统而更偏向家庭/小型企业用户,如果对性能有特殊要求(比如上万的连接数或者大量小包转发),建议使用VyOS并开启DPDK;如果需要高级安全特性,建议使用pfSense/openSense;如果是用作小型运营商和大型网吧,建议使用RouterOS。
OpenWRT本身的稳定性并不逊色于商品家用路由器自带的系统,其实际稳定性主要取决于硬件和软件驱动的质量,甚至很多时候不稳的主要来源是硬件本身——比如某联路由器经常在上市后悄悄推出缩水版本降级散热甚至芯片。根据使用经验,在一台使用普通X86-64PC硬件的软路由上,OpenWRT可以连续稳定运行超过180天;但是也曾经观察到长期运行后因为没有ECC内存而出现崩溃。
OpenWRT是开源软件,用户可以自行下载源代码并编译,但是也可以选择下载预编译的固件。不过出于可靠性和定制功能考虑,建议选择自行编译的方式。
OpenWRT作为由社区维护的开源软件,保持着较快的迭代速度,最新的功能会被提交到main/master分支中,但新功能也意味着不稳定,所以社区同时也会维持着稳定版本的迭代,稳定版本只会合并入安全补丁、bug修复和小规模的组件升级。目前OpenWRT最新的稳定版本的R23,但是R24也已经进入release candidate阶段,由于R24所使用的组件版本较高,所以这里直接使用R24版本。
本章分别以为X86-64软路由和GL.iNet MT6000家用无线路由为例,编译定制功能的OpenWRT系统。
由于OpenWRT使用GPL-2.0开源协议,所有人都可以基于开源的代码开发自己的衍生版本,除了官方版本外,目前(在CN)流行的衍生版本有:
Lean的衍生版:在18.06的基础上分叉独自发展,加入了许多自制的功能,但是较少和官方同步,社区活跃
ImmortalWrt:基于官方版本,增加了一些适合CN网络环境的组件,和官方版本积极保持同步,社区较活跃
Lienol的衍生版:基于官方版本,社区相对不活跃
这里直接使用ImmortalWrt,理论上用户也可以对官方版本进行修改实现相同的效果。
首先安装依赖项:
Bashsudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache clang cmake cpio curl device-tree-compiler ecj fastjar flex gawk gettext gcc-multilib \
g++-multilib git gnutls-dev gperf haveged help2man intltool lib32gcc-s1 libc6-dev-i386 libelf-dev \
libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses-dev libpython3-dev \
libreadline-dev libssl-dev libtool libyaml-dev libz-dev lld llvm lrzsz mkisofs msmtp nano \
ninja-build p7zip p7zip-full patch pkgconf python3 python3-pip python3-ply python3-docutils \
python3-pyelftools qemu-utils re2c rsync scons squashfs-tools subversion swig texinfo uglifyjs \
upx-ucl unzip vim wget xmlto xxd zlib1g-dev zstd
然后下载r24分支的源代码:
Bashgit clone -b openwrt-24.10 --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt
也可以将openwrt-24.10改为其它tag锁定具体的版本
下载代码的过程可能需要一定时间,这主要取决于和github之间的网络质量。如果因为网络问题无法完成,可以直接下载压缩包(目前对应Commit 790711d)后解压缩:
一部分需要的组件并不包含在ImmortalWrt中,需要手动添加。首先是mosdns,这是一个轻量化的自定义dns服务器,可以用于实现一些高级dns功能。当然也可以选择自带的smart dns替代它。
首先切换到ImmortalWrt的目录:
Bashcd immortalwrt
然后下载代码:
Bashgit clone https://github.com/sbwml/luci-app-mosdns -b v5 package/mosdns
浏览这段内容需要 1 学术分内容已隐藏OpenWRT通过简易菜单定制编译选项,不过在编译菜单前需要先更新一下feeds,在源码目录下执行:
Bash./scripts/feeds update -a ./scripts/feeds install -a make menuconfig
更新feeds需要一些时间,完成后会显示OpenWRT的配置菜单:
在OpenWRT的配置菜单中,Target System、Subtarget两项用于设定目标设备的类型。如果目标设备为X86-64软路由,需将Target System设定为x86,Subtarget设定为x86_64,Target Profile设定为Generic X86/64,随后进入Target Images页面:
对于文件系统格式,只保留squashfs,同时只保留Build GRUB EFI Images选项,然后将页面下移调整内核分区和root分区大小:
分区大小可以根据硬件情况灵活调整,但是不宜设置得过低导致空间耗尽无法增加功能需要扩容。
随后返回上级菜单。
如果设备为“硬路由”,则需要根据其硬件信息调整选项:
根据https://openwrt.org/toh/gl.inet/gl-mt6000,可知GL.iNet MT6000无线路由器的CPU方案为MediaTek MT7986(Filogic 830),因此将Target System设定为MediaTek ARM,Subtarget设定为Filogic 8x0(MT798X),Target Profile设定为GL.iNET GL-MT6000。对于ARM设备,Target Images页面中可设定的内容较少:
其中文件系统格式仍然选择squashfs,root分区则调整为所需大小。通常大部分商品家用无线路由器不会安装这么大容量的FLASH,需要根据分区表计算可用最大分区容量。
随后往下找到并进入LUCI标签:
在LUCI页面下的第一个选项Collections中,可以选择OpenWRT的LUCI网页管理后台的web服务器实现方式:
如果计划对外开放访问,可以勾选luci-nginx,使用nginx作为web服务器。
在第四个选项Themes中可以选择主题:
建议选上luci-theme-argon用于替换默认主题,argon相比之下更加美观且布局更合理。
在第三个选项Applications中,可以选择需要在路由器中预装的应用:
建议选择的有:
luci-app-acme ACME自动申请TLS证书(需要自备域名)
luci-app-ddns 动态DNS,用于在将自己的域名指向网络的动态公网IP以实现从外部访问
luci-app-mosdns 自定义的dns服务器
luci-app-statistics 统计功能
luci-app-timewol 定时唤醒
luci-app-upnp UPNP管理,用于改善P2P连接情况
luci-app-vlmcsd 本地KMS激活服务器,可以用于激活局域网中的全部设备上的MS产品
luci-app-wol 网络唤醒,可以通过网卡启动关闭的计算机
当然如果愿意的话,还可以在软路由上部署docker,只需要勾选
luci-app-docker
luci-app-dockerman
中的一个,但是个人不建议在路由器上实现太过复杂的功能。
如果你不习惯使用SCP之类的方式访问软路由的文件系统,可以勾选
浏览这段内容需要 1 学术分内容已隐藏luci-app-filemanager
随后退回主菜单,然后往下进入Network菜单,找到IP Address and Names选项:
如果你需要使用DDNS功能,可以根据自己的域名托管商勾选对应的脚本支持(或者选上全部scripts)。
随后返回Network菜单,如果计划使用acme(用于申请权威TLS证书,可以让浏览器访问路由器后台时启用TLS避免显示不安全链接,则勾选acme-acmesh-dnsapi。
最后返回主菜单,往下进入Utilities菜单,并在下方勾选pciutils(勾选该项后关联的pciids也会被自动选择),以启用pci工具:
用户可以根据自己的硬件和需求调整OpenWRT默认集成的App、工具、驱动,如果你认为某些组件无用,完全可以将其取消,或是根据需求增加自己需要的组件,不过某些App和组件之间会存在冲突导致编译失败。默认情况下,OpenWRT已经编译了大部分常见的网卡驱动,包括:
Intel 82575/6、82580、82563/6/7、82571/2/3/4/7/8/9、Pro1000
Intel I210/211、I217/218/219
Intel I225/226
Intel 82598/9、X520/540/550
Intel X710/XL710
Realtek 8101/2/6、8139
Realtek 8168
Realtek 8125/8126
Broadcom BCM5706/8/9、BCM5716
VMware VMXNET3
一些常见的网卡并不在其中,其中一部分可以在Kernel modules里手动添加(比如Mellanox MCX4/5系列)。但是OpenWRT对于无线网卡的支持会相对较差,即使能正常起到也不一定支持所有工作模式。
在完成所有选项的设置后,选择Save:
随后将配置保存到.config并按ESC退出菜单。
然后执行:
Bashmake download -j8
下载需要的组件,完成时间取决于网络状况,完成后即可开始编译。
对于第一次编译,只能使用单线程:
Bashmake V=s -j1
否则会出现错误并且难以定位。
如果你使用的是WSL2,由于Windows系统的环境变量大小写问题,编译系统需要执行的命令是:
BashPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make V=s -j1
由于仅仅使用单线程编译,编译过程会消耗1小时以上的时间,期间需要保持网络连接正常。
当首次编译成功后,可以使用多线程编译加快速度:
Bashmake V=s -j$(nproc)
使用全部线程编译时CPU会满载相当一段时间:
如果编译过程中没有出现问题,最后会显示打包信息,编译生成的镜像文件位于OpenWRT代码目录下的\bin\targets\目录:
目标设备是家用无线路由时生成的镜像会有所不同:
成功编译OpenWRT并得到对应的镜像后,还需要将其部署到自己的路由器上
对于X86-64设备,部署相对简单一些,因为其普遍支持EFI引导,只需正确地将编译的EFI镜像部署到硬盘上。
如果你没有使用ESXI/PVE虚拟化而是直接在物理设备上运行OpenWRT,首先需要将设备的硬盘拆卸,随后连接到当前PC(可以安装在主板上也可以安装在USB硬盘盒中),再用https://rufus.ie/之类的工具将EFI镜像写入。
虽然也可以将OpenWRT部署到U盘上,但是出于稳定性考虑并不建议这么做。
如果需要再虚拟化环境中使用,则需要将镜像转化为虚拟磁盘,并将转化后的虚拟磁盘文件上传到宿主机中,最后将其添加给虚拟机。
在该界面中上传编译得到的-sysupgrade文件后点击Update按钮,等待校验通过后会显示更新成功并自动重启:
一些其它品牌的路由器可能需要额外的步骤才能刷写自己编译的固件,其可能使用了自己实现的bootloader或者经过修改的uboot,甚至默认禁用了ssh,需要根据具体型号寻找对应的解决方案。
注意:为此类设备刷写固件是高风险行为,必须谨慎操作,否则可能有导致设备损坏。
对于家用无线路由,如果编译时选择了正确的型号,默认就会正确配置好网络接口,只需要将PC连接到路由器的LAN网口,然后在浏览器中访问路由器的IP(默认为192.168.1.1)即可打开LUCI网页管理页面:
对于X86-64软路由,无论是否虚拟化都会使用默认的配置,以eth0为LAN接口,以eth1为wan接口。对于网络接口较少的设备可以通过遍历法找到eth0,连接上之后就可以访问LUCI网页管理页面;但是是对于网络接口较多的情况这种方法非常费时,使用虚拟化方案时eth0还可能正好是虚拟网卡无法对外连接,此时就需要使用命令手动编辑OpenWRT的网络配置。
如果你的设备没有虚拟化,需要为其安装显示器和键盘,对于虚拟化设备则可以在宿主机的控制界面中直接操作。待其启动完毕不再显示新的日之后,按下回车会显示BusyBox信息:
然后执行:
Bashlspci|grep -i 'eth'
ls -l /sys/class/net/
列出所有网络控制器和接口:
根据PCI设备地址,可以将系统的网络接口和实际的网卡设备对应起来,例如上图中可知:
Intel I225-V对应的是eth3
Intel X550对应的是eth5和eth6
Intel I350对应的是eth4
接下来需要根据对应关系修改配置文件指定一个LAN,执行:
Bashvim /etc/config/network
使用vim打开网络接口的配置文件:
熟悉vim的用户可以直接删掉“config device”段,再将"config interface 'lan'"段中的device后面的br-lan修改为你制定的网口(比如eth6)然后保存。
不熟悉vim的用户需要先输入i进入编辑模式(左下角会显示状态不同),然后用键盘移动广播完成删除和修改,再按esc退出编辑模式,然后输入:wq保存并退出。如果操作失误,则可以在退出编辑模式的状态下输入:q!在不保存的状态下退出。
完成修改后需要重启网络使配置生效,执行:
Bash/etc/init.d/network restart
之后将PC连接到指定的网口即可访问LUCI网页管理界面。
默认状态下,路由器的管理用户名为root,密码为空,登录后会提示未设置密码,建议立即修改:
登录后会直接进入状态->概览页面,在此处可以查看路由器的基本信息和连接状态:
进入系统->管理权页面可以配置SSH访问权限:
默认情况下,路由器仅允许通过lan接口通过22端口使用ssh访问,如果在后续配置中删除了lan接口,则需要重新指定。如果需要允许通过wan访问,需要新增一个实例。
进入网络-接口,找到wan,点击编辑。如果已经将光猫设置为桥接模式,则需要将协议切换为PPPoE,切换后填入ISP提供的宽带账号和密码。如果光猫工作在路由模式,则将wan的协议设置为DHCP客户端,使路由器作为二级路由连接到光猫。
如果路由器拥有多个LAN网口,且打算将其合并为一个接口管理,需要在网络-接口-设备页面中,点击添加设备配置,设备类型选择网桥设备,然后在网桥端口中添加需要加入的接口:
如果每个网口都有单独的配置则不需要添加网桥设备。
随后进入网络-接口,找到lan,点击编辑。局域网接口的协议应当设定为静态地址。在“常规设置”标签页中,设置好对应的设备后可以通过IPv4地址和子网掩码设定内网IP使用的网段,网关和广播地址可以留空:
合法的内网网段为:
10.0.0.0-10.255.255.255
172.16.1.0-172.31.255.255
192.168.0.0-192.168.255.255
在高级设置标签页中,可以在“使用自定义的 DNS 服务器”项中填入接口本身的IP地址。
为了使路由器能给局域网设备自动分配IP,还需要在DHCP服务器标签页中为此接口启用DHCP服务,并且设定分配参数:
默认情况下OpenWRT的Dnsmasq会乱序分配IP,如果需要使用顺序分配则需要在网络-DHCP/DNS-常规标签页中启用顺序分配:
如果要设置多个局域网接口,可以在网络-接口页面的下方点击添加新接口然后开始设置,但是请注意在完成防火墙设置并测速过新接口的可用性之前最好不要删除默认的lan导致下游设备无法连接到路由器。
目前CN的三大ISP在大多数省市已经完成了IPv6部署,在没有接入特定商用优化网络(指电信CN2、联通CUI、移动CMIN2)的情况下通常都会下发IPv6前缀。在启用IPv6后,OpenWRT可以为每一个接入的设备都分配公网IPv6地址,使其可以访问IPv6地址。另外IPv6能大幅度改善P2P下载时的连接效率,同时使用专用的出口带宽。
要启用IPv6,首先需要检查IPv6下发情况,系统中默认会存在一个wan6接口,将其的设备设置为@wan后将请求 IPv6 前缀设置为自动,然后点击保存并应用:
重启网络后,在状态-概览页面的网络部分可以看到上游情况:
IPv4上游部分,如果其中的地址是一个合法的公网IP地址(注意排除CGNAT使用的100.64.0.0/10),并且地址和网关处于同一个C段(排除"假"公网),说明上游下发了IPv4公网IP。
IPv6上游部分,如果分发前缀是一个合法的公网地址(电信为240e,联通为2408,移动为2409),那么说明ISP正确地下发了IPv6地址,最后的/60说明下发长度为60,根据IPv6的地址格式:
64减去下发长度即是可用于自行二次下发的长度,假如下发前缀为240e:34c:7da4:62f0::/60,即意味着可以自行分配240e:34c:7da4:62f0::至240e:34c:7da4:62ff的前缀给不同的接口。CN大部分ISP的下发长度都是60,少数为56,如果是64即意味着无法二次下发(或者光猫没有工作在桥接模式)。
要为内网设备分配IPv6,还需要设置每一个局域网接口,首先在接口的高级设置标签页中启用委托IPv6前缀,并设定好分配长度和分配提示(分配提示可以范围由下发长度决定,60即为0-f):
为了给局域网设备自动分配IPv6地址,还需要在DHCP服务器标签页中进行配置:
这里设置的分配方式为SLAAC,将RA服务设置为服务器模式,但是禁用DHCPv6服务并且删除默认的RA标记,这是因为避免部分移动设备不支持DHCPv6且有可能存在不及时通告过期的bug。配置完成后,查看设备的连接状态可以看到IPv6已正确下发:
另外建议在启用IPv6后,在防火墙中添加一条规则禁止从互联网访问3389端口和22端口避免爆破,或者直接禁止IPv6入站。
明文传输的DNS协议无法保证过程安全,为了改善DNS查询的安全性,IETF陆续推出了DNS over TLS(DoT)和DNS over HTTPS(DoH)协议。DoT使用TLS加密保护DNS查询的过程,默认使用853端口;后者则将DNS查询过程包装为一个HTTPS请求,默认使用和HTTPS相同的443端口,后续还加入了对HTTP2和HTTP3的支持。DoT和DoH都实现了DNS查询的过程安全,避免中间人有机会获得查询内容或篡改结果,但是并不能保证目标DNS服务器的可靠性。但是通常公共DNS服务器的非预期行为风险相比ISP更低。
目前已经有相当一部分公共DNS服务器实现了对DoT和DoT的支持,包括:
阿里公共DNS:223.5.5.5和223.6.6.6
DNSPod Public DNS(腾讯):1.12.12.12和120.53.53.53
360安全DNS(不推荐)
Quad9:9.9.9.9/9.9.9.10/9.9.9.11/149.112.112.112/149.112.112.11/149.112.112.11
Cisco:208.67.222.222/208.67.220.220
DNS.SB:45.11.45.11/185.222.222.222
101:101.101.101.101
通常这些国际互联网流行的公共DNS服务器的DoH服务处于可用状态,但是不同地区和不同运营商实际情况可能不同,出口拥挤问题也可能会影响访问效果。如果你的家庭互联网未接入电信CN2/联通CUI/移动CMIN2之类的特殊优化线路,使用这些DNS服务器可能遇到延迟和可用性问题。
由于DoH直接通过HTTPS传输,可以通过在浏览器中访问验证其可用性,例如打开https://223.5.5.5/dns-query,如果服务可用将会返回一个错误提示。
另外在2024年阿里和DNSPod都宣布了对于DoH/DoT请求实施基于IP和带宽的访问限制策略。
MosDNS是一款轻量化的内网DNS转发器,上游支持TCP/UDP、DoT、DoH、DoH3查询,对下游则同时提供TCP/UDP/HTTP接口,并且还支持IPv4优先功能。
为什么要使用IPv4优先?
目前许多互联网内容提供商已经同时提供IPv4和IPv6服务,但是三大ISP的IPv6网络存在普遍的路由配置问题,经常出现访问不通、绕路等问题。IPv4优先可以在域名同时存在A记录(IPv4)和AAAA记录(IPv6)时只记录A记录,只存在AAAA记录时解析AAAA记录。
要启用MosDNS,需要在服务->MosDNS中勾选“已启用”和“DNS 转发”,并将“配置文件”选为自定义。
编写自定义配置可以参考https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/。或者直接修改这份模板:
使用前记得使用自己的公网IPv4地址替换掉ECS中的本地地址,否则某些域名可能无法正确地解析到就近的服务器上:
另外还需与根据自身的网络情况决定是否启用IPv4优先。
浏览这段内容需要 1 学术分内容已隐藏传统的“硬”路由的SOC中通常会集成一个专用的网络处理模块负责数据包的转发,因此即使CPU性能孱弱也不会制约传输速度,然而软路由的网络处理则依赖CPU,因此CPU性能会限制其转发性能。不过值得注意的是“硬”路由的硬件转发模块只能执行常规操作,往往在启用QOS等复杂的流量控制功能时仍然需要CPU执行(除非更昂贵的企业级产品上使用额外的FPGA/CPLD实现相关功能)。
在过去,一些使用低功耗X86处理器的软路由受限于CPU性能会出现无法跑满1000Mbps带宽的现象,但是得益于硬件性能的进步,现在的软路由已经能应对持续的大数据包转发。目前软路由性能表现逊色于“硬”路由的情况主要有:
小数据包转发带宽
最大连接数
无线-有线转发
由于小数据包转发需要专用的测速设备,这里只进行持续大带宽传输测试。
软路由设备信息:
虚拟化:VMWare ESXI 7.0U3
CPU:Intel Core i7 11700K(分配全部核心)
RAM:双通道DDR4 3600 32GB(仅分配8GB)
NIC:Intel X550T2
PC1NIC:Marvell Aqtion AQC113CS
PC2NIC:Realtek RTL8125B
两台PC之间Iperf3测速,受限于PC2的网卡带宽只有2.5Gbps。
软路由的CPU占用基本维持在略高于2%的状态。
平均速度2.37Gbps,基本一直维持稳定没有衰减。
由于NAS的电源坏了,测10G传输只能在虚拟机和PC1之间跑,虚拟机和软路由在同一台主机上,使用虚拟网卡。
平均带宽9.23Gbps,不是很稳定偶尔会低于7Gbps,估计是AQtion网卡的问题。
CPU占用最高时略微超过10%,略有压力。同一台设备之前还试过跑40Gbps,现在网卡和线卖掉了没法复现。
由于MTK开源驱动存在问题,GL.iNet MT6000使用OpenWRT R24时无法正常使用无线网络,需要降级回23.05版本。
[修改于 4个月0天前 - 2025/01/19 18:55:42]
200字以内,仅用于支线交流,主线讨论请采用回复功能。