背景
家里的软路由一直一台是跑着 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
另外也需要按照上面的教程,至少配置好 rules
,masq
(或者叫做 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 解决)