感谢各位大佬的耐心解答,特别是@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 1
直接在路由器上用 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 1
可以考虑关掉 SLAAC 只用 DHCPv6,然后禁止 DHCPv6 动态分配(只允许手动添加的 static lease ),再把 NAS 加到 static lease.
我记得 OpenWrt 上这么做好像得魔改 odhcpd,或许用 dnsmasq 做 DHCPv6 服务器会更可行? |
7
qingxi 2020-04-22 01:20:12 +08:00 via Android 1
要么你给 nas 单独设置 DNS,其他内网
|
9
swiftg OP @updateing 谢谢,没找到禁用动态 DHCPv6 的地方。我的思路是想在防火墙把内网的 DHCPv6 流量全部 reject,再单独允许 nas 的 DHCPv6,但弄了半天 reject 规则不起作用,DHCPv6 还是在所有内网设备上都能工作。dnsmasq 我明天研究研究
|
11
jim9606 2020-04-22 04:47:53 +08:00 1
没实践过的方案
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
hand515 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 自动获取的是一模一样的
|
28
LGA1150 2020-04-22 14:59:28 +08:00 1
关闭 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 1
@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 1
@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 225 天前
routeros 如何实现只给特定的设备分配公网 ipv6 ?
|
66
belldasd 206 天前
求 Routeros 的设置方法!
|