如何只给路由器后的某个设备单独分配 IPv6 地址

2020-04-22 00:01:30 +08:00
 swiftg
移动宽带没有公网 IPv4,有 IPv6 地址,外网可以直接入站访问家里的 nas,但是 IPv6 出站访问外网的线路质量就特别差,好像总共出国带宽只有 20G 。偏偏电脑和手机在获取 IPv6 地址后都会优先使用 IPv6 访问,造成访问比如 V2EX 速度很慢。

不想手动在每个设备上配置 IP,有些设备还不能手动配置。请问有没有办法可以在路由器上设置只给某个设备分配 IPv6 地址。路由器是 openwrt 和 padavan
16452 次点击
所在节点    宽带症候群
67 条回复
cwbsw
2020-04-22 13:39:18 +08:00
@swiftg 手动添加默认路由。
ip -6 r add default via fe80:*** dev ***
king050203
2020-04-22 13:44:01 +08:00
可以用 ebtables 过滤 ipv6
mandymak
2020-04-22 13:48:16 +08:00
@swiftg 更换主路由为 routeros,openwrt 改为旁路由,routeros 支持把 ipv6 配到独立的 bridge 。
swiftg
2020-04-22 13:57:51 +08:00
@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
```
swiftg
2020-04-22 14:09:28 +08:00
@cwbsw 谢谢。我路由器关闭 RA,nas 上手动添加默认 IPv6 路由,还是 Network is unreachable,ip -6 r add default via fe80::6238:e085:ff05:c9d7 dev ens3,和 RA 自动获取的是一模一样的
cwbsw
2020-04-22 14:23:22 +08:00
@swiftg 奇怪了,我 Windows 机器就可以这么干,路由器不开 RA,然后手动配地址和路由。
cwbsw
2020-04-22 14:56:07 +08:00
@swiftg 想了下,最好应该还是只开 RA,禁用 DHCPv6,DROP 非 NAS 的 ICMP6 。
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 还是要开的
cwbsw
2020-04-22 14:59:45 +08:00
不对,不行,这样还是会广播 RA,光 DROP 入站不行。
LGA1150
2020-04-22 15:09:31 +08:00
补充 #28
只有 snapshot 里的 odhcpd 支持 ra_slaac 设置,19.07 或 18.06 都不行
helldiablo
2020-04-22 16:25:32 +08:00
'!~7
helldiablo
2020-04-22 16:28:58 +08:00
'!~7i6
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 入站。
swiftg
2020-04-22 17:42:59 +08:00
@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
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 。
swiftg
2020-04-22 19:31:13 +08:00
@cwbsw 我是写到 firewall.user 的,可能之前手动重启的间隙获取的,目前几个小时过去了没有任何问题了。唯一的小瑕疵,WAN 口也不能获取地址,路由本身不能监听 IPv6 端口了
swiftg
2020-04-22 19:53:17 +08:00
@swiftg #36,我自己规则没有指定 lan 接口,按照 @cwbsw 的规则加上-i br-lan,WAN 口就也可以获取 IPv6 地址了。

自此问题完美解决,感谢楼上各位大佬的耐心解答指导
qingxi
2020-04-28 11:24:01 +08:00
最好的解决方案是国内解析启用双栈,国外只解析 ipv4,或屏蔽是双栈网站的 ipv6 解析
swiftg
2020-04-28 11:47:44 +08:00
@qingxi 我需要这台机器上有完整的 IPv6 环境,可以做测试,DNS 的方案不太合适
qingxi
2020-04-28 11:59:59 +08:00
@swiftg 需要完整 ipv6 机器就手动设置 ipv6 dns,openwrt dhcpv6 没找到分组下发配置的方案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/664819

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX