Kun's Blog

与其将生命赋予虚无 不如将生命赋予行动

使用反向掩码配置OpenWrt的IPv6防火墙


前言

目前IPv6已经普及的非常广,移动互联网多年前就已经可分配到IPv6地址,在前2年家里宽带也支持了IPv6,然后我想到了通过IPv6访问家中搭建的一些服务,当然对外开放流量对网络访问这就涉及到了防火墙的配置。

遇到的困难

OpenWrt防火墙默认是禁止所有的IPv6流量入站的,这里就需要防火墙配置规则对要使用的服务进行放行,而且运营商给的动态前缀,普遍来来说IPTABLES配置命令对地址配置是根据前缀从前往后进行匹配的,这里我找到一种方法可反向匹配掩码来面对动态前缀的问题。

环境

网络:联通宽带 IPV4/IPv6双公网 /60前缀

1.这里宽带必须获取IPv6地址,当然要没有来自运营商的防火墙。

2.这里最好让路由器wan获取到/64前缀,保证路由器能使用SLAAC分配地址。

3.这里最好不要使用光猫拨号,一是光猫可能带有防火墙,二是有的光猫不支持DHCP PD(前缀分配),导致下级路由器只能分配到/64前缀地址,当然如果支持请忽略。

路由器:OpenWrt R22.7.7 (非官方,lede源码)

这里使用路由器系统为OpenWrt,这里没得说,大部分路由器系统防火墙是残废的,比如小米是禁用全部IPv6入站且不能更改,爱快允许全部流量,这样也非常不安全,当然其他Linux发行版也可以,就是管理和配置没有OpenWrt方便而已。

搭建服务的设备:群晖NAS

这里我设置群晖NAS,里面有群晖的服务和各种docker服务。

准备工作

排除来自运营商的防火墙

一般运营商不会设置防火墙,有也只有80,443端口,如果有的话也只能换运营商了。

为OpenWrt获得IPv6前缀

这里最好用光猫桥接,然后来用OpenWrt来PPPoE拨号,这样才能排除中的光猫中的防火墙,并且使用OpenWrt管理IPv6地址分配。

排除来自搭建服务设备的防火墙

设备自身也有防火墙,Windows/Linux都会有,请根据自身设备设置防火墙,Linux使用防火墙比较复杂,有firewalld,iptables,ufw等等,需要查询自己Linux发行版和版本使用的防火墙,来设置。

确定要开放端口的IPv6地址

目前来说IPv6 GUA(全球单播地址)地址后64位(主机部分)是不变的,当然也有例外:RFC7217 但此类地址默认用来访问外部服务,这种地址是默认阻断访问的。

IPv6有两种分配方式:无状态(SLAAC)和有状态(DHCPv6)

SLAAC

SLAAC通过ICMPv6来通告链路上地址的前缀,并通过EUI-64规则生成后面64位主机部分,因为EUI-64是通过接口MAC地址生成的,所以后64位是不变的。

这类地址后64位类似这样:****:**ff:fe**:****,比如 1234:12ff:fe12:1234 ,记下后面将使用此地址。

DHCPv6

DHCPv6类似IPv4中DHCP,它使用网络中设备里的一个服务来管理地址的分配,它适合大型网络里网络管理员能灵活的给设备分配地址,但这里不推荐使用此方法分配的地址,因为它存在租约,需要租约到期才能刷新地址,如果ISP提供的前缀地址刷新了,也要等到租约到期才能获得新地址,而SLAAC会主动发送ICMPv6 RA消息,通告前缀的改变。

举个例子我们在shell中使用ip addr命令打印出接口信息,部分涉及隐私已打码

排除LLA(Link-Local Address,链路本地地址)FE80::/10

ULA(Unique Local Address,唯一本地地址)FD00::/8

剩下的地址就是我们要使用的GUA(Global Unicast Address,全球单播地址)然后根据后64位地址来判断是DHCPv6还是SLAAC分配的地址了。

当然DHCPv6做为路由器主动分配,当然路由器上就可以查询到分配的地址

创建防火墙规则

使用OpenWrt的LuCI创建防火墙规则就非常方便

在网络-防火墙-通信规则找到“打开路由器端口”的添加,

点击添会跳转到规则编辑页面,

后面非常关键

目标区域选择 lan

目标地址选择自定义,然后填入,填写方式如下

::<需要暴露的后64位主机部分>/::ffff:ffff:ffff:ffff ,比如SLAAC: ::1234:12ff:fe12:1234/ffff:ffff:ffff:ffff

DHCPv6: ::1234/::ffff:ffff:ffff:ffff

目标端口:填写需要开放的端口,如如果遇到多个端口用空格隔开即可,遇到连续端口用“-”即可

比如: 80 443 9000-9010

其他默认即可

当然其他Linux也可以使用命令来配置,比如

ip6tables -I FORWARD -d ::1234:12ff:fe12:1234/::ffff:ffff:ffff:ffff -p tcp --dport 80,443,9000:9010 -j ACCEPT

配置完成后就可以看到新建的规则了

测试

验证是否成功配置我们可以直接在移动网络下访问IPv6地址即可,当然加上服务的端口号,要注意的是IPv6地址需要加[],比如http://[2408:aaaa:bbbb:cccc:dddd:eeee:ffff:aaaa]:5000

当然最方便访问的方法还是用域名了,这里就需要DDNS(动态域名解析),将地址动态的解析到域名中,就可以通过不变又好记的的域名来访问家中服务,以后有机会我再写一篇文章讲述我的解决方案。

参考

mikrotik社区:ALLOWING IPV6 TRAFFIC TO DEVICE WITH DYNAMIC IPV6 PREFIX BEHIND FIREWALL

github opnsense issues:firewall: Allow dynamic IPv6 prefixes in rules

个人博客:正确地配置 IPv6 防火墙和 DDNS 以在公网访问设备

评论
还没有评论
    发表评论 说点什么