这两天在给一个好朋友配置网络,他的网络大概是这样的。光猫已经改成了桥接模式,从光猫出来的线路接在一台小米 AX3000T 路由器上,这台小米路由器下接了个 OpenWRT,用来满足上网的各种需求。但这样连接有一个很大的弊端,那就是会存在两层 NAT 的问题(运营商那边的 NAT 暂时不考虑),怎么办呢?
两层 NAT 是怎么来的,为什么要消除两层 NAT 呢?
我们的互联网建基于 IPv4 协议上,根据该协议,两台电脑之间要响通信,就必须要有一个独立的 IP 地址。由于 IPv4 能提供的 IP 地址远远不能满足人们的需求,所以工程师们想出了私有地址和地址转换的方法来缓解日益增长的设备与 IP 地址不足的矛盾,这样就引出了私有地址、公网地址和地址转换的概念。
所谓的私有地址,就是家庭/单位/学校内部使用的地址,这个地址通常以 192.168 开头,是没办法直接与互联网上的另一台设备通信的。那什么设备可以拥有互联网唯一的 IP 地址呢?答案是路由器。这个互联网上唯一的地址就是公网 IP 地址。路由器的其它功能暂时不说,跟我们今天要讨论的话题有关的功能是地址转换。地址转换,就是把内网主机发出的数据存储在路由器内,然后把发出地址(源地址)改成路由器自己的公网地址,之后将数据发到目的地。返回自目的地的数据又进行相反的动作,将目的地地址更改成发出请求的设备的 IP.
不难看出,路由器在进行地址转换时,是需要一定的开销的,理论上会影响网络的性能。而多数路由器,默认的配置就会进行地址转换,除非将其配置为中继器(网桥/二层交换机)。好在 OpenWRT 等“软路由”或者华硕等高端路由,可以单独开关 NAT 模式,这就让我们有机会取消内网当中没有必要的地址转换。当我们关闭地址转换后,路由器可能就会变成网桥(二层交换机),也可能会变成三层交换机。工作在网桥/二层交换机模式是相对简单的配置,可以不用改动现有的网络配置,而我的朋友希望拆分网段,又想要在小米路由器的 Wi-Fi 网络下访问 OpenWRT 的网段,所以我们选择将 OpenWRT 改成三层交换机模式。一旦改成三层交换机模式后,就需要配置静态路由,从而告诉小米路由器怎么前往 OpenWRT 的网段。
一条静态路由包含目的地网络/主机、掩码以及网关设备三部分。目标网络/主机就是要前往的网段或者某一台主机,例如 192.168.2.0 或者 192.168.2.2.掩码用来标识网络的大小,可以用点分十进制或者 CIDR 进行表示,例如 255.255.255.0 或者 /24,如果要标识一台主机,则是 255.255.255.255 或者 /32.网关设备就是通过哪台设备访问目标网络/主机,网关设备必须位于小米路由器局域网地址的范围内,否则小米路由器就会无法连接到网关设备。有人会问了,中间隔着一个路由器,让小米路由器跳过中间那台路由器,把数据直接发给网关设备行吗?答案是不行的。
我的朋友的内网,小米路由器的局域网网段是 192.168.31.0/255.255.255.0,OpenWRT 的局域网网段是 192.168.168.0/255.255.255.0,而 OpenWRT 连接小米路由器的接口,及(相对于 OpenWRT 而言的)广域网接口,IP 地址是 192.168.31.254,正好就在小米路由器的局域网网段内。
根据以上的信息,在小米路由器上,需要增加一条静态路由,目标是 192.168.168.0,掩码是 255.255.255.0 或者 /24,网关是 192.168.168.254.
通过路由器管理网页设定静态路由
有了目的地网络、掩码和网关 IP 地址后,我们就可以来配置小米路由器了。我首先想到的是通过网页来配置,结果,我找遍了上网设置和高级设置,就是没有看到设置静态路由的地方。好吧,这种基础的功能在 TP-Link 几十元的路由器上都有提供。
通过命令设置静态路由
小米的路由器提供了 SSH 服务,这样我们就可以通过命令行去添加静态路由。当然,SSH 服务默认是不开启的,需要在米家中开启。
首先,我们通过 PuTTY 等 SSH 客户端软件连接到小米路由器,然后执行命令:route add -net 192.168.168.0/24 gw 192.168.31.254
让静态路由持续有效
通过上面的方法配置静态路由,每次路由器重启后静态路由都会丢失,所以有人说通过 rc.local 让路由器开机时自动添加静态路由。rc.local 是一个脚本文件,系统启动时会执行该文件。小米 AX3000T 路由器比较特殊,每次修改完 /etc/rc.local 文件后,重启就会被恢复为默认值,所以修改这个文件没什么意义。这个文件也并未变成只读,背后的原因是 /etc 目录本身是一个内存文件系统。当路由器重启后,会从固件中读取放到内存盘的区域,所以修改 /etc 目录下的 rc.local 是没有意义的。
实际上,小米路由器的固件是基于 OpenWRT 二次开发的,因此可以通过修改 OpenWRT 配置文件的方法来达到添加静态路由的目的。打开 /etc/config/network 文件,在 config interface ‘lan’ 配置块下方,及从 config interface ‘lan’ 开始,到下一个 config 之前的空航,添加如下配置:
=============== 从下一行开始 ===============
config route
option interface 'lan'
option netmask '255.255.255.0'
option gateway '192.168.31.254'
option target '192.168.168.0'
=============== 到上一行结束 ===============
修改并保存 network 后,在终端中重新启动小米路由器,看看能不能访问 OpenWRT 的局域网地址,例如 192.168.168.1.也可以进入小米路由器的 Shell,执行 route 命令来检查添加的静态路由是否存在。
后续步骤
可以在 OpenWRT 等软路由的防火墙中,关闭 WAN 接口的“IP 动态伪装”和“MSS 钳制”,前者就是地址转换,而后者是自动匹配 MTU,局域网中没有必要启用这两者。为了 OpenWRT 的安全,不建议将 WAN 的“入栈数据”设为“允许”。
评论(0)