小成本实现多台机器宽带上网

时间:2022-11-25 14:29:18
基本上PC操作系统都可以配置成路由器,想想看,所谓的路由器内部其实也运行着一个操作系统,且宽带路由器要比PC便宜的多,因此要明白宽带路由器所具有的软件功能,PC操作系统一般都具备,宽带路由器的优势有两点,在硬件上,它配置了一个或者多个多端口的网卡,在软件上,它的操作界面更加清晰,配置上网功能更加方便。
     近来,冒着巨大危险搞了一批破烂电脑,做点实验自己玩儿。性能都不咋地,只有我自己家的电脑能勉强安装一个Windows XP,作为一名IT工作者,我以没有智能手机,没有笔记本电脑,没有比HP康柏上网本系列更好的台式机,没有支付宝账号,没有淘宝账号,甚至没有自己的QQ号,没有自己的邮箱,没有信用卡,没有注册微博,没有涉足过任何社交网站...不为耻!据我所知,微软所有的测试都是在最差的环境下进行的。我是技术痴迷者,总觉得内功深厚才是根基,夹生饭很危险,一招一式更容易走火入魔,然而如果从应用的角度,从享受生活的角度,我确实是一个不折不扣的失败者!
     本来家里买了宽带路由器,专门为丈母娘买的,她需要用笔记本上网,因此我的路由器还有无线功能,然而丈母娘走了以后,我把路由器和无线网卡收了,装了一个Linux虚拟机,然后在虚拟机里拨号上网,不知怎么地,连续好几次,我的虚拟机没有关机,而是suspend,第二天再打开时,PPPoE状态竟然还是那个,公网IP毅然未改,这完全不可思议,然而却懒得质问运营商!Linux系统里可以很简单的设置防火墙,路由器,DMZ等,我曾在自己的公司连接到了自己家的电脑(老婆在家看孩子,因此家里随时有人)。
     本文简单介绍一下我的设置过程。

1.选择Linux作为虚拟机系统

使用Linux是因为它配置网络防火墙和路由都很是简单又方便,同时配置DMZ也只是需要几条iptables命令(NAT),而这些在Windows平台却被视为高度复杂且强大的功能,Windows的路由配置命令肯定没有iproute2来的灵活,且它的NAT模块的安装也需要费一番工夫,我就没有安装成功过,几乎恨死Windows了。如果想使Windows成为一台路由器,要修改注册表,然后重启机器,这是比较烦人的,我敢说,记住net.ipv4.ip_forward这串字符绝对比记住HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter更简单,并且重启机器所耗费的时间几乎比吸一支烟所耗费的生命更加令人惋惜,起码带不来任何快感!因此选择Linux作为虚拟机系统

2.选择Windows作为宿主机

理由很简单,唯一那台性能还过得去的PC机不完全属于我,其它的机器又太破,我要是敢将PC机重装成Linux,我老婆会杀了我的!

3.Linux发行版选择

虚拟机一部,内装一个Linux即可,使用Linux而不是别的是因为Linux可以很方便的实现路由器和防火墙的功能,路由器功能使用ip_forward以及iproute2即可应对,而防火墙功能则是iptables的强项,另外由于家用宽带一般是拨号上网的,因此该Linux系统还需要可以很方便的进行PPPoE拨号,因此比较推荐的是带有桌面的Linux,我使用的是RedHat,但是,桌面Linux的性能肯定要差一些,因此如果可以很好的玩转配置文件的话,还是安装Debian比较好,然后启动到Level 3即可。

4.链路层复用

虽然安装虚拟机的PC机只有一个网卡,虚拟机中的Linux也只有一块网卡,然而记住,链路层对于网络层是可以复用的,因此只需要将虚拟机中的网卡简单的设置成Bridge模式就可以使用PC机上唯一的物理网卡承载不同网络,这里主要有两个IP网络,一个是私有的本地局域网,另一个是虚拟机中的PPP网卡和运营商方的PPPoE网络。
     链路层复用的原理很简单,那就是网络是分层的,每一层是独立管理的,层间在管理上是不搭干的。因此只需要一个很便宜的小HUB就可以实现共享上网。我的5台破烂儿就是通过另一台设置成HUB的破烂儿连接的,其中花了一小笔钱买了一个8端口网卡,内装Linux,设置了桥接。

虚拟机中的Linux PPPoE拨号的过程:

4.1.添加一个xDSL设备

小成本实现多台机器宽带上网

4.2.绑定PPPoE物理网卡(体现oE)并输入账号和密码

小成本实现多台机器宽带上网

4.3.创建

小成本实现多台机器宽带上网

4.4.激活ppp网卡

小成本实现多台机器宽带上网

最终,在Linux虚拟机中,就会出现一个ppp0的网卡,该网卡将借助eth0与运营商通信,而eth0被Bridge到了PC机的物理网卡,最终链路层得到复用。需要做的仅仅是在所有由HUB连接的机器的默认网关都指向Linux虚拟机的eth0(它们都在一个网段),打开Linux的ip_forward,所有机器就可以上网了。总的拓扑图如下:

小成本实现多台机器宽带上网


5.一点理论知识

5.1.pppX

这个类型的网卡和tun网卡一样,实际上是虚拟的,ppp网卡主要完成了一个封装,将ppp帧封装了绑定的物理网卡的数据载荷里面。

5.2.默认网关的问题

我们发现,拨号上网的机器的默认网关并没有设置下一跳地址,而仅仅是指定了一个出口,该出口就是pppX网卡,那么协议栈如何解析下一跳呢?实际上我们发现导向默认网关的数据包是直接发出的,因为pppX网卡有一个特征就是NOARP,在ppp层面上,它并不是多点网络-比如广播网络以太网,而仅仅是一个点对点的网络而已,因此不需要ARP,数据直接从该口发出即可,线缆的另一端一定是运营商的ppp服务终端或者适配器,而不是以太网交换机,PPPoE中,oE仅仅是一个数据通路的途径,重点还是PPP。

5.3.防火墙相关

一般而言,运营商是全开放的,也就是说,如果它分给你一个x地址,理论上在世界任何一个地方都应该能通过核心路由访问到x,但是具体能否访问还要看访问者本地的限制,在我所在的公司,除了几个出口熟知的端口比如80,443等之外,其余的全部封闭,这一点你可以通过nmap命令进行探测,我也正是这么做的,既然这样,你就必须在家里做文章,在Linux虚拟机里面用iptables很简单的做几个dnat,比如访问80的定向到1234等...虽然这行得通,我还是憎恨NAT,本来IP协议设计之初就是互通的,没有方向性的,然而NAT为IP增加了方向性。举例,在Linux上,NAT是基于conntrack的,而conntrack本来就是一个四层以上的概念,IP是没有conntrack的哦...