1. IPv6环境下的OpenWRT防火墙安全挑战
最近在帮朋友调试家庭网络时,发现一个容易被忽视的安全隐患:当运营商分配了原生IPv6地址后,整个局域网设备都会获得公网可达的IPv6地址。这意味着如果防火墙配置不当,内网设备可能直接暴露在互联网威胁之下。今天我们就来聊聊如何在OpenWRT路由器上构建"IPv6白名单"防护体系。
我使用的是一台x86工控机刷写的OpenWRT 22.03系统,带有一个WAN口和三个LAN口。当启用IPv6后,通过ip -6 addr show命令可以看到,不仅WAN口获得了240开头的公网IPv6,LAN设备也都分配到了公网IPv6地址。这种设计虽然解决了NAT带来的各种问题,但安全风险也随之而来——任何知道设备IPv6地址的外部主机都可以直接发起连接。
2. OpenWRT防火墙基础架构解析
2.1 OpenWRT防火墙工作流程
OpenWRT使用基于nftables的防火墙系统(取代了旧版的iptables),其规则处理分为三个主要链:
- input链:处理发往路由器本身的流量
- output链:处理路由器发出的流量
- forward链:处理经过路由器转发的流量
对于IPv6而言,对应的规则表是filter表中的ip6系列规则。通过SSH登录路由器后,可以用nft list ruleset ip6命令查看当前所有IPv6规则。
2.2 默认规则的风险点
OpenWRT默认配置存在几个安全隐患:
- 允许ICMPv6全部通过(邻居发现等协议必需)
- forward链默认策略是ACCEPT(转发所有流量)
- 没有对LAN设备的入站连接做限制
这会导致:
- 内网设备的SSH、RDP等服务可能被暴力破解
- 物联网设备可能成为攻击跳板
- 恶意流量可以直接到达内网终端
3. 构建IPv6安全防护体系
3.1 基础防护配置
首先修改/etc/config/firewall配置文件:
bash复制# 设置默认策略为拒绝
config defaults
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option syn_flood '1'
# 允许已建立的连接通过
config zone
option name 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'REJECT' # 重要!阻止LAN设备间通过IPv6直连
option masq '1'
option mtu_fix '1'
list network 'lan'
config zone
option name 'wan'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT' # 默认拒绝所有转发
option masq '1'
option mtu_fix '1'
list network 'wan'
list network 'wan6'
3.2 创建端口白名单
假设我们需要允许外部访问内网192.168.1.100的TCP 80和443端口(Web服务),以及192.168.1.200的TCP 3389(RDP):
bash复制config rule
option name 'Allow-IPv6-HTTP'
option src 'wan'
option dest 'lan'
option dest_ip '::ffff:192.168.1.100/128' # IPv4映射地址
option dest_port '80 443'
option proto 'tcp'
option target 'ACCEPT'
option family 'ipv6'
config rule
option name 'Allow-IPv6-RDP'
option src 'wan'
option dest 'lan'
option dest_ip '::ffff:192.168.1.200/128'
option dest_port '3389'
option proto 'tcp'
option target 'ACCEPT'
option family 'ipv6'
3.3 关键防护规则
在/etc/firewall.user中添加自定义规则:
bash复制# 阻止非法的IPv6地址
nft add rule ip6 filter input ip6 saddr ::/128 drop
nft add rule ip6 filter input ip6 saddr ::1/128 drop
# 允许必要的ICMPv6
nft add rule ip6 filter input icmpv6 type { nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept
nft add rule ip6 filter forward icmpv6 type { nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept
# 阻止从WAN到LAN的其他所有IPv6连接
nft add rule ip6 filter forward iifname "eth0" oifname "br-lan" drop
4. 高级防护策略实现
4.1 动态DDNS防护
如果使用DDNS服务,需要额外防护:
bash复制# 安装ddns-scripts
opkg update
opkg install ddns-scripts
# 配置/etc/config/ddns
config service 'myddns'
option enabled '1'
option ip_source 'web'
option ip_url 'https://api64.ipify.org'
option interface 'wan'
option service_name 'cloudflare.com'
option domain 'yourdomain.example.com'
option username 'your_email'
option password 'your_api_key'
option use_ipv6 '1'
option check_unit 'minutes'
option force_unit 'minutes'
option retry_unit 'seconds'
然后在防火墙中添加对DDNS域名的特殊规则:
bash复制config rule
option name 'Allow-DDNS-IPv6'
option src 'wan'
option dest 'lan'
option dest_ip '::ffff:192.168.1.100/128'
option dest_port '80 443'
option proto 'tcp'
option target 'ACCEPT'
option family 'ipv6'
option extra '-m conntrack --ctstate NEW -m recent --set --name DDNS'
option extra '-m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 10 --name DDNS --rsource -j DROP'
4.2 连接数限制
防止暴力破解:
bash复制nft add table ip6 filter
nft add chain ip6 filter input { type filter hook input priority 0 \; }
nft add rule ip6 filter input tcp dport 3389 ct count over 3/minute drop
5. 验证与测试方法
5.1 规则验证
bash复制# 查看生效的nftables规则
nft list ruleset ip6
# 测试端口开放情况(从外部网络)
telnet your-ipv6-address 80
nmap -6 -Pn your-ipv6-address
5.2 安全扫描
使用扫描工具验证防护效果:
bash复制# 安装扫描工具
opkg install nmap
# 扫描IPv6开放端口
nmap -6 -Pn -sS -p- ::ffff:192.168.1.100
6. 常见问题解决方案
6.1 服务不可达排查
如果配置后服务无法访问:
- 检查
logread查看防火墙日志 - 确认IPv6地址是否正确:
bash复制
ip -6 addr show dev br-lan - 测试本地连通性:
bash复制curl -g -6 "http://[::ffff:192.168.1.100]"
6.2 性能优化技巧
当规则较多时,可以:
- 将频繁匹配的规则放在前面
- 使用集合优化:
bash复制nft add set ip6 filter allowed_ports { type inet_service \; } nft add element ip6 filter allowed_ports { 80, 443, 3389 } nft add rule ip6 filter forward tcp dport @allowed_ports accept
7. 持久化与备份
7.1 规则持久化
bash复制# 保存当前规则
nft list ruleset > /etc/nftables.ip6.rules
# 开机加载
echo 'include "/etc/nftables.ip6.rules"' >> /etc/nftables.conf
7.2 配置备份
建议将以下文件定期备份:
- /etc/config/firewall
- /etc/firewall.user
- /etc/nftables.ip6.rules
- /etc/config/ddns
可以使用uci export firewall命令导出当前防火墙配置。
经过以上配置,你的OpenWRT路由器将实现:
- 仅允许指定的IPv6入站连接
- 阻止所有其他未经授权的访问尝试
- 提供基本的防暴力破解保护
- 维持必要的IPv6网络功能
实际部署时,建议先在测试环境验证规则效果。每次修改配置后,可用/etc/init.d/firewall restart重启防火墙服务使更改生效。