添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
稳重的肉夹馍  ·  Jump statements - ...·  1 年前    · 
胆小的咖啡  ·  java - Mail server ...·  3 年前    · 
坚韧的冲锋衣  ·  设置导航栏 ...·  3 年前    · 
首发于 I Object
OpenWRT和DD-WRT一起上,VLAN解决家里的IPTV问题

OpenWRT和DD-WRT一起上,VLAN解决家里的IPTV问题

写这篇记录是因为被DD-WRT的文档坑了一晚上,把心得写出来供有类似需要的人参考。

我家里的网络拓朴是这样:

(图是用 ditaa.sourceforge.net/ 生成的,非常方便)

  • 光猫: 电信的华为HG8120C EPON。双以太网口,一个供WAN(internet)用,一个供IPTV用
  • Netgear WNDR3700v4: 某东上299特价时入的,刷了DD-WRT,主路由,PPPoE拨号,DHCP server,二楼的wifi接入覆盖。
    • WAN口连到光猫的internet网口
    • 一个LAN口连到光猫的IPTV网口
    • 一个LAN口连到客厅的TPLink WR1041N
    • 其余LAN口接PC等等
  • TPLink WR1041N: 刷的OpenWRT,客厅的wifi覆盖和LAN接入。
    • 一个LAN口接到WNDR3700v4
    • 一个LAN接电信的IPTV机顶盒
    • 其余LAN口接NAS,电视和小米盒子
    • 数一数是不是有五个LAN口?因为我只需要WR1041N作为纯粹的千兆交换机和无线AP,所以在OpenWRT里把WAN口也 配置成普通的LAN口 了。

关于我家这个略为奇葩的配置,在我另一篇blog《 终于解决IPTV影响wifi性能的问题 》里有提到过,只是设备稍有变化。IPTV机顶盒本来需要单独一根网线连光猫,但从光猫到客厅只有一条千兆网线,我又不想用无线桥接或者电力猫,所以IPTV和客厅的其他网络设备必须共用一条网线。

因为我们这里电信的IPTV使用PPPoE认证,所以我这样的拓朴事实上能够基本正常工作——上面提到的blog里解释了一些细节。对了,这种接法用WNDR3700v4的官方固件行不通,WAN连接会直接断了。WNDR3700v4刷DDWRT,以及原来用Linksys EA2700都可以工作。

长话短说,虽然能工作,但因为IPTV的数据是向组播地址广播,在我家网络里造成的直接影响就是——只要看IPTV直播节目,视频流会同时在三个WiFi AP(WNDR3700v4的2.4G + 5G, WR1041N的2.4G)上广播,严重影响家里其他无线终端的网络性能。比如一个高清CCTV5,就是10Mbps的数据流同时在三个AP上广播,蔚为壮观。

以前我的主路由是Linksys EA2700,当时还没有第三方固件,我的解决办法是在WR1041N上打开IGMP snooping,至少能解决一个WiFi AP的广播。最近把EA2700换成了3700v4,就准备刷上OpenWRT或DDWRT,一劳永逸的用VLAN解决IPTV的问题。

思路很简单,在WR1041N上把连接IPTV的网口划到一个VLAN(记编号为m),连接3700v4的LAN口作为trunk port,其余设备用的LAN口划到另一个VLAN(记编号为n) 。类似的,在3700v4上把连接光猫的LAN口划到VLAN m,连接WR1041N的LAN口作为trunk port,其他LAN口划为VLAN n。

WR1041N跑的是OpenWRT,一直相当稳定,修改VLAN配置也简单。下面是过程:

root@OpenWrt:/etc/config# swconfig dev switch0 help
switch0: ag71xx-mdio.0(Atheros AR8327), ports: 7 (cpu @ 0), vlans: 128

先跑swconfig help,得知一共有7个LAN口,其中CPU所用的内部LAN端口号是0。

