Page 1 of 1
怎么通过编程实现一个路由器?
Posted: 2023-03-29T08:33:25+00:00
by expl
怎么通过编程实现一个路由器?
需求1:我想编程实现一个路由器,接管计算机或者手机等设备的数据包,全部由我设计的程序负责接收和转发。就像真正的路由器那样。
需求2:我的手机想用电脑的网络上网,但是电脑开不了热点,(usb,蓝牙均只能手机共享网络给电脑,不能反过来共享)但我的手机能开热点给电脑连接。于是我想,能不能将手机中的数据包通过wifi连接转发到电脑,在通过电脑转发至公网,实现手机能上网的需求。
需求3:能不能通过usb数据线,蓝牙连接的方式传输ip数据包,实现共享网络的目的。
问题困扰我好久了,求各位佬答疑解惑
Re: 怎么通过编程实现一个路由器?
Posted: 2023-03-29T08:33:50+00:00
by expl
我已实现在你的需求2和需求3,但是你的需求1工程量太大,不是一般的太大。
下面说一下我的实现方法:
我的需求1是你的需求1的前半部份,但我是学计算机网络的,所以我知道这个工程量到底有多大,所以我没有寻求全部由我自己设计的程序来完成。考查了全部可用的软件之后,我选择了用linux操作系统和linux中的开源软件来实现这一套方案。为什么用linux呢?我考虑的是安全和省钱,linux和其上的软件是开源的,这意味着谁都可以查阅它们的原始代码,这非常重要,或许我的经验和精力不足以让我把所有用到的软件代码都查看一遍,但是并不是只有我在查阅它们的代码啊,别人如果发现了哪个开源软件里面有木马或者病毒也是会说出来的。这不像闭源软件,捂着盖着,谁也不知道它在背后捣了什么鬼!而且即便有人发现了它捣鬼还不让人说出来,必须得先告诉它,它让人什么时候公布,别人才能公布,要不它就以“保护消费者”为由起诉公布的人,这真是应验了一句老话“贼喊捉贼”啊。第二个原因是省钱,闭源软件闭源的原因大多是为了利润,所以我直接不用它们了。
确定了开源软件的路线,我们就来梳理一下一个路由器的各个流程吧:
首先是需要接入,现在国内的各运营商都是光纤接入了(光进铜退政策),入户就是一根光纤,网络和座机都是从这根光纤上面传输的,(题外话,所以不要再想着家里停电的时候座机电话机还有信号,能打电话那回事儿了),随着光纤一起安装的是一个巨大的盒子,负责入户网络向运营商网络的注册认证工作,这个挺丑挺不正规的盒子我们俗称为“光猫”。我所见过的这类设备都没有安装孔,因为它默认用户是“坐”在桌子上的,所以它只有四角各有一个脚垫,但尴尬的是几乎没有哪一家会把它“坐”在桌子上都是希望它能安装在弱电盒里,所以在这里还是提醒一下制造这类设备的厂商安装孔才是这类设备应该配置的,而不是脚垫!光猫出来有可能是rj45接口的双绞线,就是大家常见的“网线”,它有很多种规格,虽然现在大家装修都开始用六类线,甚至七类线了,但是如果你买的商品房是精装房的话你还是有机会见到号称超五类的四芯线的,这类线只能稳定地支持10Mbit的速度,对于现在动不动百兆的接入来说实在不太应景。当然随着现在“全屋光网络”概念也出现了出来是网口的SC插座的光猫。
接下来就是拨号了,有了光猫并不等于就能上网了,是还需要有一个拨号动作的,(现在的光猫在工人安装时一般默认设置的是通过光猫拨号的,这样就不用我们再自己拨号了,但凡事有两面,这样对我们用户的限制实际上增多了),这时需要用到拨号账号和密码。据说有的地区这些信息是不给到用户的,这时可以向工人师傅索要,那是我们应得到,不要不好意思!
这两部份的内容(如果你不需要座机电话的话)是可以被打包到一种叫“猫棒”的设备上的,在网络上就可以买的到,也可以让店家设置好这一系列的参数,买回来后直接插在光模块的插口上就行了。但是“猫棒”这类产品的质量参差不齐,除了大家都知道的发热问题,网络的稳定性也是一个问题,遗憾的是,现在linux还没有将普通光模块的信号转能光猫信号的软件,只是在猫棒的固件里有那样的功能。希望有能力的工程师可以提取出来。
拨号完成之后,这一台linux主机就已经可以上网了,现在的问题是如何把网络信息分享给家里的其它设备使用,这里我们就用到了linux内核的数据包转发功能,这在所有的linux发行版里都是有这个功能的。这个功能打开之后,我们就可以进行下一步了。
到了现在我们就需要把家里的内部网络和接入商的网络分开了,我们可以建立一个虚拟的网卡,并指定它的ip地址为 192.168.1.1 这就是家里其他设备网络设置时的网关地址,再把在接入家里设备的网口添加为这个虚拟网卡的附属设备,这里这注意的是这些从属网口需要设置为混杂模式,这样用双绞线把设备接入到这台linux的从属网口,这些设备上配置上ip地址就可以上网了。
嫌弃每台设备都要手动配置ip地址太麻烦,那就在linux上装上dhcpd,这个软件就实现在DHCD服务器的功能,配置好后,接入的设备就可以在dhcpd设定的地址池里自动分配到一个ip地址了。
再就是你需要的无线上网的问题了,这个问题的原理是跟从属网口一样的,不同的是这个网口是一个无线网卡,而不是rj45的网卡。同样的将这个无线网卡添加为虚拟网卡的从属设备就可以了,但是需要注意的是由于大量的无线网卡对待开源的态度并不友好,导致大量的无线网卡在linux里面是没有AP模式的,这不是网卡坏了,仅仅是因为驱动的问题。所以需要选择一款合适的无线网卡才可以在linux下开启AP模式,具体的型号可以在网上搜索,开源社区是强大的,也许今天还不行的硬件,在明天就会有牛人写出它的驱动,所以我也不能说哪个型号的硬件大家不要选之类的话。现在我假定你已经安装好了支持AP模式的无线网卡了,那么就需要再安装一个叫hostapd的软件,它的作用是利用那个无线网卡开出一个(或者)几个热点来,对没错在硬件路由器上是只有高端设备才有的功能利用这个软件可以轻松的实现。
到此,你要的所有功能都实现了。是的,仅仅是功能,你需要的全部由你自己设计那个目标还需要你自己的努力!
题外话,我曾在一个QQ群里说是硬件路由器其实也是一个linux设备,被几个厂商的人(几个厂商,而不几个人)喷了个够呛,一开始我还想着给他们科普一下,后来发现那是他们的一个情怀,是不容别人置疑的,就像是宗教一样的情怀,一旦被置疑他们是会拼命的,骂我算是轻的了。直到有一个CCIE拍了张路由器的启动界面,才稍微骂的不那么狠了~~