感谢各位大佬的耐心解答,特别是@cwbsw。问题已经得到完美解决,openwrt 19.07和padavan都没有问题。总结一下给后来人:
路由器开RA和DHCPv6,防火墙把除NAS外的ICMPv6和DHCPv6包DROP掉,这样就只有NAS能正常获取IPv6地址,ip6ables规则来自@cwbsw
ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac ! --mac-source *** -j DROP ip6tables -A input_lan_rule -i br-lan -p udp --dport 547 -m mac ! --mac-source * -j DROP
另外曲线救国的思路包括
![]() | 1 zro 2020-04-22 00:06:43 +08:00 openwrt 装个 Polipo,需要 IPv6 就接到 Polipo 代理。。 |
![]() | 2 zro 2020-04-22 00:08:07 +08:00 顺便把 openwrt 的 dhcpv6 关掉。。 |
![]() | 3 lns103 2020-04-22 00:11:30 +08:00 via Android ![]() 直接在路由器上用 smartdns,开启 SOA,屏蔽 ipv6 的地址解析,而且外部 ipv6 的访问不受影响。 ps:电信的 ipv6 出国更恶心,大部分都绕欧洲,cf 美国可以直连,但是也辣鸡得不行 |
4 swiftg OP |
![]() | 5 zro 2020-04-22 00:45:42 +08:00 @swiftg #4 好久好久之前,Google 见过将 PPPoE 的 v4/v6 分离的,把 v6 数据包 drop 掉给其他设备,好像是这样子,具体记不太清。。 |
![]() | 6 updateing 2020-04-22 01:02:09 +08:00 via Android ![]() 可以考虑关掉 SLAAC 只用 DHCPv6,然后禁止 DHCPv6 动态分配(只允许手动添加的 static lease ),再把 NAS 加到 static lease. 我记得 OpenWrt 上这么做好像得魔改 odhcpd,或许用 dnsmasq 做 DHCPv6 服务器会更可行? |
7 qingxi 2020-04-22 01:20:12 +08:00 via Android ![]() 要么你给 nas 单独设置 DNS,其他内网 |
9 swiftg OP @updateing 谢谢,没找到禁用动态 DHCPv6 的地方。我的思路是想在防火墙把内网的 DHCPv6 流量全部 reject,再单独允许 nas 的 DHCPv6,但弄了半天 reject 规则不起作用,DHCPv6 还是在所有内网设备上都能工作。dnsmasq 我明天研究研究 |
![]() | 11 jim9606 2020-04-22 04:47:53 +08:00 ![]() 没实践过的方案 openwrt 为只使用 V4 设备单独开一个接口和防火墙区域 交换机页面为接入 LANV4 的网口划分独立 VLAN (例如 VLAN3: eth0-tagged, LAN4-untagged,其余为 off,产生交换机 eth0.3,如果接 eth1 就是 eth1.3 ) 防火墙创建 LANV4 区域,接口创建的 LANV4,另外分一个地址池,例如 192.168.2.1/24,该接口关闭 RA 、NDP 、DHCPv6,为加入的物理接口创建桥接(上面的 eth0.3,第二个 SSID ) LANV4 防火墙的转发设置跟 LAN 保持一致(出 /入 /转发为允许,允许目标区域 LAN+WAN,允许源区域 LAN ) windows 系统可以考虑修改策略优先 ipv4 ( https://support.microsoft.com/zh-cn/help/929852/guidance-for-configuring-ipv6-in-windows-for-advanced-users) linux 系统可修改 /etc/gai.conf 实现 |
12 swiftg OP @jim9606 谢谢这么详细的方案,可惜我的情况复杂了点,我路由器 4 个 LAN 口只保留了一个,下面接的一个 24 口交换机,所有有线设备都是接的这个交换机。剩下的 3 个 LAN 口都配置成了 WAN 口使用,接了两条宽带和 IPTV 。另外老家的 padavan 没有配置 switch 的功能 主要是移动设备不方便手动配置和调整优先级 |
13 Archeb 2020-04-22 08:18:50 +08:00 我认为用 iptables 屏蔽特定包可以做到这一点 |
![]() | 14 Finest 2020-04-22 08:25:39 +08:00 联通的 ipv6 感觉也是绕美国,traceroute -6 看,先到美国,再到香港 |
15 swiftg OP |
16 swiftg OP @hand515 三家的 IPv6 出口带宽都太小,V 站联通走日本,但是延迟炸裂,移动走香港,电信走美国,丢包都很严重,总之出国根本没法使用 |
18 swiftg OP @cwbsw 谢谢你的提醒,我发现之前屏蔽了 DHCPv6 后客户端获取的 IP 果然是通过 RA 获取的。 我尝试关闭 RA,可是 nas 虽然有 DHCPv6 获取的 IPv6 地址,却不能上网了,出站都是 Network is unreachable |
![]() | 19 updateing 2020-04-22 12:25:44 +08:00 via Android @swiftg RA 最好不要关闭, 它是获取默认路由的方式之一。只需要关闭 SLAAC 就足够了,就是 RA 里面对应前缀下的 Autonomous 位。这个用原版的 odhcpd 就可以设置,应该是页面上把 Router Advertisement 设置成 Stateful-only 就行. |
![]() | 20 zro 2020-04-22 12:29:04 +08:00 想到一个:OpenWRT 不给 lan 分配 v6,然后再搭个 OpenVPN 或 WireGuard 之类的,NAS 就能绕个弯拿到 v6 地址了。。虽然在内网间搭个 VPN 是夸张了点~ |
22 king050203 2020-04-22 13:44:01 +08:00 via Android 可以用 ebtables 过滤 ipv6 |
23 mandymak 2020-04-22 13:48:16 +08:00 @swiftg 更换主路由为 routeros,openwrt 改为旁路由,routeros 支持把 ipv6 配到独立的 bridge 。 |
24 swiftg OP @updateing openwrt 里没有 stateful,我猜应该就是对应的 server mode,无论设置为 server mode 还是 relay mode,局域网设备都可以自动获取 IPv6 地址。搜索资料发现 RA 走的 ICMPv6,我就在防火墙把所有 ICMPv6 包 DROP 了,然后单独 ACCEPT nas 的。现在看应该是没问题了。luci 里防火墙设置规则并且拖到最上面不起作用,必须要 ssh 进去手动输 ip6tables 命令才行。 ``` ip6tables -I INPUT -p udp --dport 546 -j DROP ip6tables -I INPUT -p udp --dport 547 -j DROP ip6tables -I INPUT -p icmpv6 -j DROP ip6tables -I INPUT -p udp -m mac --mac-source NAS_MAC_ADDRESS --dport 546 -j ACCEPT ip6tables -I INPUT -p udp -m mac --mac-source NAS_MAC_ADDRESS --dport 547 -j ACCEPT ip6tables -I INPUT -p icmpv6 -m mac --mac-source NAS_MAC_ADDRESS -j ACCEPT ``` |
25 swiftg OP @cwbsw 谢谢。我路由器关闭 RA,nas 上手动添加默认 IPv6 路由,还是 Network is unreachable,ip -6 r add default via fe80::6238:e085:ff05:c9d7 dev ens3,和 RA 自动获取的是一模一样的 |
img src="https://cdn.v2ex.com/gravatar/0d90b5321e8e90f260c8cb916d6ca5c5?s=48&d=retro" class="avatar" border="0" align="default" alt="cwbsw" data-uid="197179" /> | 27 cwbsw 2020-04-22 14:56:07 +08:00 @swiftg 想了下,最好应该还是只开 RA,禁用 DHCPv6,DROP 非 NAS 的 ICMP6 。 |
![]() | 28 LGA1150 2020-04-22 14:59:28 +08:00 ![]() 关闭 SLAAC: uci set dhcp.lan.ra_slaac=0 uci commit dhcp /etc/init.d/odhcpd restart RA 还是要开的 |
29 cwbsw 2020-04-22 14:59:45 +08:00 不对,不行,这样还是会广播 RA,光 DROP 入站不行。 |
![]() | 30 LGA1150 2020-04-22 15:09:31 +08:00 补充 #28 只有 snapshot 里的 odhcpd 支持 ra_slaac 设置,19.07 或 18.06 都不行 |
31 helldiablo 2020-04-22 16:25:32 +08:00 via Android '!~7 |
32 helldiablo 2020-04-22 16:28:58 +08:00 via Android '!~7i6 |
33 cwbsw 2020-04-22 16:47:03 +08:00 ![]() @LGA1150 snapshot 的话,只需 luci 里设置 statefull-only 即可,抓包看 RA 里已经没有 Auto Flag 。 综上,楼主需要在 luci 设置 statefull-only,DROP 掉非 NAS 的 ICMP6 和 UDP 547 入站。 |
34 swiftg OP @cwbsw 十分感谢!我现在用的 openwrt 19.07 和 padavan 。这样手动设置防火墙后貌似可以达到我想要的效果了,openwrt 上的其他设备偶尔还会获得 IPv6 地址,搞不懂为什么,可能防火墙重启了? openwrt 上设置为 Router Advertisement-Service: Server Mode DHCPv6-Service: Server Mode NDP-Proxy: Disabled DHCPv6-Mode: Stateful only padavan 上设置为 WAN: Stateless RA 通过 DHCP 获取内网 IPv6 地址:是 启用 LAN 路由器广播: 是 启用 LAN DHCPv6 服务器: Stateful 两个路由器上都用的同样的规则 ip6tables -I INPUT -p udp --dport 547 -j DROP ip6tables -I INPUT -p icmpv6 -j DROP ip6tables -I INPUT -p udp -m mac --mac-source NAS_MAC_ADDR --dport 547 -j ACCEPT ip6tables -I INPUT -p icmpv6 -m mac --mac-source NAS_MAC_ADDR -j ACCEPT |
35 cwbsw 2020-04-22 18:30:01 +08:00 ![]() @swiftg 规则加到 /etc/firewall.user 里重启就不会失效。 ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac ! --mac-source *** -j DROP ip6tables -A input_lan_rule -i br-lan -p udp --dport 547 -m mac ! --mac-source * -j DROP 可能是 30 楼说的原因,19.07 的 statefull-only 实现有问题。可以抓包确认一下。 prefix info option (3), length 32 (4): 240e:***::/64, Flags [onlink], valid time 2251s, pref. time 2251s Flags 那一项不应该有 Auto 。 |
36 swiftg OP @cwbsw 我是写到 firewall.user 的,可能之前手动重启的间隙获取的,目前几个小时过去了没有任何问题了。唯一的小瑕疵,WAN 口也不能获取地址,路由本身不能监听 IPv6 端口了 |
37 swiftg OP |
38 qingxi 2020-04-28 11:24:01 +08:00 via Android 最好的解决方案是国内解析启用双栈,国外只解析 ipv4,或屏蔽是双栈网站的 ipv6 解析 |
40 qingxi 2020-04-28 11:59:59+08:00 via Android @swiftg 需要完整 ipv6 机器就手动设置 ipv6 dns,openwrt dhcpv6 没找到分组下发配置的方案 |
41 swiftg OP @qingxi 这不是找到方案了么,iptables 分机器允许下发,操作也简单。dns 方案不够完美,我工作的机器也需要能查询 AAAA 记录,而且经常用到,但是我不想浏览器访问 IPv6 地址 |
![]() | 42 lzl2000 2020-05-06 23:19:32 +08:00 我也想这样设置,能把你 Padavan 防火墙规则的截图我看看吗 |
44 swiftg OP @lzl2000 padavan 的 LAN 接口是 br0,如果你只有一个设备需要 IPv6 的话就按 cwbsw 的写法一条命令用! mac-source 写,如果几个设备的话就按我的写法写,注意顺序,后写的先匹配 |
45 zhs1113 2020-05-08 08:11:08 +08:00 ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac ! --mac-source *** -j DROP ip6tables -A input_lan_rule -i br-lan -p udp --dport 547 -m mac ! --mac-source * -j DROP 我按照上面这两条成功指定一台设备分配 ipv6,但是要把 /etc/firewall.user 的文件权限改成可读写执行。 还有个问题是 op 上显示只分配了一台设备的 v6,但是实际上其他设备过一段时间后又自动获取了 ipv6,即使设有状态模式 statefull 我的解决方法是按照 28 楼的 ssh 执行 uci set dhcp.lan.ra_slaac=0 uci commit dhcp /etc/init.d/odhcpd restart 最后发现其他设备没再获取 ipv6 还有我想添加多个设备分配 v6 但是总是不成功 把下面的规则加进防火墙 重启后 却连一个都没分配到 请问要怎么解决 ip6tables -A input_lan_rule -i br-lan -p udp --dport 547 -j DROP ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -j DROP ip6tables -A input_lan_rule -i br-lan -p udp -m mac --mac-source mac 地址 2 --dport 547 -j ACCEPT ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac --mac-source mac 地址 2 -j ACCEPT ip6tables -A input_lan_rule -i br-lan -p udp -m mac --mac-source mac 地址 1 --dport 547 -j ACCEPT ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac --mac-source mac 地址 1 -j ACCEPT |
46 swiftg OP @zhs1113 firewall.user 肯定要执行权限才能运行。我是 19.07 ,不用改 28 楼的也没问题。 多个设备那个,-A 是附加到链的最后,先添加的先匹配。我不知道为什么用-A 添加的规则执行不了就用-I 插入到链的开头,后插入的先执行。所以你的规则要么把-A 改成-I,要么把顺序调换下就行了 |
49 zhs1113 2020-05-08 17:55:02 +08:00 可能因为被分配的设备没开 dhcpv6 吧 不是很确定 |
![]() | 50 whitegerry 2020-05-14 01:18:51 +08:00 用 ros 也按这种方式测试了下,重新拨号成功的瞬间,所有设备都获取到 ipv6 了,但只有允许的设备 ipv6 是通的,其他设备重启一下网络 ipv6 才会消失 |
51 zhs1113 2020-09-15 19:28:22 +08:00 @whitegerry 我刚用 ros,配置好 ipv6 了 请问要怎么加这个特定设备分配 ipv6 的规则,请教一下 |
![]() | 52 dasenlin 2021-05-03 14:26:18 +08:00 @zhs1113 实测这样是可行的 ip6tables -A input_lan_rule -i br-lan -p udp -m mac --mac-source mac 地址 2 --dport 547 -j ACCEPT ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac --mac-source mac 地址 2 -j ACCEPT ip6tables -A input_lan_rule -i br-lan -p udp -m mac --mac-source mac 地址 1 --dport 547 -j ACCEPT ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac --mac-source mac 地址 1 -j ACCEPT ip6tables -A input_lan_rule -i br-lan -p udp --dport 547 -j DROP ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -j DROP 或者倒序插入 ip6tables -I input_lan_rule -i br-lan -p udp --dport 547 -j DROP ip6tables -I input_lan_rule -i br-lan -p ipv6-icmp -j DROP ip6tables -I input_lan_rule -i br-lan -p udp -m mac --mac-source mac 地址 2 --dport 547 -j ACCEPT ip6tables -I input_lan_rule -i br-lan -p ipv6-icmp -m mac --mac-source mac 地址 2 -j ACCEPT ip6tables -I input_lan_rule -i br-lan -p udp -m mac --mac-source mac 地址 1 --dport 547 -j ACCEPT ip6tables -I input_lan_rule -i br-lan -p ipv6-icmp -m mac --mac-source mac 地址 1 -j ACCEPT |
54 jiacuo 2021-10-25 20:31:29 +08:00 靠这个帖子解决了大问题。谢谢 |
![]() | 55 Jays 2021-11-07 11:43:00 +08:00 @cwbsw 请问一下,如果有多台设备,规则应该怎样填写? 这个命令支持一台设备,即便再复制更改 mac 后设备第二台设备的 IPV6 还是无法访问网络 ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac ! --mac-source *** -j DROP ip6tables -A input_lan_rule -i br-lan -p udp --dport 547 -m mac ! --mac-source * -j DROP |
![]() | 57 Jays 2021-11-07 16:22:45 +08:00 via Android @cwbsw 52 楼的试了下,貌似没用。ipV6 地址都能获取到 但 ping 其他 ipv6 地址 都 ping 不通 |
![]() | 58 wwbfred 2022-02-22 02:28:55 +08:00 Openwrt 21.04 版本设置方法: 1. 找到 Lan 设置中 DHCP 服务器下的 IPv6 设置,将 RA 服务和 DHCPv6 服务调为服务器模式。 2. IPv6 RA 设置中取消"启用 SLAAC"选项,RA 标记勾选"受管配置 (M)"和"其他配置 (O)"。 3. ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac ! --mac-source * -j DROP 4. ip6tables -A input_lan_rule -i br-lan -p udp --dport 547 -m mac ! --mac-source * -j DROP |
![]() | 59 berry10086 2022-10-24 19:38:34 +08:00 补充一条,还需要加上 ra_dns 0 进制广播 ipv6 dns |
![]() | 60 Jays 2022-10-29 13:22:31 +08:00 @berry10086 请问 ra_dns 0 是在哪个界面设置? |
![]() | 61 berry10086 2022-10-30 21:59:52 +08:00 @Jays /etc/config/dhcp 里面 lan config |
![]() | 62 silvernoo 2022-12-15 01:11:29 +08:00 路由器关闭 dhcpv6 ,nas 配置静态 v6 地址 |
![]() | 64 tediorelee 2023-03-31 17:31:51 +08:00 抱歉挖个坟,最近也正好有这个需求,按照贴子里的思路配置了一番,但是没有效果不知道什么原因 openwrt 设置如下: 网络-DHCP/DNS-取消勾选“禁止解析 IPv6 DNS 记录” 网络-接口-LAN - 路由通告服务:服务器模式 - DHCP v6 服务:服务器模式 - NDP 代理:关闭 - DHCPv6 模式:有状态的 - 总是通告默认路由:没有勾选 已配置贴子里的这个: uci set dhcp.lan.ra_slaac=0 uci commit dhcp /etc/init.d/odhcpd restart /etc/config/dhcp 里加上了 ra_dns 0 重启路由器之后,还是有其它设备获取到了 IPV6 ,并且我允许 ipv6 的设备没办法用 ipv6 访问 ip6tables -A input_lan_rule -i br-lan -p ipv6-icmp -m mac ! --mac-source 00-A0-XX-77-3F-1F -j DROP ip6tables -A input_lan_rule -i br-lan -p udp --dport 547 -m mac ! --mac-source 00-A0-XX-77-3F-1F -j DROP openwrt 版本:R21.8.6 GDQ v9.1[2021] Compiled by eSir |
65 zks728 2024-04-12 01:41:26 +08:00 routeros 如何实现只给特定的设备分配公网 ipv6 ? |
66 belldasd 2024-04-30 19:55:30 +08:00 求 Routeros 的设置方法! |
67 guiys 2024-05-04 17:33:03 +08:00 via iPhone |
![]() | 68 Toby23 229 天前 via iPhone 不好意思 挖一下 现在防火墙用的 nftables Openwrt 也没有 自定义规则一栏了 怎么实现这个功能啊 |