使用 Shorewall zone 配置软路由上特定机器的流量转发

背景

家里的软路由一直一台是跑着 ArchLinux 的 x86 设备。最初是参照着 Arch Wiki: Router 的页面一步一步配置,转发 / 路由 / 防火墙相关的功能就沿着 wiki 的教学选择了 Shorewall,而没有选择(在我看来学习成本更高的)iptables。

去年搞了一个新的 Apple TV,就有了让局域网里面特定设备的流量转发到代理上的需求。折腾一段时间下来发现 Shorewall 上配置类似的事情并不是很难,基于配置文件的 Shorewall 在配置好之后也比较好维护,因此把相关配置的过程记录下来。

Shorewall 里面的 zone 功能 可以很好解决我的需求,后面的内容主要介绍如何在 Shorewall 里面增加 zone 并配置转发。

配置 – 转发流量之前

Shorewall 最基本的软路由配置可以参考他们的官方文档(Basic Two-interfaces Firewall),或者 Arch Wiki

我们这里只用来展示后面 zone 配置的基础: /etc/shorewall/zones 文件里面有两个基本的 zone 对应局域网 loc (实际为 10.0.0.1/24)和外网 net

# content of /etc/shorewall/zones

#ZONE   TYPE    OPTIONS                 IN                      OUT
#                                       OPTIONS                 OPTIONS
fw      firewall
net     ipv4
loc     ipv4

另外也需要按照上面的教程,至少配置好 rulesmasq(或者叫做 snat,如果使用更新 Shorewall 版本)这些文件。

配置 – 新增一个 zone 专门放置要转发流量的设备

这里分成两部分,一个是新的 zone 的定义,另一个是有了 zone 定义之后的转发规则。

zone 的定义

我们需要新定义一个在 loc 里面的新区域,假设叫做 new

# additional content of /etc/shorewall/zones

new:loc         ipv4

按照文档,冒号后面的 loc 指的是 parent_zone,说明我们新的 zone 是在内网 loc 里面的。

进一步我们需要指定 loc 的哪一部分在 new 区域里面,这里需要修改 Shorewall 的 hosts 文件,我自己只添加了一个 IP 地址(预留给我的 Apple TV)。按照文档,这里可以写成 IP 地址段比如 10.0.0.201-10.0.0.220

# content of /etc/shorewall/hosts

#ZONE           HOSTS                           OPTIONS
new             enp4s0:10.0.0.201

# change `enp4s0` to your interface name of `loc`
# you can change to `enp4s0:10.0.0.201-10.0.0.220` to include more IPs (devices).

转发规则

最核心的部分是转发规则,这里的规则并不一定是符合大家需求的。我设置的规则如下:

  • TCP 请求转发到我们准备好的 redir / clash 代理上面 10.0.0.1:8883
  • DNS 请求(53 端口的 UDP)转发到我们专门为 Apple TV 准备的内网 DNS 上 10.0.0.1:8053
  • 内网流量需要正常直通,不要走转发

因此我们这里我们修改 rules文件如下:

# additional content of /etc/shorewall/rules

# redirect outside zone (apple tv) to locally 8883 port transparent redsocks proxy
# ACTION        SOURCE  DEST                    PROTO   DPORT   SPORT   ORIGDEST
ACCEPT+         new     all                     TCP     -       -       10.0.0.0/24
# ACCEPT+         new     net                     TCP     -       -       192.168.1.0/24
REDIRECT        new     8883                    TCP
REDIRECT        new     8053                    UDP     53

问题 – 谁来接受转发?

这里可以选择使用 redsocks 把一个 socks 代理转换为透明代理(我不知道这里用词是否准确),也可以使用 Clash 提供的 redir 端口,这里不再特别展开。

当然,既然我们在配置文件上希望 Apple TV 有 10.0.0.201 这个 IP 地址,就需要我们通过手动修改 Apple TV 设置,或者修改 DHCP 服务器配置来达到这个目的。

这些配置好之后,就可以看到 Apple TV 的流量被转发到我们假设好的服务上面了。

后续

按照这样配置,一些不好修改代理设置的设备都可以通过这种办法来指定强行转发。新的设备只需要修改 DHCP Server 设置落在转发的 IP 地址区间即可。

后续我会考虑:

  • 是否可以把 VLAN 融合进配置?(需要我的交换机配置好 VLAN)
  • 是否可以让特定 AP 的设备进入到我新增的 zone 里面?(可能可以靠改善 DHCP Server 解决)

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注