众所周知哈,目前极空间还没有将防火墙的设定权限交给用户,那么当我们存在定制防火墙的需求时该怎么办呢?答曰另辟蹊径从路由下手,即
序
先假定一些先决条件:
- 极空间:
- IPV4(内网地址):
10.0.10.10
- IPV6(公网地址):
2409:8000:1234:5678::abcd
- IPV4(内网地址):
ACL:爱快默认情况下为全通,设置规则后允许的优先级大于拒绝的优先级
IPV4
由于大家一般拿不到公网 IPV4 地址,这里就主要以内网地址展开,ACL 可以用于阻止外网地址连接到内网地址的端口或者内网设备发起的端口连接。
比方说极空间的下载功能,基于 v2.94 版本的 Transmission,属于玩 PT 的不屑于用它,不玩 PT 的发现还没内置的迅雷下载好用系列。偏偏属于默认服务无法关闭停止运行,偏偏还对外建立端口连接,此时你虎躯一震,大喊一声杂家给它禁上。
- 协议栈:IPV4
- 协议:tcp + udp
- 动作:阻断
- 方向:转发
- 连接方向匹配:关闭
- 源地址:
- 目的地址:
- IP 分组:10.0.10.10
- 源端口:51413
- 目的端口:
- 进端口:lan1
- 出端口:wan
- …
言归正传的解释:上述条目的作用是禁止 IP 地址为 10.0.10.10
的设备对发发起端口号为 51413
的 TCP/UDP 连接,由于是发起方,所以进口 LAN 出口 WAN。
IPV6
概述
好的,终于来到本文的重点 IPV6 防火墙配置。已知极空间未开放防火墙,同时设备端口均对外开放(包括你的 Docker 应用映射出的端口),若再搭配上可被公网直连,这无疑存在安全隐患。
如果在这一前提下用户部署了 DDNS 服务,将域名解析到公网地址。那就意味着可以轻易的由域名找到设备,更进一步由地址扫端口、由主域名查二级域名并接着查端口服务[1]。如果又使用了 Nginx 反代访问,那么于设备而言这些流量就是从本地发起的[2]。你可能起了一个 Docker 程序,但这个服务没有很好的安全设计,原本它只应在内网下工作,但现在它暴漏在公网中,能被外网设备访问到了。
总而言之,你可能并不需要它那么的对外开放;
总而言之,相较于处在 NAT 之后的 IPV4,IPV6 环境下的你,需要一个防火墙。
获取
IPV6 地址的获取有两种方式:DHCPv6(有状态)和 SLAAC(无状态),前者由路由给设备地址,后者是设备根据自身 MAC 地址通过路由发出 RA 通告,组合前缀后计算出后缀得出地址。你可以不关心这些概念,只需要知道安卓设备只能通过 SLAAC 获取 IPV6 地址,以及在实际使用中,爱快系统中无论是有状态还是无状态设备后缀都没有怎么变化(设备获取的地址)。
那么,为了便于内网管理,在爱快系统中对 IPV6 的地址获取更建议使用有状态,因为在搭配 DHCPv6 白名单后,可以对指定设备分配公网 IPV6 地址,毕竟你家内网中的设备只有个别几个需要公网地址:你也不希望家中的物联网设备如:音箱、摄像头、电饭煲等等都能被公网直连吧。
一般来讲,运营商给的前缀为 /56 或者 /60,然后爱快系统会随机选择一个子网 /64 给设备往下分(上图接口部分是内网可选地址),最终设备才获得具体的 IPV6 地址 /128。
如前文假设的设备地址:2409:8000:1234:5678::abcd
,在 ACL 中可以用后缀方式匹配:::abcd/::ffff
。
规则
首先添加一条拒绝外网所有端口进的规则:
- 协议栈:IPV6
- 协议:任意
- 动作:阻断
- 方向:转发
- 连接方向匹配:原始方向
- 源地址:
- 目的地址:
- IP:::abcd/::ffff
- 进接口:wan1
- 出接口:lan1
- …
接着对指定端口进行开放:
- 协议栈:IPV6
- 协议:TCP
- 动作:允许
- 方向:转发
- 连接方向匹配:原始方向
- 源地址:
- 目的地址:
- IP:::abcd/::ffff
- 目的端口:5055,8050,8384,22000
- 进接口:wan1
- 出接口:lan1
- …
其中:5055 & 8050 为极空间服务端口,8384 & 22000 为文件同步端口。
最后,可以通过该网站进行 IPV6 地址的端口连通性测试:IPV6 Scanner | Online Port Scan