首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
测试工具
SmokePing
IPv6 访问测试
swiftg
V2EX  ›  宽带症候群

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

  •  
  •   swiftg · 84 天前 via iPhone · 3300 次点击
    这是一个创建于 84 天前的主题,其中的信息可能已经有所发展或是发生改变。
    移动宽带没有公网 IPv4,有 IPv6 地址,外网可以直接入站访问家里的 nas,但是 IPv6 出站访问外网的线路质量就特别差,好像总共出国带宽只有 20G 。偏偏电脑和手机在获取 IPv6 地址后都会优先使用 IPv6 访问,造成访问比如 V2EX 速度很慢。

    不想手动在每个设备上配置 IP,有些设备还不能手动配置。请问有没有办法可以在路由器上设置只给某个设备分配 IPv6 地址。路由器是 openwrt 和 padavan
    第 1 条附言  ·  83 天前

    感谢各位大佬的耐心解答,特别是@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
    

    另外曲线救国的思路包括

    • smartdns建立一个IPv4 only的DNS服务器给NAS外的设备使用,NAS使用正常的DNS
    • 只给路由器本身配置IPv6地址,并使用socat端口转发,把IPv6流量转发到内网的IPv4地址。本人实际测试有不可忽略的性能损失
    • 只给路由器本身配置IPv6地址,并开启VPN服务供NAS连接,似乎太绕了点
    50 条回复    2020-05-14 01:18:51 +08:00
    zro
        1
    zro   84 天前
    openwrt 装个 Polipo,需要 IPv6 就接到 Polipo 代理。。
    zro
        2
    zro   84 天前
    顺便把 openwrt 的 dhcpv6 关掉。。
    lns103
        3
    lns103   84 天前 via Android   ❤️ 1
    直接在路由器上用 smartdns,开启 SOA,屏蔽 ipv6 的地址解析,而且外部 ipv6 的访问不受影响。
    ps:电信的 ipv6 出国更恶心,大部分都绕欧洲,cf 美国可以直连,但是也辣鸡得不行
    swiftg
        4
    swiftg   84 天前 via iPhone
    @lns103 谢谢,smartdns 这个我也想到了,但这不是完美的方案,nas 上我还是需要正常解析 IPv6 的 dns,包括其他设备,有时需要 dig nslookup 调试些东西

    @zro 谢谢,路由器上端口转发到内网我也想到了,我用的 socat,实际测试性能有损失。直接访问 nas 的 IPv6 地址 15-20MB/s 跑满宽带,socat 端口转发到 nas 的内网 IP 只有 10MB/s 。而且我还想 nas 能出站访问外网的 IPv6 地址
    zro
        5
    zro   84 天前
    @swiftg #4 好久好久之前,Google 见过将 PPPoE 的 v4/v6 分离的,把 v6 数据包 drop 掉给其他设备,好像是这样子,具体记不太清。。😣
    updateing
        6
    updateing   84 天前 via Android   ❤️ 1
    可以考虑关掉 SLAAC 只用 DHCPv6,然后禁止 DHCPv6 动态分配(只允许手动添加的 static lease ),再把 NAS 加到 static lease.

    我记得 OpenWrt 上这么做好像得魔改 odhcpd,或许用 dnsmasq 做 DHCPv6 服务器会更可行?
    qingxi
        7
    qingxi   84 天前 via Android   ❤️ 1
    要么你给 nas 单独设置 DNS,其他内网
    qingxi
        8
    qingxi   84 天前 via Android
    @qingxi 其他内网 DNS 屏蔽 ipv4 解析
    swiftg
        9
    swiftg   84 天前 via iPhone
    @updateing 谢谢,没找到禁用动态 DHCPv6 的地方。我的思路是想在防火墙把内网的 DHCPv6 流量全部 reject,再单独允许 nas 的 DHCPv6,但弄了半天 reject 规则不起作用,DHCPv6 还是在所有内网设备上都能工作。dnsmasq 我明天研究研究
    swiftg
        10
    swiftg   84 天前 via iPhone
    @qingxi 单独 dns 这个是个不错的曲线备选方案,但我还是想弄个完美的解决办法
    jim9606
        11
    jim9606   84 天前   ❤️ 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 实现
    swiftg
        12
    swiftg   84 天前 via iPhone
    @jim9606 谢谢这么详细的方案,可惜我的情况复杂了点,我路由器 4 个 LAN 口只保留了一个,下面接的一个 24 口交换机,所有有线设备都是接的这个交换机。剩下的 3 个 LAN 口都配置成了 WAN 口使用,接了两条宽带和 IPTV 。另外老家的 padavan 没有配置 switch 的功能

    主要是移动设备不方便手动配置和调整优先级
    Archeb
        13
    Archeb   84 天前
    我认为用 iptables 屏蔽特定包可以做到这一点
    hand515
        14
    hand515   84 天前
    联通的 ipv6 感觉也是绕美国,traceroute -6 看,先到美国,再到香港
    swiftg
        15
    swiftg   84 天前 via iPhone
    @Archeb 我也是这么想的,但是我尝试屏蔽内网所有的 DHCPv6 流量( udp 546,547 端口),但是没有成功,设备照样可以获取 IPv6 地址。

    可否指导下怎么设置防火墙?
    swiftg
        16
    swiftg   84 天前 via iPhone
    @hand515 三家的 IPv6 出口带宽都太小,V 站联通走日本,但是延迟炸裂,移动走香港,电信走美国,丢包都很严重,总之出国根本没法使用
    cwbsw
        17
    cwbsw   84 天前
    @swiftg RA 关了吗?
    swiftg
        18
    swiftg   84 天前 via iPhone
    @cwbsw 谢谢你的提醒,我发现之前屏蔽了 DHCPv6 后客户端获取的 IP 果然是通过 RA 获取的。

    我尝试关闭 RA,可是 nas 虽然有 DHCPv6 获取的 IPv6 地址,却不能上网了,出站都是 Network is unreachable
    updateing
        19
    updateing   84 天前 via Android
    @swiftg RA 最好不要关闭, 它是获取默认路由的方式之一。只需要关闭 SLAAC 就足够了,就是 RA 里面对应前缀下的 Autonomous 位。这个用原版的 odhcpd 就可以设置,应该是页面上把 Router Advertisement 设置成 Stateful-only 就行.
    zro
        20
    zro   84 天前
    想到一个:OpenWRT 不给 lan 分配 v6,然后再搭个 OpenVPN 或 WireGuard 之类的,NAS 就能绕个弯拿到 v6 地址了。。虽然在内网间搭个 VPN 是夸张了点~🥱
    cwbsw
        21
    cwbsw   84 天前
    @swiftg 手动添加默认路由。
    ip -6 r add default via fe80:*** dev ***
    king050203
        22
    king050203   84 天前 via Android
    可以用 ebtables 过滤 ipv6
    mandymak
        23
    mandymak   84 天前
    @swiftg 更换主路由为 routeros,openwrt 改为旁路由,routeros 支持把 ipv6 配到独立的 bridge 。
    swiftg
        24
    swiftg   84 天前
    @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
        25
    swiftg   84 天前
    @cwbsw 谢谢。我路由器关闭 RA,nas 上手动添加默认 IPv6 路由,还是 Network is unreachable,ip -6 r add default via fe80::6238:e085:ff05:c9d7 dev ens3,和 RA 自动获取的是一模一样的
    cwbsw
        26
    cwbsw   84 天前
    @swiftg 奇怪了,我 Windows 机器就可以这么干,路由器不开 RA,然后手动配地址和路由。
    cwbsw
        27
    cwbsw   84 天前
    @swiftg 想了下,最好应该还是只开 RA,禁用 DHCPv6,DROP 非 NAS 的 ICMP6 。
    LGA1150
        28
    LGA1150   84 天前   ❤️ 1
    关闭 SLAAC:
    uci set dhcp.lan.ra_slaac=0
    uci commit dhcp
    /etc/init.d/odhcpd restart
    RA 还是要开的
    cwbsw
        29
    cwbsw   84 天前
    不对,不行,这样还是会广播 RA,光 DROP 入站不行。
    LGA1150
        30
    LGA1150   84 天前
    补充 #28
    只有 snapshot 里的 odhcpd 支持 ra_slaac 设置,19.07 或 18.06 都不行
    helldiablo
        31
    helldiablo   83 天前 via Android
    '!~7
    helldiablo
        32
    helldiablo   83 天前 via Android
    '!~7i6
    cwbsw
        33
    cwbsw   83 天前   ❤️ 1
    @LGA1150
    snapshot 的话,只需 luci 里设置 statefull-only 即可,抓包看 RA 里已经没有 Auto Flag 。
    综上,楼主需要在 luci 设置 statefull-only,DROP 掉非 NAS 的 ICMP6 和 UDP 547 入站。
    swiftg
        34
    swiftg   83 天前
    @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
        35
    cwbsw   83 天前
    @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
        36
    swiftg   83 天前
    @cwbsw 我是写到 firewall.user 的,可能之前手动重启的间隙获取的,目前几个小时过去了没有任何问题了。唯一的小瑕疵,WAN 口也不能获取地址,路由本身不能监听 IPv6 端口了
    swiftg
        37
    swiftg   83 天前
    @swiftg #36,我自己规则没有指定 lan 接口,按照 @cwbsw 的规则加上-i br-lan,WAN 口就也可以获取 IPv6 地址了。

    自此问题完美解决,感谢楼上各位大佬的耐心解答指导
    qingxi
        38
    qingxi   78 天前 via Android
    最好的解决方案是国内解析启用双栈,国外只解析 ipv4,或屏蔽是双栈网站的 ipv6 解析
    swiftg
        39
    swiftg   78 天前 via iPhone
    @qingxi 我需要这台机器上有完整的 IPv6 环境,可以做测试,DNS 的方案不太合适
    qingxi
        40
    qingxi   78 天前 via Android
    @swiftg 需要完整 ipv6 机器就手动设置 ipv6 dns,openwrt dhcpv6 没找到分组下发配置的方案
    swiftg
        41
    swiftg   78 天前 via iPhone
    @qingxi 这不是找到方案了么,iptables 分机器允许下发,操作也简单。dns 方案不够完美,我工作的机器也需要能查询 AAAA 记录,而且经常用到,但是我不想浏览器访问 IPv6 地址
    lzl2000
        42
    lzl2000   69 天前
    我也想这样设置,能把你 Padavan 防火墙规则的截图我看看吗
    swiftg
        43
    swiftg   69 天前 via iPhone
    @lzl2000 ip6tables 规则已经贴出来了,放到自定义防火墙规则里就行了
    swiftg
        44
    swiftg   69 天前 via iPhone
    @lzl2000 padavan 的 LAN 接口是 br0,如果你只有一个设备需要 IPv6 的话就按 cwbsw 的写法一条命令用! mac-source 写,如果几个设备的话就按我的写法写,注意顺序,后写的先匹配
    zhs1113
        45
    zhs1113   68 天前
    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
    swiftg
        46
    swiftg   68 天前 via iPhone
    @zhs1113 firewall.user 肯定要执行权限才能运行。我是 19.07 ,不用改 28 楼的也没问题。
    多个设备那个,-A 是附加到链的最后,先添加的先匹配。我不知道为什么用-A 添加的规则执行不了就用-I 插入到链的开头,后插入的先执行。所以你的规则要么把-A 改成-I,要么把顺序调换下就行了
    zhs1113
        47
    zhs1113   67 天前
    @swiftg -A 改成-I 后只有 MAC 地址 1 分配到 v6 第二个分配不到 我的是 lean N1 主路由
    zhs1113
        48
    zhs1113   67 天前
    @swiftg 而且好像用 ACCEPT 也没真正分配成功 被分配的设备显示的不是公网 ipv6
    zhs1113
        49
    zhs1113   67 天前
    可能因为被分配的设备没开 dhcpv6 吧 不是很确定
    whitegerry
        50
    whitegerry   62 天前
    用 ros 也按这种方式测试了下,重新拨号成功的瞬间,所有设备都获取到 ipv6 了,但只有允许的设备 ipv6 是通的,其他设备重启一下网络 ipv6 才会消失
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4363 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:03 · PVG 16:03 · LAX 01:03 · JFK 04:03
    ♥ Do have faith in what you're doing.