跳过正文
  1. 文章/

Immortalwrt折腾日记

·3265 字·7 分钟
目录

前言
#

早年接触过wrt,但是那时候用的还是7621的设备,使用mtk开源驱动后信号会变得非常差,闭源驱动会出现死机的情况。如今入手7981的路由器,终于可以研究一下配置以及日用了。

IPv6上网
#

想让路由器下面的设备上网,无非就这么几种方式:

  • PD(Prefix Delegation): 上级下发ipv6的/56或者/60的前缀,可以自己划分子网使用。

  • NDP Proxy: 上级通过SLAAC分配ipv6地址,只开启了O标志,获得一个/64的地址的时候使用。

  • NPTv6: 你有多条宽带,需要做负载均衡。

  • NAPTv6: 上级只允许通过DHCPv6获取地址(一般是学校之类需要强管理或者认证的场景),获得一个/128的地址。

欸,这时候有人问,/128不是也可以使用ndp代理吗?

理论上确实可行,但是很多DHCPv6服务器并不支持代理获取,下面这个tcpdump结果说明了这一点:

root@ImmortalWrt:~# tcpdump -i eth1 udp port 546 or udp port 547
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes
15:03:40.878466 IP6 fe80::aaaa.546 > ff02::1:2.547: dhcp6 solicit
15:03:40.880132 IP6 fe80::bbbb.547 > fe80::aaaa.546: dhcp6 advertise
15:03:42.905527 IP6 fe80::aaaa.546 > ff02::1:2.547: dhcp6 request
15:03:42.908198 IP6 fe80::bbbb.547 > fe80::aaaa.546: dhcp6 reply
15:04:39.149414 IP6 ImmortalWrt.lan.547 > ff05::1:3.547: dhcp6 relay-fwd
15:04:40.188299 IP6 ImmortalWrt.lan.547 > ff05::1:3.547: dhcp6 relay-fwd
15:04:42.189520 IP6 ImmortalWrt.lan.547 > ff05::1:3.547: dhcp6 relay-fwd

使用ff05的广播根本就不回你。

NDP代理
#

在路由器上面这样设置:

  1. wan6

DHCP服务器-IPv6设置:

  • 指定的主接口(打勾)
  • RA服务:中继模式
  • DHCPv6服务:中继模式
  • NDP代理:中继模式
  • 学习路由(打勾)
  1. br-lan

DHCP服务器-IPv6设置:

  • 指定的主接口(不允许选择了)
  • RA服务:中继模式
  • DHCPv6服务:中继模式
  • NDP代理:中继模式
  • 学习路由(打勾)
  • NDP代理从属设备(打勾)

这样操作相当于透传了上级路由的RA(路由器通告),上面怎么样p配置,你的局域网设备就是怎么样的,没法更改,当然如果你能获取到/64的前缀,那么下面的设备一般来说也没有问题。

前缀下发
#

这当然是最推荐的方式了。

在现代的类wrt上面,使用PPPoE在wan口上拨号,同时在高级设置里面开启获取IPv6地址为自动,如果你的ISP有IPv6支持,会自动产生一个虚拟动态接口wan_6。一般这个接口能获取到一个/64的地址和IPv6-PD,这是我们能分配的前提条件。

我的配置是这样的:

  • RA服务:服务器模式
  • DHCPv6服务: 已禁用
  • NDP代理:已禁用

使用简单的路由通告配置
#

在家用的小型网络中,完全可以做到不架设DHCPv6服务器,只通过RA就可以实现基本的配置了,请看这个包:

root@t-router:~# tcpdump -nvi br-lan ip6[40] == 134
tcpdump: listening on br-lan, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:35:28.476086 IP6 (flowlabel 0x4f20d, hlim 255, next-header ICMPv6 (58) payload length: 144) fe80::aaaa > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 144
        hop limit 64, Flags [none], pref medium, router lifetime 1800s, reachable time 0ms, retrans timer 0ms
          source link-address option (1), length 8 (1): aa:aa:aa:aa:aa:aa
          mtu option (5), length 8 (1):  1492
          prefix info option (3), length 32 (4): 2409:xxxx:xxxx:13a::/64, Flags [onlink, auto], valid time 5400s, pref. time 2700s
          route info option (24), length 24 (3):  2409:xxxx:xxxx:130::/60, pref=medium, lifetime=1800s
          rdnss option (25), length 24 (3):  lifetime 1800s, addr: 2409:xxxx:xxxx:13a::1
          dnssl option (31), length 24 (3):  lifetime 1800s, domain(s): lan.
          advertisement interval option (7), length 8 (1):  600000ms

几个重要的信息全部体现在这个里面了:

  1. 地址:

没有配置Flag,说明是Stateless,设备自己生成配置,是否开启RFC4941(隐私地址)由设备自己决定。

不过无状态自动配置要求地址的前缀必须是/64以上的,否则会破坏这一行为。

  1. 网关:

规定路由通告必须使用fe80开头的本地地址来发送路由通告,只要路由存活时间不为0,那么下面的设备就可以使用这个地址当做默认路由。

  1. DNS
  • 使用rdnss option来配置DNS。

Windows在大概1709这个版本之后支持rdnss了,其他系统应该都支持吧?

  • 使用dnssl option来配置DNS搜索域。

这个感觉意义不大,因为使用DHCPv6才会解析主机名.lan,这个使用DHCPv4已经足够了。

不过注意不要设置成.local,因为mDNS会使用这个域名导致冲突,而mDNS会自动发现的。

如果你有/60的前缀,可以在高级设置里面填写IPv6分配提示,4位正好可以填一位16进制数,0-f,以此类推/56可以填两位,从而划分多个IPv6子网。

像我就是填了a

使用DHCPv6
#

如果设备比较老,可能还是得开启DHCPv6,办法就是把DHCPv6服务设置成服务器模式。

这时候就可以在RA设置里面的RA标记开启几个选项,让设备使用DHCPv6服务,这里配置项目已经讲解得很明白,我就不多说了,直接贴上来:

RA 标记

受管配置 (M)
受管地址配置 (M) 标记表明可以通过 DHCPv6 获取 IPv6 地址。
其他配置 (O)
其他配置 (O) 标记表明其他信息,如 DNS 服务器,可以通过 DHCPv6 获得。
移动家乡代理 (H)
移动 IPv6 家乡代理 (H) 标记表明该设备在此链路上还充当移动 IPv6 家乡代理。

DHCPv6还可以配置别的一大堆东西,比如NTP之类的,但是v4已经干了这一堆了,我觉得除非v4被完全替代,否则现阶段完全没有理由用。

NPTv6/NAPTv6
#

如果有多条宽带并且都有PD,你可以内网分配一个ULA地址,然后在路由的时候进行前缀转换,这也是我们学校社团网络的做法。这种办法对于性能要求的不高,本身也算符合IPv6的实践。


但是如果你只能通过DHCPv6配到一个/128的地址,那就没办法了,直接用动态地址伪装(masquerade)吧,一般的路由器都不会有硬件加速,所以网速不太行,但是如果是IPv6刚需也没有别的办法了。

我有点懒得写了,想用的可以参考南航校园网OpenWRT配置IPv6 NAT6,我自己在学校里面配的过程已经忘记了,不过跟这个应该大差不差。

邻居协议
#

IPv6相比v4的b就是不同,就是邻居协议取代ARP,RA实现了DHCP的基本功能。

路由器和客户端使用NS(Neighbour Solicitation)和NA(Neighbour Advertisement)来检测地址冲突,探测别的设备。

一个SLAAC的过程具体是这样:

  1. 连接到网络,先生成一个地址,用::发送到这个地址,看自己生成的fe80::/16有没有冲突,没有就使用。
  2. ff02::发送RS,寻找路由器。
  3. 路由器默认会每隔几分钟发送RA,接收到RS后,会尽快回复RA消息。
  4. 客户端自己生成一个全球唯一的可路由地址,然后再看有没有冲突,没冲突就开始使用这个地址上网。

VLAN划分
#

出于管理需要,我决定在路由器上面划分VLAN了,不过我其实并没有另一台VLAN的交换机,所以说并不是满血的VLAN。同时由于是新手,对于VLAN的理解肯定有不到位之处,请多包涵。

简单的概念
#

  • trunk:在这个通道上面跑的是打上不同ID的VLAN。
  • access:某个端口,一般来说一个端口只分配给一个VLAN ID。

在某个端口上面,选择了VLAN ID,有不同的标志可以分配:

  • 不属于:这个VLAN不分配到这个端口。
  • tagged:通过这个端口的数据包,都会被打上这个VLAN的ID。
  • untagged:通过这个端口的数据包,如果有VLAN ID,将会被删除掉。
  • 是主VLAN:如果从这个接口进来的数据包没有任何标记,就认为他是这个VLAN ID的。

划分
#

我的想法是,.1的网段分配给熟悉的设备上网,.2的网段分配给物联网设备,.3的网段分配给访客网络。

所以我在设备上的br-lan的网桥VLAN过滤是这么配置的:

VLAN Settings

这个本地指的是路由器的CPU可以识别这个VLAN的内容,从而对它进行设置DHCP服务器之类的操作。

路由器有三个口,我全部分配给了VLAN1,同时设置为主VLAN接口(显示为*),这是因为我大概不会在这上面接物联网设备(因为都是2.4G的设备)和插入访客的网线。

这时候在接口里面就可以看到这些虚拟的VLAN设备了,为它们设置DHCP服务器,防火墙,保存。

在无线里面,可以创建很多个同频段的SSID(不会有人才知道吧),但是信道是一样的,接口配置里面可以选择关联的网络,这里选上你设置防火墙的接口,这时候通过这个SSID收到的数据就会自动地被交换机打上VLAN ID了。

在防火墙里面可以做更加细致的管理,比如使用conntrack,只允许LAN区段的设备主动发起到IOT设备的连接,隔离访客网络和信任网络的区段,非常灵活。

这时原有配置使用br-lan的应用,记得修改为br-lan.1

这里有一个我刚开始不明白的问题: 外部网络根本不识别VLAN ID,那么转发到WAN的流量为什么会自动把VLAN头给去掉呢?

其实不是主动去掉的,因为VLAN是二层的东西,路由(三层)和VLAN是两个相对独立的过程,跨局域网的时候需要换二层封装,所以VLAN ID自然没有了。