在《使用树莓派3B打造超强路由之二:初成》之后,似乎接下来的工作,就是朝着整合网络扩展存储 NAS 和家庭影院电脑 HTPC 去努力了。但在此之前,省视实际需求,不难发现其中的阴影——公共需求和私人需求存在显著差异——如:儿童能接触到的、成年人能接触到的和我能接触到的,如何区分开?所以在开始整合前,先尝试解决这个问题。
WARNING
本文所有指令均仅供参考,切勿无脑复制粘贴!
用最典型的视频资源作为观察点,梳理其传播流程,可以大致划分出这样的特质,
分级 | 管理(源) | 层级(途径) | 受众(目标) |
---|---|---|---|
G / PG | 只读 | 一级 | 儿童(电视、机顶盒、平板)、访客(随意) |
PG-13 / R | 读写 | 二级 | 成年人(电脑、平板、手机) |
NC-17 | 读写 | 三级 | 特定人群(电脑、平板、手机) |
然后对其做粗略总结:
- 每一级资源都应该是其前一级的超集,以尽可能地减少体验的损失,且便于对一级资源进行管理;
- 每一级资源都应该有一层与之相对应地局域网,可以最简化地实现类家长控制地效果。
以此为纲,开始动手施工。(图就不画了,没找到好的 OminiGraffle 的模板。)
本来想顺路玩一把 VLAN 技术,以更好地提升多层网络的应用场合(比如:公司、社区之类),但最后还是失败了。水平有限,没有找到什么好方法在不同子网之间转发 DHCP 包 :(
使用子接口技术,将之前创建的网桥
br0
拆分出两张新的虚拟网卡,负责第二层网络的br0:1
和负责第三层网络的br0:2
。
sudo -s # 提权至 root
vi /etc/network/interfaces # 调整网络
(红色高亮部分是添加内容。)
体贴地提供可复制版本,注意保持格式:
auto br0:1 iface br0:1 inet static address 10.7.5.1 netmask 255.255.255.0 broadcast 10.7.5.255 auto br0:2 iface br0:2 inet static address 10.7.6.1 netmask 255.255.255.0 broadcast 10.7.6.255
dnsmasq 有一个强力到爆的特性 tag ,可以针对客户端的设备信息(
dhcp-match
)、网卡信息(dhcp-vendorclass
)、 MAC 地址(dhcp-mac
)、主机名(dhcp-host
)和客户端标识符(dhcp-host
)来进行标记,然后将特定标记的客户端分配至不同的网段中。灵活地组合运用这些功能,足以满足各种场合的需要了。
对我而言,简单地使用不同地客户端标识符,默认(没有标识符)就走第一层网络,标识符 im.staff
走第二层网络,标识符 secret.garden
走第三层网络。以后还有需要,再记录电视、机顶盒、家用台式机等不同设备的 MAC 地址进行绑定即可。
调整 DHCP 配置,
vi /etc/dnsmasq.d/dhcp # 配置 DHCP 服务
reboot # 重启生效
(红色高亮部分是添加内容。)
继续体贴地提供可复制版本:
dhcp-range=tag:lan,10.7.4.240,10.7.4.249 dhcp-range=tag:staff,10.7.5.240,10.7.5.249 dhcp-range=tag:shadow,10.7.6.240,10.7.6.249 dhcp-host=id:im.staff,set:staff dhcp-host=id:secret.garden,set:shadow dhcp-option=tag:staff,option:router,10.7.5.1 dhcp-option=tag:staff,option:dns-server,10.7.5.1 dhcp-option=tag:shadow,option:router,10.7.6.1 dhcp-option=tag:shadow,option:dns-server,10.7.6.1 tag-if=set:lan,tag:!staff,tag:!shadow
使用另外一台设备连接到树莓派的网络,检查三层网络是否能正常工作:
成功!
这三层网络因为是通过子接口技术实现,从专业角度来说,它们其实是平级的。为了满足设计预期,我们需要将外层网络向内层网络的通信进行阻断,达到隔离的效果。
WARNING
常见局域网问题(如:ARP 攻击或其它广播风暴),如果是在第二层或第三层,仍然是无法通过这种方式防御的。
sudo -s # 提权至 root
iptables -N reject # 创建防火墙自定义阻断动作
iptables -A reject -p tcp -j REJECT --reject-with tcp-reset # 对 TCP 通信回应重置命令
iptables -A reject -j DROP # 无视其它类通信
iptables -A FORWARD -s 10.7.4/24 -d 10.7.5/24 -j reject # 阻断第一层网络向第二层通信
iptables -A FORWARD -s 10.7.4/24 -d 10.7.6/24 -j reject # 阻断第一层网络向第三层通信
iptables -A FORWARD -s 10.7.5/24 -d 10.7.6/24 -j reject # 阻断第二层网络向第三层通信
iptables-save > /etc/iptables # 保存防火墙配置
也好想去败一个放家做路由器,关注过之前的树莓,发热太大,而且人一多就容易断线。期待楼主在后面的文章中反馈下