root@OpenWrt:/etc/config# swconfig dev switch0 show | grep link
        link: port:0 link:up speed:1000baseT full-duplex txflow rxflow
        link: port:1 link:up speed:1000baseT full-duplex auto
        link: port:2 link:down
        link: port:3 link:up speed:1000baseT full-duplex auto
        link: port:4 link:up speed:100baseT full-duplex auto
        link: port:5 link:down
        link: port:6 link:down

对比一下我当时的设备连接情况,很容易知道port 1是WAN口(连接3700v4),port 2, 3, 4, 5分别是WR1041N上的1, 2, 3, 4号LAN口,其中port 4连接机顶盒。 port 6未用。

然后把/etc/config/network里原来的vlan配置改为:

	config switch_vlan 'lan_wifi'
	        option vlan '1'
	        option ports '0 1t 2 3 5'
	        option device 'switch0'
	config switch_vlan 'iptv'
	        option vlan '3'
	        option ports '1t 4'
	        option device 'switch0'

VLAN 1是NAS,电视等等用的普通VLAN,VLAN 3划给IPTV用。修改完成后 /etc/init.d/network restart 即可。

然后是3700v4的配置。因为OpenWRT for 3700v4还是WIP,只能在论坛上下载网友们自行编译的版本,虽然我也自己编译了一个,但稳妥起见,还是可耻的先刷了有现成官方下载的DDWRT。

结果被DDWRT的官方VLAN配置文档坑了很久。根据 Switched Ports 上的指引折腾了半天,没有效果。然后才注意到 VLAN Support 里写了这么一段:

Only Broadcom based devices support port-based VLAN's, no Atheros or Ralink devices .

坑爹啊摔!Atheros方案跑DDWRT不支持按端口划分VLAN啊摔!!OpenWRT才支持啊!!!怪不得DDWRT的web管理界面里我都找不到VLAN,原来只在Broadcom方案的路由上才会出现。

不过还好,原来只是官方文档疏于更新,其实DDWRT已经在几个月前加入了port based vlan的支持。根据 Using VLANs and VPN with DD-WRT 的善心分享(这是目前唯一能找到的关于DDWRT Atheros VLAN配置的文章),从命令行下配置其实非常简单:

root@DD-WRT:~# swconfig dev eth0 help
switch0: ag71xx-mdio.0(Atheros AR8327), ports: 7 (cpu @ 0), vlans: 128

同样先用swconfig help查看,也是有7个LAN口,CPU的内部端口使用0号。

root@DD-WRT:~# swconfig dev eth0 show | grep port
        mirror_monitor_port: 0
        mirror_source_port: 0
        link: port:0 link:up speed:1000baseT full-duplex txflow rxflow
        link: port:1 link:up speed:100baseT full-duplex auto
        link: port:2 link:up speed:100baseT full-duplex auto
        link: port:3 link:up speed:1000baseT full-duplex auto
        link: port:4 link:up speed:1000baseT full-duplex auto
        link: port:5 link:up speed:100baseT full-duplex auto
        link: port:6 link:down

根据我当时的联网情况,判断出port 5是WAN口(连光猫),port 4,3,2,1分别是3700v4的LAN口1,2,3,4。port 6未用。

查看修改之前的VLAN配置:

root@DD-WRT:~# swconfig dev eth0 show
[snip]
VLAN 1:
        vid: 1
        ports: 0t 1 2 3 4
VLAN 2:
        vid: 2
        ports: 0t 5

VLAN 1是LAN口们,VLAN 2是WAN。其中port 3是连到WR1041N,port 2连到光猫的IPTV网口。只需要下面几条命令,就可以完成我需要的修改:

root@DD-WRT:~# swconfig dev eth0 set enable_vlan 1
root@DD-WRT:~# swconfig dev eth0 vlan 1 set ports "0t 1 3 4"
root@DD-WRT:~# swconfig dev eth0 vlan 3 set ports "2 3t"
root@DD-WRT:~# swconfig dev eth0 show
[snip]
VLAN 1:
        vid: 1
        ports: 0t 1 3t 4
VLAN 2: