Skip to content

Instantly share code, notes, and snippets.

@snakevil
Last active August 12, 2018 03:00
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save snakevil/6cd1a1c4e93549b036e9c7ba22cdee6d to your computer and use it in GitHub Desktop.
Save snakevil/6cd1a1c4e93549b036e9c7ba22cdee6d to your computer and use it in GitHub Desktop.
使用树莓派3B打造超强路由之三:阴影

使用树莓派3B打造超强路由之三:阴影

《使用树莓派3B打造超强路由之二:初成》之后,似乎接下来的工作,就是朝着整合网络扩展存储 NAS家庭影院电脑 HTPC 去努力了。但在此之前,省视实际需求,不难发现其中的阴影——公共需求和私人需求存在显著差异——如:儿童能接触到的、成年人能接触到的和我能接触到的,如何区分开?所以在开始整合前,先尝试解决这个问题。

WARNING 本文所有指令均仅供参考,切勿无脑复制粘贴!

〇 前文提要

  1. 《初装》
  2. 《初成》

一 架构设计

用最典型的视频资源作为观察点,梳理其传播流程,可以大致划分出这样的特质,

分级 管理(源) 层级(途径) 受众(目标)
G / PG 只读 一级 儿童(电视、机顶盒、平板)、访客(随意
PG-13 / R 读写 二级 成年人(电脑、平板、手机)
NC-17 读写 三级 特定人群(电脑、平板、手机)

然后对其做粗略总结:

  1. 每一级资源都应该是其前一级的超集,以尽可能地减少体验的损失,且便于对一级资源进行管理;
  2. 每一级资源都应该有一层与之相对应地局域网,可以最简化地实现类家长控制地效果。

以此为纲,开始动手施工。(图就不画了,没找到好的 OminiGraffle 的模板。)

二 添加网卡

本来想顺路玩一把 VLAN 技术,以更好地提升多层网络的应用场合(比如:公司、社区之类),但最后还是失败了。水平有限,没有找到什么好方法在不同子网之间转发 DHCP 包 :(

使用子接口技术,将之前创建的网桥 br0 拆分出两张新的虚拟网卡,负责第二层网络的 br0:1 和负责第三层网络的 br0:2

sudo -s # 提权至 root
vi /etc/network/interfaces # 调整网络

(红色高亮部分是添加内容。)

/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

三 开启 DHCP

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 # 重启生效

(红色高亮部分是添加内容。)

/etc/dnsmasq.d/dhcp 内容编辑截屏

继续体贴地提供可复制版本:

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

使用另外一台设备连接到树莓派的网络,检查三层网络是否能正常工作:

  • 第一层(默认)网络

    DHCP 分配结果

  • 第二层网络

    DHCP 分配结果

  • 第三层网络

    DHCP 分配结果

成功!

四 隔离

这三层网络因为是通过子接口技术实现,从专业角度来说,它们其实是平级的。为了满足设计预期,我们需要将外层网络向内层网络的通信进行阻断,达到隔离的效果。

WARNING 常见局域网问题(如:ARP 攻击其它广播风暴),如果是在第二层或第三层,仍然是无法通过这种方式防御的。

查看树莓派的当前路由配置,发现系统处理网络时会忽略子接口,将三层网络“视为”一个多 C 段子网(黄色高亮部分),

route 指令结果截屏

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 # 保存防火墙配置
@dj9399
Copy link

dj9399 commented Mar 7, 2017

也好想去败一个放家做路由器,关注过之前的树莓,发热太大,而且人一多就容易断线。期待楼主在后面的文章中反馈下

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment