如何用Linux搭建软路由?

2.7k 词

Hello 大家好!我是在2024年依然对这个荒诞的世界抱有热情的超级神奇的神奇君!

在之前的文章中,神奇君为大家介绍了Linux的基本操作,分为了三个部分,分别是1分钟、3分钟、5分钟的教程,如果你还对Linux的基本操作有疑问,欢迎你阅读神奇君的Linux系列3篇文章:

【技术分享】小白如何学习Linux?从VirtualBox虚拟机软件开始,1分钟教程!

【技术分享】小白如何学习Linux?安装一台Linux虚拟机,3分钟学会!

【技术分享】小白如何学习Linux?会使用Linux的Shell,你就会了全部,5分钟学会!

今天主要为大家介绍一下如何使用Linux搭建一个软路由,学会了这些你就可以自己使用Linux搭建一个自己的路由器了。

要说明的是,这篇文章并不是一个专门的路由器开发文章,而仅仅是以Debian Linux为例,来演示如何构建一个稳定的路由系统,这个路由系统可以接在家中的主路由之下,作为旁路由来使用。

我们主要用到的组件是iptables,这是Linux中的一个专门用来管理内核包过滤框架(netfilter)的工具。用Debian Linux搭建一个路由器,主要的思路是在网络中将一个Debian Linux定义为网关,将网络中其他主机的通信全部或者部分地发给它,同时借助iptables,我们可以定义以什么样的规则来转发、处理这些数据包,这样一来,这个网关就实现了路由功能,也就是路由器啦。

在平常我们在家中上网的时候,我们的网关一般就是我们的主路由器,家中常用的主路由器一般是光猫之类的设备。我们大部分人家中的宽带都是通过PPPOE方式连接到运营商的局端的,也叫做拨号上网。如果是光猫直接拨号,那网关一般就在光猫上,如果是光猫改成了桥接方式,那通常是会在光猫下面再连接一个路由器进行拨号,这个时候的网关通常就是光猫下面的那个路由器。无论网关是哪个设备,一般家中的路由器地址都会设置成192.168.0.0/24这样的网络,网关的地址通常会设置成192.168.x.1,如果此时你的手机正好连接了家里的wifi,你可以从设置中的WiFi点进去,看下你的网关是多少,一般都是192.168.x.1(x为0~255之间)。

我们要搭建的路由器很简单,就是在光猫或路由器这个网关之外,再搭建一个可以让我们上网的网关。比如以神奇君这里为例,家庭网络的网关是192.168.50.1,我的网络中有一台Debian Linux,IP地址是192.168.50.200,我们要实现通过在192.168.50.200这台Debian上进行配置,把这台Debian变做一个网关,其他设备将网关改写成这个192.168.50.200这个地址后,所有的数据都会经过192.168.50.200这台机器发出去,并且还可以在192.168.50.200这台设备上进行策略配置,例如将去往不同目的地址的数据包发到不同的网口,完成选路工作,这就是路由啦。

首先我们需要在Debian上开启内核包转发,这个设置在/etc/sysctl.conf文件中,默认是不启用的,我们需要将这个配置前的注释取消掉,然后执行sysctl -p来验证下配置是否修改成功。

执行sudo sed -i 's/^#net.ipv4.ip_forward.*$/net.ipv4.ip_forward=1/g' /etc/sysctl.conf,然后执行sudo sysctl -p,如果输出net.ipv4.ip_forward = 1,就说明修改执行成功了。

接着我们要实现一个配置,就是让这台192.168.50.200的机器实现对收到的流量进行路由代理。在我们的这台Debian机器上,安装了Docker,并且这台Debian上的Docker网卡的地址是172.17.0.1,我们用Docker创建一个容器,这个容器的地址是172.17.0.2,这个172.17.0.0/16的网络,完全是位于这台Linux机器内部的。

而我们要实现的是,外面的机器将网关设置成192.168.50.200以后,可以直接访问到172.17.0.0/16的网络。怎样才视为访问成功的呢?如果外面的机器在浏览器中打开172.17.0.0段的地址能够看到其中搭建的业务,就说明访问成功了。如果不知道如何使用Docker的,可以看看之前的文章,了解一下Docker的基本使用:Docker的基本使用,小白必看

这里我们参照上面文章中的方法,创建一个Wordpress。执行sudo docker pull wordpress,然后执行sudo docker run -dit --name wp wordpress:

创建好之后,我们执行docker inspect wp | grep IPAddress看一下容器的IP,我这里是172.17.0.2,在终端中执行curl -I 172.17.0.2,如果输出HTTP响应头,就说明WordPress搭建成功了:

或者在浏览器中访问172.17.0.2,会看到WordPress的配置界面:

接着我们就要继续配置路由部分了,其实也很简单,只需要通过iptables,将外面机器发送到172.17.0.0的数据包,转发到docker0这个网口就行了。命令如下:

1
2
3
4
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o docker0 -j MASQUERADE
sudo iptables -t nat -L POSTROUTING

接着我们在网络中另一台Windows上将网关设置成192.168.50.200,然后在浏览器中访问172.17.0.2,就会发现能打开WordPress的页面了:

这就算是实现了我们的“软路由”啦,当然,这只是最底层的第一步,还有更多灵活的配置、选路等等操作,自由发挥的空间很多。

有没有小伙伴有这个疑问,作为路由器,既然是我的网关,它处理我们所有的流量,是不是可以看到我访问了什么网站?

那是当然的啦!这里如果我们尝试着在这台Debian Linux上抓包的话:

看见没,你访问了些啥一目了然!在我们的电脑连接到互联网的过程中,任何一级网关都可以做到这样!监测到你看了些什么,所以不要轻易在公共场合连莫名其妙的WiFi!

好啦,以上就是今天关于软路由的分享,如果对本次内容还有什么想要一起探讨的地方,欢迎在后台私信神奇君,神奇君一定知无不言。