0%

爱快主路由下IPV6防火墙的最优解(可能)

本文仅作为技术讨论及分享,严禁用于任何非法用途。
2023.5.4 更新:
2023-03-21,爱快官方iKuai8_3.7.0以上版本已更新ipv6 ACL支持,使用官方ACL成为最优解。

前言

在ipv6网络环境下,内网设备也获取到公网的ipv6地址,可直接被外部网络访问,形同裸奔,所以使用ipv6防火墙是很有必要的。

爱快的流控、人性化的界面与配置,是我使用爱快作为主路由的主要原因,但是不支持ipv6防火墙,内网设备在ipv6下裸奔,也是爱快受人诟病的一大缺陷。在家庭网络中,如何在爱快作为主路由的环境下,增加ipv6防火墙的问题,我想了很久,搜索了大量的资料,中间考虑过很多方案。其实要做到增加防火墙的方法很多,比如使用openwrt作为主路由自带防火墙、opensense,或是使用内网主机自带的防火墙。考虑过使用openwrt作为主路由,但是openwrt在折腾中诡异的问题实在太多,而且流控、界面展示、客户端控制、人性化的操作等多方面都不符合我的个人审美与需求。m0n0wall、opnsense之类的防火墙固件的话因为想到为了一个防火墙功能而额外消耗比较多的硬件资源且接入上去对网络结构有比较大的改动所以放弃了。最终,想到了一个相对优雅且对现有网络结构影响较小的方案。

本教程不太适合小白,小白也不太能理解ipv6防火墙的重要性。

方案

我们知道,openwrt自带了ipv6的防火墙,那么使用爱快作为ipv4网关,openwrt作为ipv6网关,就可以实现需求。
下面来揭晓我的方案:

  • 在爱快创建一个vlan接口,并在该接口启用ipv6,同时停用爱快lan口的ipv6服务
  • 通过vlan,复用内网LAN线路作为openwrt与爱快间的ipv6桥梁
  • openwrt 充当内网lan ipv6网关
  • openwrt 配置ipv6防火墙

示例图如下:

最终流量走向示例如下:
ipv4: client1(192.168.5.101) -> ikuai lan(192.168.5.1) -> ikuai wan(Internet)
ipv6: client1(2400:xxxx:a1::101) -> openwrt lan(2400:xxxx:a1::1) -> openwrt wan(dhcpv6 client) -> ikuai lan(dhcpv6 server) -> ikuan wan(Internet ipv6)

可以看到,ipv6流量先经过openwrt再经过ipv6,然后我们在openwrt上面配置ipv6防火墙就可以了。

实践

爱快配置

首先是爱快主路由的配置,lan1是内网网口:

在vlan设置中,添加一个vlan,这里使用vlan号101,线路选择lan1,不要设置ipv4地址,因为是纯ipv6网络:

然后配置vlan101口的ipv6服务。需要确保在ipv6设置中外网接口能获取到公网v6地址,且获取到ipv6前缀,正常桥接光猫并正确拨号后会自动获取到:

前缀这里需要小于64,否则在openwrt就无法下发ipv6地址:

openwrt ipv6配置

接下来配置openwrt,为了方便,我的openwrt配置了2个网口,都是绑定了内网lan口:

openwrt作为ipv4旁路由,相信大家都会,不细说了,配置好之后可开始配置v6,不配置也行。
然后修改wan6配置:

把协议切换为dhcpv6客户端,如何没有的,请自行查询安装ipv6(主要是ipv6-helper)方法或更换固件:

不要勾选”使用内置的 IPv6 管理”:

配置为桥接接口,并连接到vlan101。具体操作是,在自定义接口中输入eth1.101代表连接到eth1网口的VLAN 101::

防火墙区域设置为wan:

保存后会自动重启接口,此时wan6应该能获取到ipv6地址及pd前缀,正常的话lan口也应该获取到ipv6地址:

然后配置lan口的dhcpv6服务,内网设备即可获取到ipv6地址:

然而博主的lan口经过多方配置,也无法获取到ipv6地址,内网设备也无法获取到公网的ipv6地址,网上很多教程是改成中继模式的并不符合本人的需求。

最终,通过把wan6获取到的pd前缀,写入lan口的ipv6地址,才解决了问题,内网设备、lan口都有公网的ipv6地址,也能正常访问ipv6网络。

但这样有个问题,运营商给的ipv6 pd前缀是会变的,会导致后面内网设备无法上网,所以需要想个办法把最新的pd前缀应用到lan接口去,这里使用crontab:

1
* * * * * newpd=`ifstatus wan6|jq '.["ipv6-prefix"][0]' | jq -r   '"\(.address)\/\(.mask)"'`;lan_v6=`ifstatus lan|jq '.["ipv6-address"][0]' | jq -r   '"\(.address)\/\(.mask)"'`;if [[ "$newpd" != "$lan_v6" ]] && [[ "$newpd" != "null/null" ]];then uci set network.lan.ip6addr=$newpd;uci commit network;service network restart;fi

把上面的命令直接写入计划任务即可,如果lan口本身就能获取到ipv6地址的则不需要这个步骤。

openwrt 防火墙配置

如果需要开放某些ipv6端口允许公网访问,可配置防火墙策略。
以bt下载(16881端口)为例:
打开防火墙 -> 通信规则 -> 新建转发规则,输入规则名,点击添加并编辑:


然后保存并应用即可:

防火墙效果如下,关闭策略时可访问内网设备的3389端口,启用策略后3389端口禁止访问:

最后

ipv6 防火墙实现的方法很多种,本文只是介绍一种相对简单的方式,希望能帮助到遇到相同难题的人。