现在为止,已经至少两次直接基于ubuntu做路由。第一次是给成都的住处做,第二次是给现在的住处做。想了想准备总结一下。
不过网络方面的东西,我也不是专业的。所以就只能慢一点,细一点。这样一方面自己整理的压力小一些,二方面要是有什么错处大家也好在评论区指出。
但这样也就只能把一个完整的事情拆成很多篇文章来搞了。
为了节省工时,只能能不review就不review了,有什么语句不通顺,错别字什么的,还请见谅。
为什么要自己做路由器
不信任第三方
对于家庭网络来说,一般来说,所有的流量都会需要经过一台路由器才能访问公网。所以,对整个家庭网络来说,路由处在一个非常关键的位置。
首先,路由器知道需要你要访问什么。在直接连接的情况下,路由器不仅知道请求网址对应的服务器,而且还知道是内网哪台设备访问的。(比如访问手机访问百度,那么路由器一定知道要把请求发送给百度的服务器,同时知道要把百度的回复返回给手机而不是电脑)
其次,路由器具有访问网络的权限。毕竟要访问外网,那就一定有网络权限。那么路由器就有能力将其收集的一切数据发送给外网。
因此,在路由器问题上尽可能不信任第三方,或者谨慎的选择第三方我认为是合理的。
更强的控制
我们考虑一般的路由,如果我们想要让这个路由器运行一个自己写的spring的服务可以吗?这个服务希望使用docker来部署可以吗?我们想给每个网口都划分一个独立的子网可以吗?我们想允许其中两个网口可以相互访问彼此可以吗?我们想允许一个网口单向的可访问另一个网口可以吗?
不可否认,一些非常高级的路由是可以的,甚至做了图形化的界面。但是这类路由普遍很贵,而且不够灵活。
因此,搞一个完全有自己控制的路由,我认为也是合理的。
为什么不是openwrt?
不够骚。
另外一方面的考量是避免异构。
假设家里的其他server全部都是ubuntu server或者centos,有且只有路由一台设备openwrt显得缺乏统一性。
虽然,路由本身就有特殊性。但是换个视角,可能这台路由本身就需要是k8s集群的一台node,和其他server一样都需要跑业务代码,只不过这个node具有路由的功能。
当然,我还没有把路由弄进集群里,但也不排除这种可能,毕竟我的路由和服务器都是同等硬件配置。
路由不是什么
家庭路由器其实集成了很多东西,让你可以插上就能用。但其实很多东西本身根本不是路由。
不是DNS server
虽然如今,绝大多数的路由器都自带一个dns server。以至于一般来说,默认的配置就会把dns服务器指向路由器。
但是,DNS其实本身并不是路由器的必备功能。我们完全可以把上图的DNS服务器改成114.114.114.114,然后把路由自带的dns服务关闭。
就我个人来说,我的DNS server在路由器上也不在路由器上。因为我的DNS server是用docker部署的CoreDNS。因此一方面,k8s集群会使用集群内部署的dns server。另一方面路由器上也部署了一个同样的image。
至于CoreDNS大概怎么玩。可以参考我之前写的《CoreDNS自建安全的DNS server》或者官方文档。
不是DHCP server
首先什么是DHCP server?DHCP server大概就是自动给内网的每个机器分配一个ip的服务,建立一个mac地址到ip的一一对应关系。
同样的,为了即插即用。一般来说家庭路由器不会考虑家庭网络里面已经有一个DHCP server的情况。而一般用户也不会自己手动给每台设备分配IP。所以家庭路由器往往是自带了一个DHCP server。
所以,DHCP server本身也并不是路由器的必备功能。我们完全可以把路由器上的DHCP server关掉,然后手动给每台设备分配IP,这样也是可以正常上网的。
就我个人来说,我的DHCP server就是在路由器上直接安装的。因为我还不会搞DHCP集群。
不是Firewall
虽然一般来说,家庭路由器除非配置了端口映射,否则默认都是不允许外部访问的。但是物理上,其实外部或者上游路由器本身其实是连接到了路由的。因此,一般来说,家庭路由其实默认是带有一个简单的防火墙的。
不过,这个防火墙其实也不是路由器所必需的。如果不考虑安全,完全可以允许上游路由或者公网直接访问路由器(比如访问路由器的管理页面)。
我个人的做法,有firewall。
路由是什么
我觉得AWS的文档写的不错。
事前准备
硬件准备
硬件上根据需求大体有两种准备方向:1、为一个专门的家庭路由器准备;2、为一个带路由功能的服务器准备。
当然,有钱的话可以我全都要。
首先需要选择一个不错的CPU,比如10代i3什么的。
不论是为了做家庭路由还是为了做服务器节点,CPU都建议不要配的太低。主要CPU和内存不一样,其实并不是那么容易替换,一次性配好比较好。
更何况有些人喜欢在在路由器上做流量加解密,CPU太差的话可能因为解密不够快而拖慢整体网络速度。(需要说明的是,根据肉测,如果不在路由上做加解密,单就网络转发而言是不会占用CPU资源的)
其次我们需要选择网口数目。
不论是家庭路由还是服务器节点,既然要带有路由功能,那么网口数目就会是一个很重要的考量。
一种方案是,选择带两个网口的设备,这样可以一个接外网,一个接内部交换机。
另一种方案是,直接选择带四个以上网口的设备。这样就不需要任何交换机。
还有一种方案是,选择只带一个网口的设备,通过USB3.0接一个外接网卡。
接着我们要选择天线。
这个取决于路由器是否承担了提供Wifi的期望。
如果不是,自然不需要考虑天线的问题。就算未来改成需要提供我们也可以通过AP解决。
如果是,而且不想再额外设置AP,那么天线就需要好好选择。
几个参考
软件准备
没啥软件需要准备的。一个普普通通的Ubuntu或Centos盘就好。(甚至可以选择Ubuntu Desktop)
我个人的硬件
我有两台,都没有天线。一台是USB转网口再接交换机的;另外一台是自带了4个网口。操作系统就是Ubuntu Desktop。
到此,基本的准备就结束了。下一步就是如何通过iptables配置,实现最基础的路由功能。